N-15 | STM32 ADC 采样率四要素、定时器触发与总线架构总结
总结影响 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。配置定时器时务必查阅时钟树确认定时器实际时钟频率。
五、高速采集系统设计检查清单
- ✅ 信号源阻抗是多少?采样时间是否足够(≥12τ)?
- ✅ ADC_CLK 是否在允许范围内?总转换时间是否满足目标采样率?
- ✅ 是否使用定时器 TRGO 硬件触发?避免软件抖动
- ✅ DMA 是否开启循环模式?缓冲区大小是否足够容纳两次处理间隔的数据?
- ✅ 是否有 OVR 溢出处理?缓冲区满后如何响应?
- ✅ 参考电压 VREF+ 是否干净?必要时加独立基准源(如 REF3033)
- ✅ ADC 输入是否需要运放缓冲?信号源高阻抗时尤其重要
- ✅ 模拟地与数字地如何分割?ADC 引脚附近加 RC 滤波
原始笔记照片
