我是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);
}
答案 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个字节。如果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
的{{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函数之后停止会稍微更优雅一些,但我保留了这段代码的正常工作。