目标:理解时钟源结构,配置 SYSCLK = 72MHz(最大频率)
STM32 内部包含三大核心部件:CPU 核心(Cortex-M3)、存储器(Flash + SRAM)、外设总线(AHB + APB1 + APB2)。时钟树的任务就是把外部/内部时钟源通过 PLL 倍频、分频器分频后,分配到每个部件。
STM32 有 4 个独立的时钟源:
| 时钟源 | 符号 | 典型频率 | 精度 | 用途 |
|---|---|---|---|---|
| 高速内部振荡器 | HSI | 8MHz | 较差 (±1%) | 上电默认时钟,可作 PLL 输入 |
| 高速外部晶振 | HSE | 4~16MHz | 精确 (±0.01%) | 常用 8MHz 作为 PLL 输入源 |
| 低速内部振荡器 | LSI | 40kHz | 较差 | 独立看门狗 (IWDG)、RTC 备用 |
| 低速外部晶振 | LSE | 32.768kHz | 精确 | RTC 专用时钟 |
时钟树的本质是多路选择器 (MUX) + 锁相环 (PLL) + 分频器 (Divider) 组成的时钟分配网络:
HSI (8MHz) ──┐
├──→ MUX ──→ SYSCLK ──→ AHB Div ──→ HCLK (CPU, Flash, SRAM)
HSE (8MHz) ──┘ │
↑ ├──→ APB1 Div ──→ PCLK1 (≤36MHz)
PLL x9 │ 外设: TIM2~4, I2C1~2, USART2, etc.
(8×9=72MHz) └──→ APB2 Div ──→ PCLK2 (≤72MHz)
外设: GPIO, USART1, SPI1, ADC1, TIM1
APB 预分频器有一个隐藏行为:
APB1 预分频 = 1 → TIM 时钟 = PCLK1(36MHz → 定时器 36MHz) ❌ 本配置
APB1 预分频 ≠ 1 → TIM 时钟 = 2 × PCLK1(36MHz → 定时器 72MHz) ✅ 配 /2 时
当 APB1 分频为 /2 时(72MHz 配置),虽然 PCLK1 = 36MHz,但挂载在 APB1 上的定时器(TIM2/3/4/5/6/7)实际时钟为 2 × 36 = 72MHz。配置定时器时分频要按 72MHz 计算。
同理 APB2 分频 ≠ 1 时(如/2),TIM1/TIM8 也得到 2× 时钟。72MHz 配置下 APB2=/1,所以 TIM1/TIM8 时钟就是 72MHz。
HCLK 频率与 Flash 等待周期的关系:
| HCLK | 等待周期 |
|---|---|
| 0~24MHz | 0 wait (WS=0) |
| 24~48MHz | 1 wait (WS=1) |
| 48~72MHz | 2 wait (WS=2) |
CubeMX 会自动计算并配置
FLASH_ACR寄存器,不需要手动设置。
while (1)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
for (volatile uint32_t i = 0; i < 1000000; i++); // 软件延时
}
对比默认 8MHz 和配置后 72MHz:
CubeMX 修改时钟后,Keil 需同步:
HAL_Delay 仍正常工作