STM32CubeMX+ADC_DMA多通道配置连续采样 (STM32G071)(无需中断+LL库配置)

本文详细描述了如何使用LL库在STM32G071G8单片机上配置ADCDMA实现无中断连续采样,包括ADC通道选择、同步时钟配置、DMA设置以及代码生成和校准过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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温度值。

不过这个问题研究了好一段时间也没发现什么问题,以后如果发现解决方法就回来记录一下,当然如果有大佬知道什么情况也可以在评论区给我留言。

至此这个配置方法就结束了。

### STM32CubeMX L4 ADC多通道 LL 配置 示例 在使用STM32CubeMX配置L4系列微控制器的ADC多通道时,LL(Low Layer)提供了更底层的访问方式,能够实现更高性能和更灵活的控制[^3]。以下是一个完整的示例,展示如何通过LL配置ADC进行多通道采样。 #### 1. 初始化ADC 初始化过程包括设置ADC的时钟源、分辨率、数据对齐方式等参数。以下代码展示了如何使用LL初始化ADC模块: ```c // 启用ADC时钟 LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC); // 配置ADC公共寄存器 LL_ADC_SetCommonPathInternalRegul(&ADC1_COMMON, LL_ADC_PATH_INTERNAL_NONE); // 配置ADC分辨率 LL_ADC_SetResolution(ADC1, LL_ADC_RESOLUTION_12B); // 设置数据对齐方式为右对齐 LL_ADC_SetDataAlignment(ADC1, LL_ADC_DATA_ALIGN_RIGHT); ``` #### 2. 配置常规通道 通过LL可以配置多个输入通道,并指定每个通道的采样时间。以下代码展示了如何配置两个通道(例如通道1和通道2): ```c // 配置通道1的采样时间为1.5个ADC时钟周期 LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_1, LL_ADC_SAMPLINGTIME_1CYCLE_5); // 配置通道2的采样时间为1.5个ADC时钟周期 LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_2, LL_ADC_SAMPLINGTIME_1CYCLE_5); // 启用通道1和通道2 LL_ADC_EnableChannel(ADC1, LL_ADC_CHANNEL_1); LL_ADC_EnableChannel(ADC1, LL_ADC_CHANNEL_2); ``` #### 3. 启动ADC转换 启动ADC转换可以通过软件触发或外部触发等方式完成。以下代码展示了如何通过软件触发启动单次转换模式: ```c // 设置ADC工作在单次转换模式 LL_ADC_REG_SetSequencerLength(ADC1, LL_ADC_SEQ_SCAN_DISABLE); // 禁用扫描模式 LL_ADC_REG_SetTriggerSource(ADC1, LL_ADC_REG_TRIG_SOFTWARE); // 使用软件触发 // 启动ADC转换 LL_ADC_StartConversionSWStart(ADC1); ``` #### 4. 读取转换结果 在转换完成后,可以通过轮询的方式读取转换结果。以下代码展示了如何读取通道1和通道2的转换值: ```c // 等待转换完成 while (!LL_ADC_IsActiveFlag_EOS(ADC1)) {} // 清除转换完成标志 LL_ADC_ClearFlag_EOS(ADC1); // 读取通道1的转换结果 uint32_t adcValue1 = LL_ADC_REG_ReadConversionData32(ADC1); // 读取通道2的转换结果 uint32_t adcValue2 = LL_ADC_REG_ReadConversionData32(ADC1); ``` #### 5. 连续转换模式 如果需要连续采样多个通道,可以启用连续转换模式并配置扫描顺序。以下代码展示了如何启用连续转换模式: ```c // 设置ADC工作在连续转换模式 LL_ADC_REG_SetSequencerLength(ADC1, LL_ADC_SEQ_SCAN_ENABLE_2RANKS); // 启用2个通道的扫描 LL_ADC_REG_SetTriggerSource(ADC1, LL_ADC_REG_TRIG_SOFTWARE); // 使用软件触发 // 启用连续转换模式 LL_ADC_REG_SetContinuousMode(ADC1, LL_ADC_REG_CONV_CONTINUOUS); // 启动ADC转换 LL_ADC_StartConversionSWStart(ADC1); ``` ### 注意事项 - 在使用LL时,需确保正确配置时钟树以满足ADC的时钟要求[^3]。 - 如果使用DMA传输数据,需要额外配置DMA控制器并与ADC外设关联[^1]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值