STM32时钟树

Tutorial: 电子电路 Category: 嵌入式 Published: 2026-08-29 08:09:36 Views: 0 Likes: 0 Comments: 0

093.1.4STM32时钟树

一、STM32单片机时钟树

时钟树描述的是:时钟从哪里产生,经过哪些选择器、倍频器和分频器,最后送到内核、总线与各个外设。它不只是“主频设置页”,也是理解外设为何不工作、波特率为何不准、定时周期为何算错的关键。

1.1 时钟源

缩写全称STM32F103 中的典型频率主要用途与特点
HSIHigh-speed internal8 MHz芯片内部 RC;启动快、无需外部器件,精度和温漂通常不如晶体
HSEHigh-speed external本板 8 MHz外部晶体或外部时钟;常作为 PLL 输入,适合得到稳定的 72 MHz 系统时钟
LSILow-speed internal约 40 kHz内部低速 RC;可供独立看门狗,也可选择给 RTC,精度较低
LSELow-speed external32.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 分频。切换前必须先等待时钟源稳定,例如先确认 HSERDYPLLRDY,再切换系统时钟;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_APB2ENRIOPBEN 位。正确初始化顺序一般是:

  1. 配好并稳定系统时钟;
  2. 打开目标外设所在总线的时钟门;
  3. 配置外设寄存器;
  4. 启动外设并处理状态或中断。

若 GPIO 配置代码看似正确但引脚没有反应,首先检查端口时钟是否开启;若串口波特率异常,则同时检查系统时钟、APB 分频和串口自身分频。