假设你在进入while循环之前调用了HAL_ADC_Start(&hadc1)。
基本上可以在while 循环中调用你的代码,但我有一些意见。
确保ADCValue 变量为uint32_t 或至少为uin16_t,因为HAL_ADC_GetValue 的return value 为uint32_t。如果 ADC 的分辨率高于 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*,因此在传递给HAL_UART_Transmit 时应该将其转换为uint8_t*。而uint32_t 是 4 字节,第三个参数应该是 4。
如果你想发送str,你也应该在发送之前计算它的正确长度。
顺便说一下,这里有一个来自 STM32 HAL ADC Tutorial 的 ADC 示例。
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++;
}
}
}