STM32 ADC转换结果在ADCx->DR寄存器中,这个寄存器是一个32位的寄存器,但是只有16bit可用。
下方以L4的RM0394文档为例,其他类似:
为了客观,不管L4,编辑一下帖子,下方的截图是F4的RM0090文档的DR寄存器:
在HAL库中,读取ADC转换结果提供的接口函数是HAL_ADC_GetValue,返回的是uint32,你可以根据你设置的左对齐/右对齐方式,将结果移位到你需要的uint8_t变量即可。
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
{
/* Return the selected ADC converted value */
return hadc->Instance->DR;
}
在LL库中,其实也没啥区别,10位/8位/6位分辨率,都是返回的uint16_t
__STATIC_INLINE uint16_t LL_ADC_REG_ReadConversionData10(ADC_TypeDef *ADCx)
{
return (uint16_t)(READ_BIT(ADCx->DR, ADC_DR_DATA));
}
__STATIC_INLINE uint8_t LL_ADC_REG_ReadConversionData8(ADC_TypeDef *ADCx)
{
return (uint16_t)(READ_BIT(ADCx->DR, ADC_DR_DATA));
}
__STATIC_INLINE uint8_t LL_ADC_REG_ReadConversionData6(ADC_TypeDef *ADCx)
{
return (uint16_t)(READ_BIT(ADCx->DR, ADC_DR_DATA));
}
结论:你可以将转换结果放入到uint8_t变量中。但是自己要根据左/右对齐方式,将接口函数读取出来的uint16_t/uint32_t移位处理一下,再赋值给uint8_t的变量即可。
STM32 ADC转换结果在ADCx->DR寄存器中,这个寄存器是一个32位的寄存器,但是只有16bit可用。
下方以L4的RM0394文档为例,其他类似:
为了客观,不管L4,编辑一下帖子,下方的截图是F4的RM0090文档的DR寄存器:
在HAL库中,读取ADC转换结果提供的接口函数是HAL_ADC_GetValue,返回的是uint32,你可以根据你设置的左对齐/右对齐方式,将结果移位到你需要的uint8_t变量即可。
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
{
/* Return the selected ADC converted value */
return hadc->Instance->DR;
}
在LL库中,其实也没啥区别,10位/8位/6位分辨率,都是返回的uint16_t
__STATIC_INLINE uint16_t LL_ADC_REG_ReadConversionData10(ADC_TypeDef *ADCx)
{
return (uint16_t)(READ_BIT(ADCx->DR, ADC_DR_DATA));
}
__STATIC_INLINE uint8_t LL_ADC_REG_ReadConversionData8(ADC_TypeDef *ADCx)
{
return (uint16_t)(READ_BIT(ADCx->DR, ADC_DR_DATA));
}
__STATIC_INLINE uint8_t LL_ADC_REG_ReadConversionData6(ADC_TypeDef *ADCx)
{
return (uint16_t)(READ_BIT(ADCx->DR, ADC_DR_DATA));
}
结论:你可以将转换结果放入到uint8_t变量中。但是自己要根据左/右对齐方式,将接口函数读取出来的uint16_t/uint32_t移位处理一下,再赋值给uint8_t的变量即可。
举报