gpt4 book ai didi

c - STM32,读取ADC值并使用UART传输(HAL库)

转载 作者:行者123 更新时间:2023-11-30 16:51:47 25 4
gpt4 key购买 nike

我是STM32(L476RG)的新用户。到目前为止我已经用Arduino做了一些工作。现在,我想读取 ADC 值并通过 UART 传输该值。我设置了硬件部分和初始软件配置部分。我想知道,while循环中的这部分代码是否正确?

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

最佳答案

假设您在进入 while 循环之前调用HAL_ADC_Start(&hadc1)。基本上,在 while 循环中调用代码是可以的,但我有一些评论。

确保 ADCValue 变量为 uint32_t 或至少为 uin16_t return value HAL_ADC_GetValue 的值为 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 个字节。如果 ADCValueuint32_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,您还应该在发送之前计算其正确的长度。

顺便说一下,这里有一个 ADC 示例 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++;
}
}
}

关于c - STM32,读取ADC值并使用UART传输(HAL库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41591548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com