返回笔记列表

N-15 | STM32 ADC 采样率四要素、定时器触发与总线架构总结

2026年8月11日
STM32ADC采样率DMA定时器触发TRGOAPBAHBNDTR外设总线

总结影响 STM32 ADC 采样率的四大因素(ADC_CLK、采样周期、触发源、DMA搬运速度),讲解采样点数与 NDTR 寄存器配置、定时器 TRGO 触发频率计算,并梳理 APB1/APB2/AHB 三条总线挂载的外设资源。

ADC 采样率不是由单一参数决定的,而是 ADC 时钟、采样保持时间、触发方式和 DMA 搬运能力共同约束的结果。理解这些因素以及 STM32 的总线架构,是设计高速数据采集系统的关键。


一、影响 ADC 采样率的四大因素(以 12 位 ADC 为例)

1.1 ADC_CLK — ADC 工作时钟

ADC_CLK 越大,转换越快,采样率上限越高。

| 系列 | ADC 最大时钟 | |------|------------| | STM32F1 | 14 MHz(PCLK2 分频) | | STM32F4 | 36 MHz(APB2 分频) | | STM32H7 | 高达 100+ MHz(独立时钟域) |

⚠️ 超过数据手册规定的最大值会导致转换结果错误甚至芯片工作异常。

1.2 采样周期 — 采样保持时间

ADC 采样时间可选:3、15、28、56、84、112、144、480 个 ADC_CLK 周期(具体型号略有差异)。

关键约束:信号源阻抗越大,必须选越长的采样周期。

原因:ADC 内部采样电容(典型值 4~8pF)需要通过信号源内阻 Rs 充电,时间常数 τ = Rs × Csh。采样周期越长,RC 采样电容电荷越充沛,精度越高。

💡 工程估算:要达到 12 位精度(误差 < ½ LSB ≈ 0.012%),采样电容需充电约 12 倍时间常数:

Tsample ≥ 12 × Rs × Csh

例如 Rs = 10kΩ,Csh = 5pF,则 τ = 50ns,需要 ≥600ns 采样时间。在 ADC_CLK = 21MHz(48ns/周期)时,至少选 15 周期采样时间。

总转换时间计算:

Tconv = (采样周期 + 12) × T_ADC_CLK

例如:144 周期采样 + 12 周期逐次逼近 = 156 周期 @ 21MHz ≈ 7.4µs,即采样率上限约 135kSPS。

1.3 触发源 — 谁来启动每次转换

| 触发方式 | 特点 | 适用场景 | |---------|------|---------| | 软件触发 | CPU 写 ADON 位启动,速度慢 | 单次低采样率、通道扫描 | | 定时器事件触发(TRGO) | 定时器精确控制触发频率,不占 CPU | 高速连续采集、等间隔采样 | | 外部引脚触发 | 外部信号同步采样 | 与外部事件对齐的测量 |

📌 推荐:连续采样场景一律使用定时器触发 + DMA,CPU 只在缓冲区满时介入处理,实现"零开销"采集。

1.4 DMA 搬运速度

ADC 转换完成后由 DMA 将结果搬到内存。若 DMA 总线带宽不够,会发生数据溢出(OVR Overrun)——新数据覆盖未及时取走的旧数据。

  • DMA 传输本身只需几个总线时钟周期,通常不会成为瓶颈
  • 但当多个 DMA 通道竞争总线、或内存总线被其他主设备占满时,可能出现溢出
  • OVR 标志位置 1 表示至少丢失了一个采样点

⚠️ 在 STM32F1/F4 上,ADC 的 DMA 请求和其他高速外设(如 SPI、UART)可能竞争同一 DMA 控制器,多通道并发时需要合理分配数据流(Stream)和通道(Channel)优先级。


二、采样点数与 DMA NDTR 寄存器

2.1 普通 DMA 模式

设置 NDTR(Number of Data to Transfer)寄存器 = N(采样点数)。DMA 完成 N 次传输后停止。

限制:

  • 内存缓冲区大小不能超过单片机 RAM 容量
  • NDTR 寄存器位宽限制单次最大长度

| 系列 | NDTR 位宽 | 单次最大长度 | |------|----------|------------| | STM32F4 DMA | 16 位 | 65535 | | STM32H7 DMA | 32 位 | 远大于 RAM 容量,实际受内存限制 |

2.2 循环模式(Circular Mode)

DMA 传输到缓冲区末尾后自动回到开头,配合半传输/全传输中断实现双缓冲/乒乓采集,适合连续信号采集。


三、定时器触发频率计算

3.1 TRGO 触发原理

最常用:定时器更新事件(TRGO)——计数器从 0 计数到 ARR(自动重装载值)产生溢出,产生 Update 更新事件并输出 TRGO 触发脉冲,然后自动重装载值。

