配置 STM32 定时器前,先确定送到该定时器内核的时钟。CPU 主频、APB 总线时钟和定时器时钟可以是三个不同的数值;把 SystemCoreClock 直接代进全部外设的公式,常会得到一倍、两倍甚至更大的误差。
本页用 STM32F103 说明基本时钟链,再用 STM32H743 说明跨系列差异。频率上限、时钟源和电压档必须以具体料号、修订号的数据手册为准。
HSI、HSE、PLL 与 SYSCLK
跳转到“HSI、HSE、PLL 与 SYSCLK”| 名称 | 含义 | 适合怎样理解 |
|---|---|---|
| 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 的分频系数为 ,则:
例如常见 F103 配置:SYSCLK = HCLK = 72 MHz,APB1 分频为 2,APB2 分频为 1。此时 PCLK1 为 36 MHz,但 TIM2/3/4 的输入时钟为 72 MHz;PCLK2 和 TIM1 时钟也为 72 MHz。这里成立的原因是明确的分频配置,不是“STM32 定时器总是系统主频”。
H743 的 TIMPRE 差异
跳转到“H743 的 TIMPRE 差异”H743 的普通 APB 定时器还要看 RCC_CFGR.TIMPRE。以 RM0433 Table 57 的 HCLK 为上游,常用分频关系如下:
| APB 分频 | PCLK | TIMPRE = 0 时的定时器内核时钟 | TIMPRE = 1 时的定时器内核时钟 |
|---|---|---|---|
| 1 | HCLK | HCLK | HCLK |
| 2 | HCLK / 2 | HCLK | HCLK |
| 4 | HCLK / 4 | HCLK / 2 | HCLK |
| 8 | HCLK / 8 | HCLK / 4 | HCLK / 2 |
| 16 | HCLK / 16 | HCLK / 8 | HCLK / 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 迁移
确定 PSC 和 ARR
跳转到“确定 PSC 和 ARR”已知实际定时器内核时钟 后,计数时钟为:
在内部时钟、向上计数、边沿对齐、没有重复计数器分频等条件下,计数器走过 ,一个周期包含 ARR + 1 个计数时钟:
| 已知 | PSC 寄存器值 | ARR 寄存器值 | 上述条件下的周期 | |
|---|---|---|---|---|
| 72 MHz | 71 | 1 MHz | 999 | 1 ms |
| 72 MHz | 7199 | 10 kHz | 9 | 1 ms |
| 240 MHz | 239 | 1 MHz | 999 | 1 ms |
中心对齐、外部时钟、从模式门控、单脉冲和 RCR 都会改变需要计算的事件关系。CKD 主要设置采样/死区时基,并不是第二个普通计数预分频器。详见 定时器 PWM 与寄存器 和 H7 定时器进阶。
在工程中核对时钟
跳转到“在工程中核对时钟”- 记录完整料号、硅片修订、所用参考手册和时钟配置代码。
- 从实际时钟源开始,逐级记录 SYSCLK、HCLK、PCLK、TIM 内核时钟;H7 额外记录 TIMPRE。
- 确认软件中的时钟变量与实际配置一致。改变时钟后,旧的
SystemCoreClock数值不能继续作为测量依据;HAL 获取 PCLK 的接口也不等于直接获取所有 TIM 的内核时钟。 - 检查 PSC/ARR 写入与更新事件:PSC 有缓冲,写寄存器不表示新的分频已经生效。
- 用已知分频的 MCO、定时器输出或示波器测量核对结果,同时注明测量使用的引脚、极性和输出分频。
若测得周期恰好是预期的两倍,优先检查 APB 定时器倍频;若 SysTick 延时出现约八倍偏差,检查 F1 的 HCLK/HCLK÷8 选择。测量误差不是一个固定百分比,需要结合时钟准确度、计数量化和软件响应时间一起分析。