2017-01-11 23 views
1

Я новый пользователь STM32 (L476RG). До сих пор я работал с Arduino. Теперь я хочу прочитать значение ADC и передать это значение с помощью UART. Я устанавливаю аппаратную часть и начальную часть конфигурации программного обеспечения. Я хочу знать, эта часть кода в цикле while верна?STM32, чтение значения ADC и передача с использованием UART (библиотека HAL)

if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK) 
{ 
    ADCValue = HAL_ADC_GetValue(&hadc1); 
    sprintf(str, "%d", ADCValue); 
    HAL_UART_Transmit(&huart2,ADCValue,1,100); 
} 

ответ

1

Предполагая, что вы звоните HAL_ADC_Start(&hadc1) перед входом в цикл while. В принципе, это нормально, чтобы позвонить вам код в цикле while, но у меня есть несколько замечаний.

Убедитесь, что ADCValue переменная uint32_t или, по крайней мере, uin16_t как return value из HAL_ADC_GetValue является uint32_t. Если разрешение АЦП выше 8 бит, то 1 байт будет недостаточно для сохранения результата.

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); 

HAL_UART_Transmit ожидает uint8_t* в качестве второго параметра, учитывая ваш код пройти простую переменную. Вы должны использовать оператор & до ADCValue и направить его на uint8_t*. Также он отправляет только 1 байт в ваш код, основываясь на третьем параметре. Если ADCValue - uint32_t, тогда вы должны изменить этот параметр на 4. Также обратите внимание, что вы отправляете исходное значение байта, а не ASCII. В целом:

uint32_t ADCValue; 

if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK) 
{ 
    ADCValue = HAL_ADC_GetValue(&hadc1); 
    sprintf(str, "%d", ADCValue); 
    HAL_UART_Transmit(&huart2, (uint8_t*)(&ADCValue), 4, 100); 
} 

(&ADCValue) возвращает адрес ADCValue который является uint32_t* поэтому он должен быть преобразован в uint8_t* при переходе к HAL_UART_Transmit. А поскольку uint32_t - 4 байт, третьим параметром должно быть 4.

Если вы хотите отправить str, вы должны высчитать его правильную длину перед отправкой.

Кстати, вот пример АЦП из этого STM32 HAL ADC Tutorial.

uint32_t g_ADCValue;  
int g_MeasurementNumber; 


int main(void) 
{ 
    HAL_Init(); 
    SystemClock_Config(); 
    ConfigureADC(); 

    HAL_ADC_Start(&g_AdcHandle); 
    for (;;) 
    { 
     if (HAL_ADC_PollForConversion(&g_AdcHandle, 1000000) == HAL_OK) 
     { 
      g_ADCValue = HAL_ADC_GetValue(&g_AdcHandle); 
      g_MeasurementNumber++; 
     } 
    } 
} 
+0

Спасибо за ваш комментарий. Теперь я читаю значение adc, но когда я использовал оператор IF в примере кода, значение ADC не было прочитано. Можете ли вы объяснить функцию HAL_ADC_PollForConversion()? – king