首先需要用CubeMX配置STM32,除了基础的系统的配置之外,可以打开UART串口通讯,便于后续将采样值传输至上位机,便于调试(注:串口需要打开异步通信,配置相应的波特率,可以打开DMA和串口中断,其余配置保持默认即可)。
之后便是配置ADC,考虑到后续需要将输入信号的采样值用FFT处理,因此ADC的采样值需要保存到一个缓冲区,不妨称之为ADC_Buffer[NPT],NPT-是你对信号的采样点数,一般使用1024个点(采样点数过小会导致相邻的采样点数之间间隔时间太长;而采样点数过多需要占用单片机太多的资源,很大概率会导致单片机的编译报错:No space...)。考虑到上述ADC采样的种种需求,对于单通道采样来说,ADC的配置保持为原来的默认即可,只需要将ADC的触发从软件触发改成TIM定时器触发并且开启DMA搬运即可。
因为FFT需要一组时域上的数据,因此DMA设置为Normal模式-ADC采样完成后便结束DMA搬运,搬运数据大小改为Word,至此DMA和ADC的设置已经完成了。
上面ADC的设置中我们需要用到定时器来触发ADC采样,简单来说就是设置一个定时器闹钟,每次定时器响了就让ADC去采样一次,那么你采样的速度(或者说频率更好)取决于你定时器设置的时间,因此在TIM的配置中,预分频和自动重装值的设置需要根据你采样的信号的频率来设置。然后你要让ADC知道你的定时器响了再去采样,因此你需要让TIM每次到点后发出一个信号,这里我们配置Update Event方便触发ADC采样。最后我们只需要打开ADC、DMA、TIM的中断即可完成全部的配置。
全过程逻辑为:开启ADC的DMA搬运模式,因为ADC的采样需要TIM的触发,因此当前不会有任何的数据;之后打开TIM的同时,ADC自动开始采样直到你存储数据的Buffer满了,之后就会进入到你的ADC的完成中断回调函数中,在这里面建议关闭DMA采样然后设置标志位告诉主程序可以进行数据的处理。
以上就是ADC+DMA+TIM触发的采样步骤,这也是FFT前最重要的数据准备工作。