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

时间:2017-01-11 12:54:41

标签: c stm32 uart adc hal

我是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);
}

2 个答案:

答案 0 :(得分:1)

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

确保ADCValue变量为uint32_t或至少uin16_t,因为HAL_ADC_GetValue的{​​{3}}为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的{​​{1}}地址,因此在传递给uint32_t*时应将其转换为uint8_t*。并且因为HAL_UART_Transmit是4字节,所以第三个参数应该是4。

如果您想发送uint32_t,您应该在发送之前计算其正确的长度。

顺便提一下,这是return value的一个ADC示例。

str

答案 1 :(得分:-1)

作为最简单的解决方案,我要做的是强制ADC复位:

HAL_StatusTypeDef stat = HAL_ADC_PollForConversion(&hadc1, 900);

if (stat != HAL_OK)  {
    HAL_ADC_Stop(&hadc1);
    HAL_ADC_Start(&hadc1);
}

这应该比GetValue之前更早执行,然后我进行了不正确的操作。

P.S。抱歉,能见度很差

在GetValue函数之后停止会稍微更优雅一些,但我保留了这段代码的正常工作。