STM32时钟树
093.1.4STM32时钟树
一、STM32单片机时钟树
时钟树描述的是:时钟从哪里产生,经过哪些选择器、倍频器和分频器,最后送到内核、总线与各个外设。它不只是“主频设置页”,也是理解外设为何不工作、波特率为何不准、定时周期为何算错的关键。
1.1 时钟源
| 缩写 | 全称 | STM32F103 中的典型频率 | 主要用途与特点 |
|---|---|---|---|
| HSI | High-speed internal | 8 MHz | 芯片内部 RC;启动快、无需外部器件,精度和温漂通常不如晶体 |
| HSE | High-speed external | 本板 8 MHz | 外部晶体或外部时钟;常作为 PLL 输入,适合得到稳定的 72 MHz 系统时钟 |
| LSI | Low-speed internal | 约 40 kHz | 内部低速 RC;可供独立看门狗,也可选择给 RTC,精度较低 |
| LSE | Low-speed external | 32.768 kHz | 外部低速晶体;通常给 RTC 提供较准确的计时基准 |
H/L 表示高速/低速,E/I 表示外部/内部。晶体本身是无源谐振元件,需与芯片内部振荡放大电路及负载电容共同起振;HSI、LSI 则是片内 RC 振荡器。
32.768 kHz 的原因是:
$32768\text{ Hz}=2^{15}\text{ Hz}$
连续二分频 15 次即可得到 1 Hz。这里是 2^15 Hz,不是 2^15 kHz。
1.2 锁相环
PLL(Phase-Locked Loop,锁相环)不是简单的数字乘法器,而是让内部振荡信号跟踪参考时钟的相位,并通过反馈得到更高频率。对本课程配置,可把结果按倍频公式先理解为:
$f_{PLL}=f_{HSE}\times 9=8\text{ MHz}\times9=72\text{ MHz}$
选择 PLL 作为 SYSCLK 后,内核和总线再从 72 MHz 分频。切换前必须先等待时钟源稳定,例如先确认 HSERDY、PLLRDY,再切换系统时钟;HAL 库会封装这套顺序与超时判断。
若使用 HSI 作为 PLL 输入,进入 PLL 前固定先除以 2,即 8 MHz / 2 = 4 MHz。STM32F103 的 PLL 最大乘 16,因此这种路径理论上最高为 64 MHz,并非 36 MHz;要达到器件额定的 72 MHz,常用 8 MHz HSE 乘 9。
1.3 时钟树
1.3.1 时钟数
本课程的典型路径如下:
flowchart LR
HSE[HSE 8 MHz] --> PLL[PLL ×9]
PLL --> SYS[SYSCLK 72 MHz]
SYS --> AHB[AHB /1\nHCLK 72 MHz]
AHB --> CPU[Cortex-M3/FCLK\n72 MHz]
AHB --> APB1[APB1 /2\nPCLK1 36 MHz]
AHB --> APB2[APB2 /1\nPCLK2 72 MHz]
APB1 --> T1[APB1 定时器时钟\n72 MHz]
APB2 --> T2[APB2 定时器时钟\n72 MHz]
PLL --> USB[USB 预分频 /1.5\n48 MHz]
APB2 --> ADC[ADC 再分频 /6\n12 MHz]
关键计算关系:
HCLK = SYSCLK / AHB 分频系数 = 72 MHz。PCLK1 = HCLK / 2 = 36 MHz,因为 APB1 额定上限为 36 MHz。PCLK2 = HCLK / 1 = 72 MHz。- 当 APB 预分频系数不为 1 时,该 APB 上的定时器时钟自动为
2 × PCLK。所以 APB1 虽为 36 MHz,TIM2~TIM7 的计数时钟源仍可为 72 MHz。 - ADC 时钟不能超过 14 MHz,72 MHz 的 PCLK2 常再除以 6 得 12 MHz。
- USB 全速模块需要 48 MHz;PLL 为 72 MHz 时选择
/1.5得 48 MHz。不能把 CubeMX 中未启用时显示的数值当成有效 USB 时钟。
外设不是一律直接获得所在总线频率。USART、SPI、定时器、ADC 等还可能在模块内部继续分频,最终波特率或计数频率必须沿完整路径计算。
1.3.2 时钟树灰色的原因
CubeMX/CubeIDE 中灰色的路径通常表示对应时钟源或消费该时钟的外设尚未启用,而不是“代码还没初始化”。例如:
- 未在 RCC 中启用 LSE,LSE 路径会保持不可选或灰色。
- 未启用 RTC,RTC 时钟选择器与相关路径可能不活跃。RTC 位于
Timers分类只是界面归类,不代表它是普通 TIM 定时器。 - 未启用 USB、ADC 等外设时,其末端时钟框可能显示灰色或默认计算值。
- 出现红色通常表示频率超限或配置冲突,应按工具提示检查源、倍频和分频。
RTC 可从 LSE、LSI 或 HSE/128 中选择。若要求掉电保持与长期计时精度,一般优先选择板载 32.768 kHz LSE,并配合 VBAT 备用电源;LSI 更适合对精度要求不高的场景。
1.4 单片机的外设
每个外设前通常还有一扇“时钟门”。RCC 的外设时钟使能位关闭时,时钟不会送入模块,既降低动态功耗,也可能使寄存器访问不起作用。以 GPIOB 为例:
HSE → PLL → SYSCLK → HCLK → APB2
│
RCC_APB2ENR.IOPBEN
│ 开门
▼
GPIOB
HAL 代码中的 __HAL_RCC_GPIOB_CLK_ENABLE() 最终就是设置 RCC_APB2ENR 的 IOPBEN 位。正确初始化顺序一般是:
- 配好并稳定系统时钟;
- 打开目标外设所在总线的时钟门;
- 配置外设寄存器;
- 启动外设并处理状态或中断。
若 GPIO 配置代码看似正确但引脚没有反应,首先检查端口时钟是否开启;若串口波特率异常,则同时检查系统时钟、APB 分频和串口自身分频。