跳转到内容
新建笔记

STM32 时钟树:从 HSI/HSE/PLL 到定时器时钟

配置 STM32 定时器前,先确定送到该定时器内核的时钟。CPU 主频、APB 总线时钟和定时器时钟可以是三个不同的数值;把 SystemCoreClock 直接代进全部外设的公式,常会得到一倍、两倍甚至更大的误差。

本页用 STM32F103 说明基本时钟链,再用 STM32H743 说明跨系列差异。频率上限、时钟源和电压档必须以具体料号、修订号的数据手册为准。

名称含义适合怎样理解
HSI内部高速 RC 振荡器不需要外部晶体,可用于启动或作为系统时钟来源;频率与精度由芯片规格、温度、电压及校准决定
HSE外部高速时钟源可以由外部晶体/谐振器振荡,也可以在 bypass 配置下输入外部时钟;两种接法与配置不同
PLL锁相环对选定输入做分频、倍频,产生符合内核及外设要求的时钟;输入、VCO、输出均有允许范围
SYSCLK系统时钟选择器的输出是后续时钟树的上游来源,不等于每个外设实际收到的时钟

STM32F103 的 HSI 标称为 8 MHz,SYSCLK 可以选择 HSI、HSE 或 PLL。这个“8 MHz、三个选项”的结论属于 F103 时钟树;H743 有不同的 HSI 频率和 CSI 等时钟选择,其他 STM32 又可能有 MSI 等来源。ST RM0008 第 7 章、ST RM0433 第 8 章

外部晶体经常用于提高时钟准确度和稳定性,但不能只凭“外部”二字保证精度。还要看晶体容差、负载电容、温漂、老化、布局和振荡器工作条件。PLL 改变频率,并不会自动消除输入时钟的相对频率误差。

F103 的常见路径可以写成:

HSI / HSE → 可选 PLL → SYSCLK
│ AHB 预分频
▼
HCLK
┌────┴────┐
APB1 预分频 APB2 预分频
│ │
PCLK1 PCLK2
│ │
TIM2/3/4 TIM1
时钟规则 时钟规则

CPU、AHB、APB 和外设之间还存在各自的使能、复位、分频和选择器。ADC、USB、RTC 等也有自己的时钟要求,不能根据上图把它们全部视作直接接 SYSCLK。H7 则进一步区分电源/时钟域、总线时钟与某些外设的内核时钟。

对 F103 的 APB 定时器,设所属 APB 的分频系数为 dd,则:

fPCLK=fHCLKd,fTIM={fPCLK,d=1,2fPCLK,d≠1.f_{\mathrm{PCLK}}=\frac{f_{\mathrm{HCLK}}}{d},\qquad f_{\mathrm{TIM}}= \begin{cases} f_{\mathrm{PCLK}}, & d=1,\\ 2f_{\mathrm{PCLK}}, & d\ne1. \end{cases}

例如常见 F103 配置:SYSCLK = HCLK = 72 MHz,APB1 分频为 2,APB2 分频为 1。此时 PCLK1 为 36 MHz,但 TIM2/3/4 的输入时钟为 72 MHz;PCLK2 和 TIM1 时钟也为 72 MHz。这里成立的原因是明确的分频配置,不是“STM32 定时器总是系统主频”。

H743 的普通 APB 定时器还要看 RCC_CFGR.TIMPRE。以 RM0433 Table 57 的 HCLK 为上游,常用分频关系如下:

APB 分频 ddPCLKTIMPRE = 0 时的定时器内核时钟TIMPRE = 1 时的定时器内核时钟
1HCLKHCLKHCLK
2HCLK / 2HCLKHCLK
4HCLK / 4HCLK / 2HCLK
8HCLK / 8HCLK / 4HCLK / 2
16HCLK / 16HCLK / 8HCLK / 4

所以“APB 分频不为 1 就固定乘 2”的简化不能不加条件地套到 H743。HRTIM 又有独立选择规则,不能从普通 TIM 表直接推导。

举例:在允许 480 MHz 内核的器件修订、电压档与 Flash 配置下,可以配置 CPU 480 MHz、HCLK 240 MHz、PCLK1/2 120 MHz。此时相应普通定时器可以是 240 MHz。CPU 480 MHz 不代表普通 TIM 也运行在 480 MHz。 H743 普通 16/32 位定时器的规格上限与 HRTIM 分开列示。STM32H743 产品规格

RevV 引入的 VOS0 需要规定的切换流程;板上写着 H743 并不足以证明当前就可按 480 MHz 使用。ST AN5312:RevY 到 RevV 迁移

已知实际定时器内核时钟 fTIMf_{\mathrm{TIM}} 后,计数时钟为:

fCNT=fTIMPSC+1.f_{\mathrm{CNT}}=\frac{f_{\mathrm{TIM}}}{\mathrm{PSC}+1}.

在内部时钟、向上计数、边沿对齐、没有重复计数器分频等条件下,计数器走过 0,1,…,ARR0,1,\ldots,\mathrm{ARR},一个周期包含 ARR + 1 个计数时钟:

T=(PSC+1)(ARR+1)fTIM,f=fTIM(PSC+1)(ARR+1).T=\frac{(\mathrm{PSC}+1)(\mathrm{ARR}+1)}{f_{\mathrm{TIM}}},\qquad f=\frac{f_{\mathrm{TIM}}}{(\mathrm{PSC}+1)(\mathrm{ARR}+1)}.
已知 fTIMf_{\mathrm{TIM}}PSC 寄存器值fCNTf_{\mathrm{CNT}}ARR 寄存器值上述条件下的周期
72 MHz711 MHz9991 ms
72 MHz719910 kHz91 ms
240 MHz2391 MHz9991 ms

中心对齐、外部时钟、从模式门控、单脉冲和 RCR 都会改变需要计算的事件关系。CKD 主要设置采样/死区时基,并不是第二个普通计数预分频器。详见 定时器 PWM 与寄存器 和 H7 定时器进阶。

  1. 记录完整料号、硅片修订、所用参考手册和时钟配置代码。
  2. 从实际时钟源开始,逐级记录 SYSCLK、HCLK、PCLK、TIM 内核时钟;H7 额外记录 TIMPRE。
  3. 确认软件中的时钟变量与实际配置一致。改变时钟后,旧的 SystemCoreClock 数值不能继续作为测量依据;HAL 获取 PCLK 的接口也不等于直接获取所有 TIM 的内核时钟。
  4. 检查 PSC/ARR 写入与更新事件:PSC 有缓冲,写寄存器不表示新的分频已经生效。
  5. 用已知分频的 MCO、定时器输出或示波器测量核对结果,同时注明测量使用的引脚、极性和输出分频。

若测得周期恰好是预期的两倍,优先检查 APB 定时器倍频;若 SysTick 延时出现约八倍偏差,检查 F1 的 HCLK/HCLK÷8 选择。测量误差不是一个固定百分比,需要结合时钟准确度、计数量化和软件响应时间一起分析。