STM32CubeMX使用(四)之DMA方式使用ADC
一、概述
本文记录下ADC的使用过程,主要是后续使用,能有个参考。同样,以后遇到的ADC问题,也都收录在本文后面。 芯片: STM32G0B1RCT6
二、Pinout&Configuration
2.1 选择端口
2.2 开启DMA中断
三、测试ADC
测试代码可参考demo工程,同样是DMA方式: 主要步骤为:
- 定义采集值缓存
- 开启ADC校准
- 开启DMA功能*。
- 主循环内重复开启ADC转换并打印采集结果:
- 发现打印结果如下,每次只转换了一个通道: 开启ADC后1S还不够采集完成吗?
- 回到demo中查看,是在回调函数中设置标志,然后在主循环中判断标志才进行打印。 修改后果然正常了: 这样看来每次开启ADC,只转换了一个通道。CubeMX设置有些问题。使能了scan扫描模式,应该会转换完所有通道吧?回头再看下。
注意:HAL_ADC_Start_DMA后,不要使用立即调用HAL_ADC_Start。
2021-12-9补充:
- 前面混合使用了HAL_ADC_Start_DMA和HAL_ADC_Start,是有些问题的。可以只使用HAL_ADC_Start_DMA,但要注意,不能重复调用,每次转换完要先使用HAL_ADC_Stop_DMA关闭。
- 修改cube设置 转换完所有通道后关闭ADC。
四、遇到的问题
1.使用N32G031C8开发板,采集channel1和channel8两路ADC。发现只给channel1输入2V电压,channel8采集值也随之改变。两次采集之间也增加了500ms延时,是什么原因呢? 暂时没有细究。开发板只是把IO直接引出来方便测试,并没有包含外围分压电路。在channel8也输入一路电压,可以看到channel1和channel8都能够正常采集了。
