## 时钟树 ## 判别规则(核心,唯一要记的) 1. **频率怎么算**:沿着树一路乘除。`源频率 × PLL 倍频 = SYSCLK` → 走 AHB(分频)→ 再进 APB1(要再 /2,最高只有 36M)或 APB2(/1,最高 72M) 2. **外设挂哪条**:要高速的挂 APB2(72M,如 USART1、SPI1);不着急的挂 APB1(36M,省电,如 USART2/3、I2C) 3. **五个时钟源各管一摊**:HSE = 主源(外部晶振,准);HSI = 后备(内部 RC,便宜但漂);PLL = 提速到 72M;LSI = 看门狗用;LSE = 只给 RTC 一句话:**"时钟 = 配电房,按设备需求分配频率;算频率沿着树乘除,外设看速度需求选总线,五个源各管各的。"** ## 抽象描述(一句话本质) 芯片里一堆设备速度要求不一样,不能全都供 72M(费电、也用不上)。所以有个"配电房"(RCC)按需分配:CPU 要 72M,APB1 外设给 36M 就够,RTC 用专门的慢钟(32.768KHz)。 ## 五个时钟源(一张表记全) | 源 | 频率 | 准不准 | 管什么 | | --- | ---------------- | ------------------------- | ---------------------------- | | HSI | 8M 内部 RC | 差(约 1%,随温度电压漂) | 上电先用它跑、HSE 坏了顶上来 | | HSE | 8M 外部晶振 | 准(约 50ppm) | **系统主源首选** | | PLL | ×9 = 72M | — | 把频率提上去给 CPU 用 | | LSI | 40K 内部 RC | 差 | 看门狗(IWDG)、自动唤醒 | | LSE | 32.768K 外部晶振 | 准 | **只给 RTC** 计时 | > 为啥 HSE 准 HSI 差:HSE 是外面那块石英,频率靠切石头定死,稳;HSI 是芯片里电阻+电容充放电计时,RC 值受温度电压影响大,所以漂。要精确时序(USB 48M、波特率)必须靠外部晶振。 ## 频率怎么算(背下这条路) ``` HSE 8M → PLL×9 → SYSCLK 72M → AHB /1 = 72M → APB1 /2 = 36M(到顶了) └→ APB2 /1 = 72M(到顶了) ``` - SYSCLK = 源 × PLL 倍频 - AHB = SYSCLK ÷ AHB 分频 - APB1 = AHB ÷ 2(**最高只能 36M**) - APB2 = AHB ÷ 1(**最高 72M**) ## 外设挂哪条总线 | 总线 | 最高频率 | 挂什么 | | ---- | -------- | ----------------------------------------- | | APB2 | 72M | GPIO、USART1、SPI1、TIM1、ADC(高速外设) | | APB1 | 36M | USART2/3、I2C、SPI2/3、TIM2~7(低速省电) | > 记法:USART1 要跑高速 → 挂 APB2;USART2 不着急 → 挂 APB1。设计目的就是**省电**,不是越快到越好。 ## 配置坑(最容易死的三个) 1. **Flash 等待周期要跟着频率改**:0~~24M→0 等待 / 24~~48M→1 / 48~72M→2。频率上去但等待没加 → CPU 去 Flash 取指令跟不上 → 死机。**改频率 = 改 Flash 等待,两件事一起做。** 2. **改 PLL 的顺序**:关 PLL → 改倍频 → 改 Flash 等待 → 开 PLL 等就绪 → 切源等确认。直接切到没就绪的时钟源,系统会没时钟,直接跑飞。 3. **外设时钟要手动开**:每个外设用之前都要 `RCC->APBxENR` 打开,不然外设没时钟不工作。 ## 正反例(建立直觉) - **正例1**:CPU 要最快 → 挂 SYSCLK 72M(PLL ×9) - **正例2**:USART1 要高波特率 → 挂 APB2(72M) - **反例1**:把 I2C 挂 APB2 → 浪费(它本身跑不了那么快,还费电) - **反例2**:RTC 用系统时钟 → 断电就丢时间,必须用 LSE(后备域独立供电) ## 易混对比 ### HSI vs HSE | | HSI | HSE | | ---- | ---------------------- | ---------------------------- | | 来源 | 芯片内部 RC | 外部石英晶振 | | 精度 | 差(~1%,会漂) | 准(~50ppm) | | 用途 | 上电起步、HSE 故障后备 | 系统主源、USB/波特率必须用它 | ### LSI vs LSE | | LSI | LSE | | ------ | ---------------- | ----------------- | | 频率 | 40K | 32.768K | | 管什么 | 看门狗、自动唤醒 | RTC(独立后备域) | ### APB1 vs APB2 | | APB1 | APB2 | | -------- | --------------- | -------- | | 最高频率 | 36M | 72M | | 挂谁 | 低速/低功耗外设 | 高速外设 | ## 变体验证(3 题,全过=学会) 1. 计算:HSE 8M、PLL ×6、AHB /1、APB1 /2、APB2 /1 → **SYSCLK 48M / APB1 24M / APB2 48M**,Flash 设 **1 等待**(24~48M 档) 2. 陷阱题:"所有外设都用 72M 才能保证性能,应该全挂 APB2" → **错**。看外设实际需求:APB1 上限就 36M,且全 72M 功耗爆炸,低速外设挂 APB1 是为了省电 3. 陷阱题:从 ×9(72M)改成更高倍频后一启动就死机 → **最可能是 Flash 等待周期没跟着改**(频率高了 Flash 读取跟不上);超 72M 本身也超规格 ## 口述要点(面试怎么讲) - **结论先行**:频率沿树乘除;高速外设挂 APB2;五个源各管各的 - **为什么先 HSI 再切 PLL**:外部晶振要起振时间、PLL 要锁定时间,上电瞬间它们没稳定,所以先用内部 RC 保证能跑,配好再切 - **为什么 HSE 准 HSI 差**:石英靠机械尺寸定频稳,内部 RC 靠电阻电容充放电、受温度电压影响大 - **为什么改 PLL 要关了再开、等就绪再切**:运行中改倍频会出毛刺;切到没就绪的源会没时钟,跑飞。就绪标志 = "新时钟稳定了"的确认 - **易错点**:改倍频忘改 Flash 等待;忘开外设时钟;把 USB/RTC 的关键时钟用错源 ## 关系网络 | 相邻概念 | 关系 | 孤立理解会犯的错 | | ---------- | ---------------------------------- | ---------------------------- | | NVIC/中断 | 所有外设/中断都靠时钟才工作 | 忘开外设时钟,中断永远不来 | | DMA | DMA 也挂在 AHB 上 | 以为 DMA 不用时钟 | | 串口波特率 | 波特率算不准常是因为时钟源不精确 | 用内部 RC 配高波特率,误差大 | | 低功耗 | 时钟树的存在目的就是按需供电、省电 | 以为全上 72M 最好 | ## 学习日期 2026-08-18 --- _每主题一页,复习时只翻本目录。_