4. MCU内部ADC模块:STM32/GD32等常见MCU的ADC外设结构框图

ADC(模数转换器)是MCU内部将模拟电压信号转换为数字量的关键外设。以STM32/GD32系列为代表的ARM Cortex-M内核MCU,其ADC模块通常采用逐次逼近型(SAR)架构,具备多通道、可配置分辨率、触发源灵活以及DMA协同工作的能力。理解其内部结构框图,是进行采样时序配置与DMA传输调试的基础。

核心要点: ADC外设结构可划分为模拟前端、转换核心、控制逻辑、数据通路与触发同步五大模块。调试时需重点关注模拟看门狗阈值、采样时间寄存器(SMP)以及规则/注入组的数据对齐方式。

4.1 ADC外设整体架构

下图展示了STM32/GD32中典型ADC模块的内部结构框图。该图涵盖了从模拟输入到数字结果输出的完整数据路径,以及关键的同步与控制信号。

STM32/GD32 ADC 内部结构框图 ADC 外设内部结构框图(STM32/GD32) 模拟输入通道 ADC_IN0 ~ ADC_IN15 (16路外部通道) + 内部温度/Vrefint 通道选择 (规则/注入组) 采样保持 (采样电容) + SAR 转换核心 参考电压 Vref+ / Vref- 数据寄存器 规则组: DR 注入组: JDRx 模拟看门狗 (高/低阈值比较) 触发与同步控制 软件触发 定时器触发 (TIMx_TRGO) 外部引脚触发 (EXTI) ADC 时钟 (PCLK2 分频: 2/4/6/8) DMA 请求接口 (ADC_DR → DMA) 中断控制 (EOC/AWD/OVR) 说明: 规则组最多16通道,注入组最多4通道。DMA传输仅支持规则组数据。模拟看门狗可用于监测电压是否超出阈值。 采样时间由 SMP[2:0] 位控制,直接影响总转换时间:T_conv = 采样周期 + 12.5 个ADC时钟周期。

4.2 核心模块功能解析

根据上述结构框图,ADC外设可拆解为以下六大核心模块。每个模块在采样时序与DMA传输中扮演特定角色。

模块名称 功能描述 调试关注点
模拟输入通道 支持16路外部模拟输入(ADC_IN0~15)及内部信号(温度传感器、Vrefint)。 确认GPIO配置为模拟模式;检查输入阻抗是否匹配采样电容充电时间。
通道选择与分组 分为规则组(Regular Group)和注入组(Injected Group)。规则组用于常规连续/扫描转换;注入组支持抢占式转换。 规则组序列长度设置;注入组触发优先级配置。
采样保持与SAR核心 采样开关闭合期间对内部电容充电;SAR逻辑逐位逼近得到数字码。 采样时间(SMP)必须满足电容充电至0.5LSB以内;ADC时钟频率不能超过规格书上限(如STM32F1为14MHz)。
数据寄存器 规则组数据寄存器(DR)为32位,支持左/右对齐;注入组有4个独立寄存器(JDRx)。 数据对齐方式(ALIGN位);多通道扫描时DR会被覆盖,必须配合DMA读取。
触发与同步控制 支持软件触发、定时器TRGO事件、外部中断线触发。用于精确控制采样起始时刻。 触发边沿选择(上升沿/下降沿);定时器与ADC时钟域同步问题。
模拟看门狗(AWD) 将转换结果与预设的高/低阈值比较,超出范围则产生中断。 阈值寄存器(HTR/LTR)配置;中断服务函数中清除标志位。
调试经验: 在调试初期,建议先使用软件触发 + 单次转换模式验证单通道采样功能。确认数据寄存器(DR)能正确读取后,再切换到定时器触发和DMA传输,以降低问题排查的复杂度。

4.3 规则组与注入组的工作机制

规则组和注入组是STM32/GD32 ADC模块的特色设计,理解其区别对于多通道采样场景至关重要。

  • 规则组(Regular Group):
    • 最多可配置16个通道,按序列顺序依次转换。
    • 所有规则通道的转换结果共享一个数据寄存器(ADC_DR)。
    • 必须配合DMA使用,否则后一次转换结果会覆盖前一次。
    • 支持连续转换模式(CONT=1)和单次转换模式(CONT=0)。
  • 注入组(Injected Group):
    • 最多可配置4个通道,具有抢占优先级。
    • 每个注入通道拥有独立的数据寄存器(ADC_JDR1~4),无需DMA。
    • 注入组转换可以打断正在进行的规则组转换(注入模式)。
    • 通常用于需要高实时性采样的场景(如过流保护检测)。