采样率由定时器周期决定:

          F_TIM_CLK
Ft = ─────────────────────
     (PSC + 1) × (ARR + 1)
  • PSC(Prescaler):定时器预分频器
  • ARR(Auto-Reload Register):自动重装载值
  • F_TIM_CLK:定时器内部时钟频率

3.2 配置示例

目标采样率 100kHz,定时器时钟 84MHz(APB1,TIM2~5、9~14):

Ft = 84,000,000 / ((PSC+1) × (ARR+1)) = 100,000

→ (PSC+1) × (ARR+1) = 840
→ 取 PSC=0, ARR=839  →  84MHz / 840 = 100kHz  ✓

📌 基本定时器(TIM6、TIM7)只有 Update 事件,专门用于触发 DAC/ADC,是最简单的 TRGO 触发源。


四、STM32 总线架构与外设挂载

STM32 的外设挂在不同总线上,时钟频率和 DMA 映射各不相同。配置时需要确认外设在哪个总线上。

4.1 APB1 — 低速外设总线

| 外设类型 | 具体外设 | |---------|---------| | 基本/通用定时器 | TIM2, TIM3, TIM4, TIM5, TIM6, TIM7(基本定时器,常用于 ADC/DAC 触发), TIM12, TIM13, TIM14 | | UART | UART2, UART3, UART4, UART5 | | SPI | SPI2, SPI3 | | I²C | I2C1, I2C2, I2C3 | | DAC | DAC1, DAC2 |

APB1 时钟频率通常低于 APB2(如 F4 为 42MHz vs 84MHz)。

4.2 APB2 — 高速外设总线

| 外设类型 | 具体外设 | |---------|---------| | 高级定时器 | TIM1, TIM8(带死区控制,用于电机控制/PWM) | | 通用定时器 | TIM9, TIM10, TIM11 | | ADC | ADC1, ADC2, ADC3(全部 ADC) | | UART | USART1, USART6 | | SPI | SPI1, SPI4, SPI5 | | 系统 | SYSCFG, EXTI(外部中断/事件控制器) |

⚡ 所有 ADC 都在 APB2 上,因为需要较高时钟。注意 ADC 内部还会对 APB2 时钟再分频。

4.3 AHB1 — 高速系统总线

| 外设类型 | 具体外设 | |---------|---------| | GPIO | GPIOA ~ GPIOK(全部 GPIO) | | DMA | DMA1, DMA2 | | CRC | CRC 计算单元 | | 以太网/USB | ETH, USB OTG HS(部分型号) |

4.4 AHB2 — 高速外设总线

| 外设类型 | 具体外设 | |---------|---------| | 摄像头 | DCMI(数字摄像头接口) | | 加密 | CRYP(硬件加解密) | | 随机数 | RNG |

4.5 总线关系图

        ┌─────────────────────────────────┐
        │         System Clock            │
        └──────┬──────────┬──────────┬────┘
               │          │          │
           AHB (HCLK)   APB1      APB2
           168MHz       42MHz     84MHz  (F4 系列)
            │            │          │
        ├── GPIO      ├── TIM2-7  ├── TIM1,8
        ├── DMA       ├── UART2-5 ├── ADC1-3
        ├── CRC       ├── SPI2,3  ├── USART1,6
        └── ...       ├── I2C1-3  ├── SPI1
                      └── DAC     └── SYSCFG/EXTI

💡 重要补充:APB 预分频器不为 1 时,定时器时钟会倍频。例如 APB1 预分频 = 4(42MHz),则挂在 APB1 上的定时器时钟为 84MHz(2 倍 APB1 时钟),而不是 42MHz。配置定时器时务必查阅时钟树确认定时器实际时钟频率。


五、高速采集系统设计检查清单

  1. ✅ 信号源阻抗是多少?采样时间是否足够(≥12τ)?
  2. ✅ ADC_CLK 是否在允许范围内?总转换时间是否满足目标采样率?
  3. ✅ 是否使用定时器 TRGO 硬件触发?避免软件抖动
  4. ✅ DMA 是否开启循环模式?缓冲区大小是否足够容纳两次处理间隔的数据?
  5. ✅ 是否有 OVR 溢出处理?缓冲区满后如何响应?
  6. ✅ 参考电压 VREF+ 是否干净?必要时加独立基准源(如 REF3033)
  7. ✅ ADC 输入是否需要运放缓冲?信号源高阻抗时尤其重要
  8. ✅ 模拟地与数字地如何分割?ADC 引脚附近加 RC 滤波

原始笔记照片

ADC采样率四要素、采样点数、定时器TRGO与总线架构