RT:这个帖子是用于记录如何使用LL库配置STM32G071G8单片机的ADC DMA多通道连续采样模式(无中断)
首先打开cubeMX,新建工程,选择STM32G071G8:然后配置好时钟选项,接下来开始配置ADC和DMA选项。
0.选择需要测量的ADC通道
1.选择同步时钟分频/2
2.选择 不完全配置序列模式
3.扫描方向是 向前扫描模式
4.打开连续转换模式
5.打开DAM连续转换请求(注意:默认此功能是不能打开的,需要去配置DMA设置,再回来打开这个选项)
6.选择ADC序列转换时间
至此ADC的配置就结束了,接下来配置DMA。
1.点击DMA设置选项卡
2.点击添加按钮,选择ADC1和DMA通道 CH1,也可以选其他,这个MCU有DMA MUX功能模块可以把外设挂在其他通道上,选择优先级为高
3.DMA模式选择 环形,外设地址和内存地址选半字即可
至此DMA配置基本完成,接下来就是代码生成
1.ADC初始化选择LL库,DMA默认不动,因为ADC选择了LL库ADC的DMA是会自动使用LL库进行配置,点击生成代码,接下来补全以下代码。
1.补全ADC的初始化里面外设地址设置,存储结果数组地址设置,存储结果数组的长度设置
ADC的结果存储数组:
LL_DMA_SetPeriphAddress(DMA1,LL_DMA_CHANNEL_1,LL_ADC_DMA_GetRegAddr(ADC1,LL_ADC_DMA_REG_REGULAR_DATA));
LL_DMA_SetMemoryAddress(DMA1,LL_DMA_CHANNEL_1,(uint32_t)&ADC_Result);
LL_DMA_SetDataLength(DMA1,LL_DMA_CHANNEL_1,sizeof(ADC_Result)/2);
最后这里补全ADC启动前的准备配置:
1.启动ADC校准,并等待校准完成
2.打开ADC电源,并等待ADC启动完成
3.打开DMA通道
4.开始ADC规则转换
LL_ADC_StartCalibration(ADC1);
while (LL_ADC_IsCalibrationOnGoing(ADC1));
LL_ADC_Enable(ADC1);
while (!LL_ADC_IsEnabled(ADC1));
LL_DMA_EnableChannel(DMA1,LL_DMA_CHANNEL_1);
LL_ADC_REG_StartConversion(ADC1);
最后一步编译运行,打开debug调试查看ADC存储结果数组:
结果输出完美,不需要中断处理大大减轻的MCU负载,这个过程是全硬件处理完成。
唯一的美中不足是有一个小问题,就是通道顺序和存储结果数组不是对应的
在这个数组里面0号成员是MCU温度值,1号成员对应了ADC CH1,2号成员对应ADC CH2
我原本想要效果是0号成员对应ADC CH1,1号成员对应ADC CH2,2号成员对应MCU温度值。
不过这个问题研究了好一段时间也没发现什么问题,以后如果发现解决方法就回来记录一下,当然如果有大佬知道什么情况也可以在评论区给我留言。
至此这个配置方法就结束了。