今天在解决这个小要求的时候碰到很多问题
1.STM32CubeMX配置
首先是勾选配置,基础配置时钟和调试引脚就不赘述了
勾选ADC1,需要使用多少通道勾选多少通道
注意配置Rank的通道,和根据需求配置采样时间,正常情况下采样时间越长精度越好
Number Of Conversion 勾选多少通道就是多少
外部触发转换源设置为定时器溢出触发
添加DMA,配置循环模式,使用半字长度
定时器配置采样频率,这里需要根据实际需求,ADC转换时间来确定,两次触发时间间隔最好大于转换时间
根据需求配置调试设备(这里选择串口输出采集的电压)
生成代码即可
二、CubeMX的BUG
笔者的版本为6.3.0 生成的代码中DMA的初始化在ADC初始化之前会导致电压只采集一次后程序崩溃,原因不明,笔者猜测可能由于不同的硬件架构和外设依赖关系。在某些情况下,特定的初始化顺序可能是由硬件设计决定的,违反这些顺序可能导致硬件故障或不稳定。
修改为先初始化DMA后初始化ADC即可
三、添加代码
while(HAL_ADCEx_Calibration_Start(&hadc1)!=HAL_OK);
while(HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_Value,8)!=HAL_OK);
HAL_TIM_Base_Start(&htim3);
添加在主循环之前
-
while(HAL_ADCEx_Calibration_Start(&hadc1)!=HAL_OK);
:这行代码启动ADC1的校准过程,并等待其完成。这是ADC初始化过程的一部分,通常在ADC其他配置之前进行。 -
while(HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_Value,8)!=HAL_OK);
:这行代码启动ADC1的DMA传输。这里假定hadc1
(ADC1的句柄)和DMA通道都已经被正确配置。 -
开启定时器,根据设定的定时周期触发ADC
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
printf("%.3f \n",ADC_Value[0]*3.3/4096);
}
定义ADC转换完成回调函数,这里只打印第一个通道的电压值
有关如何使用标准输入输出库参考其他博主
有关采样频率,采样时间,的细节参考这里,后续更新采样正弦波的细节