规则组与注入组转换时序对比 规则组与注入组转换时序对比 规则组序列: CH0 CH1 CH2 CH3 DR (共享) DMA 注入组序列: INJ0 INJ1 INJ2 INJ3 JDR0~3 (独立) 关键区别: 规则组共享DR,必须用DMA读取;注入组每个通道有独立JDR,可直接读取。注入组可中断规则组转换。

4.4 时钟树与转换时间计算

ADC的转换时间直接影响采样率上限。STM32/GD32的ADC时钟源自APB2总线(PCLK2),通过可编程分频器得到ADC核心时钟(ADCCLK)。

常见错误: 初学者容易忽略ADC时钟频率上限。例如STM32F103的ADC最大时钟为14MHz,若PCLK2为72MHz,分频系数必须设置为6(72/6=12MHz)或8(72/8=9MHz),不能设置为4(72/4=18MHz,超限)。

转换时间计算公式如下:

总转换时间 T_conv = 采样周期 + 12.5 个 ADC 时钟周期

其中:
- 采样周期 = SMP[2:0] 配置值(1.5 / 7.5 / 13.5 / 28.5 / 41.5 / 55.5 / 71.5 / 239.5 个 ADC 时钟周期)
- 12.5 个周期为 SAR 逐次逼近固定耗时(12位分辨率时)

示例(STM32F103,ADCCLK=12MHz):
- 配置 SMP=7.5 周期
- T_conv = (7.5 + 12.5) / 12MHz = 20 / 12,000,000 ≈ 1.667 µs
- 对应采样率 ≈ 600 kHz

4.5 典型配置流程与寄存器速查

以下为初始化ADC(规则组+定时器触发+DMA)的标准寄存器操作流程,适用于STM32标准库/HAL库底层参考。

步骤 寄存器操作 说明
1. 时钟使能 RCC->APB2ENR |= RCC_APB2ENR_ADC1EN 使能ADC1时钟;同时使能对应GPIO时钟
2. 分频配置 RCC->CFGR |= RCC_CFGR_ADCPRE_DIV6 设置ADC分频系数(如72MHz/6=12MHz)
3. 采样时间 ADC1->SMPR2 |= ADC_SMPR2_SMP0_1 设置通道0采样周期(如7.5周期)
4. 规则序列 ADC1->SQR3 |= 0 设置规则序列第1位为通道0
5. 触发源 ADC1->CR2 |= ADC_CR2_EXTSEL_SRC 选择定时器TRGO作为外部触发
6. DMA使能 ADC1->CR2 |= ADC_CR2_DMA 使能ADC的DMA请求
7. 校准 ADC1->CR2 |= ADC_CR2_CAL 启动校准,等待CAL位清零
8. 使能ADC ADC1->CR2 |= ADC_CR2_ADON 使能ADC,等待稳定
调试检查清单:
  • 确认GPIO配置为模拟输入模式(GPIOx->CRL/CRH 或 MODER)。
  • 确认ADC时钟频率未超过芯片规格书最大值。
  • 确认采样时间(SMP)足够长,满足源阻抗要求(参考ADC输入阻抗匹配章节)。
  • 确认DMA请求使能位(DMA位)已置1,且DMA控制器配置正确。
  • 确认触发源配置正确,定时器已启动且产生TRGO事件。

4.6 常见问题与调试建议

  • 问题1:ADC转换结果始终为0或满量程。
    • 检查GPIO是否配置为模拟模式;检查参考电压Vref+是否正常连接。
    • 检查ADC是否已完成校准(CAL位清零)。
  • 问题2:多通道扫描时数据错位。
    • 确认DMA传输数据宽度与ADC数据对齐方式一致(如16位半字对齐)。
    • 确认DMA缓冲区大小 ≥ 规则序列长度 × 转换次数。
  • 问题3:定时器触发无效,ADC不启动转换。
    • 检查定时器主模式配置(TRGO源选择)。
    • 检查ADC外部触发使能位(EXTSEL)和触发边沿(EXTEN)。
  • 问题4:DMA传输不完整或卡死。
    • 检查DMA循环模式(Circular Mode)是否开启;检查DMA传输完成中断标志。
    • 确认ADC的DMA请求在每次转换结束后自动产生。