STM32 三 ADC 同步模式(Triple combined)可实现三路信号同时采样,规则组配合 DMA 高效传输数据,注入组快速存储关键信号,但 CubeMx V6.12 及以前版本存在默认配置缺陷(ADC2/3 JAUTO 位自动置 1),会导致规则组采样数据错误(出现 0x000 或 0xFFF),核心修复方案是初始化后通过代码强制清零 JAUTO 位。
资料获取:开发经验 | LAT1474 三个 ADC同步模式配置以及CubeMx错误配置解决方法
1. 核心配置要点:三 ADC 同步模式基础部署
三 ADC 同步的核心是通过ADCs_Common_Settings配置组合模式,搭配定时器触发和 DMA 传输,实现多路信号同步采集。
1.1 应用场景定义
- 采集需求:规则组(普通信号)用 DMA 批量传输,注入组(关键信号)直接存储至 JDR 寄存器;
- 硬件配置:ADC1/2/3 各分配 3 个规则通道、2 个注入通道,TIM2 触发规则组,TIM1 触发注入组。
1.2 CubeMx 关键配置步骤
(1)通道与组合模式配置
- GPIO 配置:将 ADC1_15、ADC2_2、ADC3_1 等通道设为 Analog 模式;
- 公共设置:ADC1 的
ADCs_Common_Settings选择「Triple combined regular simultaneous+injected simultane」(三 ADC 同步,规则组 + 注入组同时工作); - 时钟与分辨率:ADC 时钟分频设为 PCLK2/4,分辨率 12 位(15 个 ADC 时钟周期),数据右对齐。
(2)触发源配置
- 规则组:外部触发源选择「Timer 2 Trigger Out event」,上升沿触发;
- 注入组:外部触发源选择「Timer 1 Trigger Out event」,上升沿触发;
- 模式禁用:关闭连续转换模式(Continuous Conversion Mode)和间断转换模式(Discontinuous Conversion Mode)。
(3)DMA 配置(规则组专用)
- 通道选择:ADC1 → DMA2 Stream 0,方向「Peripheral To Memory」;
- 关键参数:优先级设为 Low,地址模式「Memory Increment」(内存递增)、「Circular」(循环模式),数据宽度均为 Half Word(16 位);
- 数组大小:DMA 接收数组需为 9 的倍数(3 个 ADC× 每个 ADC3 个规则通道),示例定义
uint16_t ADC_Value[180](支持 20 次完整同步采集)。
2. 数据存储规则:DMA 数组与通道对应关系
规则组同步采样后,DMA 按固定顺序存储各 ADC 通道数据,数组索引与通道的对应逻辑如下:
- 索引 0:ADC1_CH15(第一个 ADC1 规则通道)
- 索引 1:ADC2_CH2(第一个 ADC2 规则通道)
- 索引 2:ADC3_CH1(第一个 ADC3 规则通道)
- 索引 3:ADC1_CH15(第二个 ADC1 规则通道)
- 索引 4:ADC2_CH3(第二个 ADC2 规则通道)
- 索引 5:ADC3_CH12(第二个 ADC3 规则通道)
- 后续索引按 “ADC1→ADC2→ADC3” 顺序循环,依次存储各 ADC 的规则通道数据。
3. CubeMx 错误配置:JAUTO 位导致的采样异常
3.1 异常现象与触发条件
- 错误表现:注入组采样正常、ADC1 规则组数据正常,ADC2/3 规则组出现 0x000 或 0xFFF 无效数据;
- 触发场景:修改定时器初始计数值,模拟 “注入采样打断规则采样” 时,异常必现。
3.2 错误根源解析
CubeMx V6.12 及以前版本在三 ADC 模式下,默认将 ADC2 和 ADC3 的「Auto-injection(JAUTO)」位设为 1,该配置存在两大冲突:
- JAUTO 位功能:置 1 后,注入组转换会自动跟随在规则组之后执行,无需外部触发;
- 冲突点:手动配置了注入组的定时器触发(外部触发),与自动注入模式冲突,导致 ADC2/3 规则组采样时序错乱。
4. 修复方案:代码强制清零 JAUTO 位
由于 CubeMx 界面无法修改三 ADC 模式下的 JAUTO 位,需在 ADC 初始化后添加寄存器操作,强制关闭自动注入模式。
4.1 关键代码修改
在MX_ADC1_Init()、MX_ADC2_Init()、MX_ADC3_Init()函数的USER CODE BEGIN ADCx_Init 2段添加如下代码:
- 原理:
ADC_CR1_JAUTO是 ADC 控制寄存器 1 中的自动注入位,写 0 即可禁用自动注入模式,恢复外部触发控制。
4.2 初始化启动代码
主函数中按如下顺序启动外设,确保同步逻辑生效:
5. 实战验证:配置有效性确认
- 正常表现:修改定时器计数值模拟触发冲突时,ADC1/2/3 规则组数据均无 0x000 或 0xFFF,注入组数据实时更新;
- 数据校验:通过调试器查看
ADC_Value数组,元素按 “ADC1→ADC2→ADC3” 顺序循环,数值在合理范围(非极端值)。
6. 开发经验小结
- 组合模式选择:三 ADC 同步需明确 “规则组 + 注入组同时工作”,避免误选单一组合模式;
- DMA 数组大小:必须为 9 的倍数,否则会导致数据错位或 DMA 传输溢出;
- 版本兼容:CubeMx V6.12 及以前版本必加 JAUTO 位清零代码,后续版本需先检查界面是否支持关闭自动注入模式;
- 触发隔离:规则组与注入组需使用不同定时器触发,避免同一定时器触发导致的时序冲突。
阅读全文
315