Предполагая, что вы звоните 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++;
}
}
}
Спасибо за ваш комментарий. Теперь я читаю значение adc, но когда я использовал оператор IF в примере кода, значение ADC не было прочитано. Можете ли вы объяснить функцию HAL_ADC_PollForConversion()? – king