• 正文
  • 相关推荐
申请入驻 产业图谱

STM32 三 ADC 同步模式:CubeMx 错误配置修复与数据采集优化

15小时前
315
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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段添加如下代码:

// ADC1 JAUTO位清零(若注入组涉及ADC1,需同步修改)
MODIFY_REG(hadc1.Instance->CR1, ADC_CR1_JAUTO, 0);
// ADC2 JAUTO位清零(核心修复)
MODIFY_REG(hadc2.Instance->CR1, ADC_CR1_JAUTO, 0);
// ADC3 JAUTO位清零(核心修复)
MODIFY_REG(hadc3.Instance->CR1, ADC_CR1_JAUTO, 0);
  • 原理:ADC_CR1_JAUTO是 ADC 控制寄存器 1 中的自动注入位,写 0 即可禁用自动注入模式,恢复外部触发控制。

4.2 初始化启动代码

主函数中按如下顺序启动外设,确保同步逻辑生效:

// 启动注入组(ADC2/3普通启动,ADC1开启中断)
HAL_ADCEx_InjectedStart(&hadc2);
HAL_ADCEx_InjectedStart(&hadc3);
HAL_ADCEx_InjectedStart_IT(&hadc1);

// 启动三ADC同步+DMA传输
HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t *)ADC_Value, 180);

// 启动触发定时器(PWM输出用于测试触发频率)
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

5. 实战验证:配置有效性确认

  • 正常表现:修改定时器计数值模拟触发冲突时,ADC1/2/3 规则组数据均无 0x000 或 0xFFF,注入组数据实时更新;
  • 数据校验:通过调试器查看ADC_Value数组,元素按 “ADC1→ADC2→ADC3” 顺序循环,数值在合理范围(非极端值)。

6. 开发经验小结

  1. 组合模式选择:三 ADC 同步需明确 “规则组 + 注入组同时工作”,避免误选单一组合模式;
  2. DMA 数组大小:必须为 9 的倍数,否则会导致数据错位或 DMA 传输溢出;
  3. 版本兼容:CubeMx V6.12 及以前版本必加 JAUTO 位清零代码,后续版本需先检查界面是否支持关闭自动注入模式;
  4. 触发隔离:规则组与注入组需使用不同定时器触发,避免同一定时器触发导致的时序冲突。

相关推荐