硬件条件
核心板:stm32f103ret6 LQFP64封装;如下图:
stm32库文件:使用stm32标准库;
ADC通道数:10路,具体用到的IO口资源如下。
使用到了GPIOA,GPIOB,GPIOC。
GPIO初始化
打开总线时钟,设置对应引脚为模拟输入。
ADC初始化
GPIO对应那个ADC通道,可查看对应芯片的官方参考手册。如下
DMA初始化
设置DMA中断的中断优先级
ADC1对应DMA通道数可参考
由于我开启了DMA传输完成中断,处理DMA_Channel1的中断处理函数
所以,每当中断发生的时候,ADC1_Converted_Value[ADC_NUMOFCHANNEL]已经获取到10个通道的数据。最后,对这些数据进行进一步的处理。
当然,开启dma传输中断不是处理adc数据的明智选择,因为这样会每顺序转化完一组序列就会产生一次中断,单片机就会去处理中断,发生的dma中断频次非常高,如果加了操作系统,会大大影响任务的执行时间,毕竟,使用操作系统就得尽可能避免少得开启中断,更何况是频次这么高的中断。更常用的方式是,增加dma内存基地址的大小,比如我的adc转化数为10个通道,我可以设置一个二维数组adcDmaBuffer[10][10],然后设置一个1ms的软件或硬件定时器(具体选择看系统需求),每间隔1ms再去对这组数据序列求平均的方式,这样可以获得更稳定更易于后续处理的adc数据。