SoC 时钟控制器(CGU/CCM):PLL、mux、分频、门控的软件配置顺序
更新时间:2026-09-19。前置:时钟树与复位网络、全数字 PLL。本文不重复 PLL 模拟原理与 CTS,而讲「数字时钟树怎么被软件安全地配置」。
本文要回答的问题
- 一个外设时钟从晶振到模块经过哪些级(PLL→mux→div→gate)?
- 切换系统时钟/改 PLL 频率的安全步骤为什么不能直接改?
- clock gate、外设使能、低功耗怎么联动?
- 时钟切换的毛刺(glitch)在硬件上如何避免?
一、时钟树的数字拓扑
HSE(外部晶振) HSI(内部RC) LSE(32.768k)
└─────┬─────────┘
▼
┌───────────┐ lock
│ PLL │◄── 配置 M/N/K 倍频/分频,锁定后输出稳定
└─────┬─────┘
▼
┌───────────┐ sys_mux (多路选择,无毛刺切换)
│ SW mux │──► ┌─────┐ ──► ┌─────┐ ──► core/AHB
└───────────┘ │ div │ │ gate│
└─────┘ └──┬──┘
各 PLL ─► mux─►div─►gate ─┴─► APB/UART/SPI/ADC/DDR...四个基本元件:
- PLL:把参考倍频到高频;改 M/N 后必须等 LOCK 位。
- Mux(多路选择):在多个源间选一个,好的 IP 用 glitch-free mux(带同步/握手,切换不出窄脉冲)。
- Divider(分频):整数/小数分频,有的支持 busy/动态切换(先 BUSY 再生效)。
- Gate(门控):单 bit 使能/关闭某外设时钟,省电;常要求「先关 gate→改配置→开 gate」。
二、安全的时钟切换顺序
直接在 PLL 输出上改倍频会在锁定前输出畸形时钟。标准做法是先切到安全的中间时钟,再动 PLL:
1. 把系统时钟 mux 切到稳定的内部 RC(HSI/MSI)或直接 HSE
2. 关/重配目标 PLL(改 M/N/K)
3. 等 PLL LOCK(读 PLL 就绪位,必要时超时)
4. 配总线/外设 div(确保各档频率不超规格)
5. 把 mux 切回新 PLL(用无毛刺切换)
6. 再按需打开/调整外设 gate外设改频同理:先 gate 该外设时钟,改其 mux/div,稳定后再 ungate,避免外设采到半截时钟。
三、约束与预算
软件时钟树必须满足数据表的频点/级联约束,例如:core ≤ 800MHz、AHB = core/2、APB ≤ AHB/2、某些外设有最大/最小输入频率(USB 需精确 48MHz、UART 需能分频出标准波特率,见 UART 自动波特率)。配错档位会让外设进未定义状态。
动态电压频率调节(DVFS)降频时还要先降压/升频的电压-频率配对顺序:升频先升压、降频后降压,否则高频低压时序违例。
四、时钟门控与低功耗
- 未用外设时钟默认 gate,用时在 RCC enable 位打开(外设寄存器可能要时钟才可见)。
- 进 Sleep/Stop 时 PMU 自动/手动关闭子树,保留 RTC/LSE,见 低功耗模式。
- RTL 内还有细粒度 ICG(集成时钟门控单元),在空闲时自动停局部时钟以省电。
五、无毛刺切换(RTL 视角)
普通组合 mux 在任意时刻切换选择信号,输出可能产生窄毛刺被触发器当一个沿。glitch-free mux 对两个选择分别用各自时钟域同步、先关旧源再开新源:
// 概念:两选择信号各自在对应时钟域同步并互斥,先停旧再通新
// sel_a 由 clk_b 侧同步、sel_b 由 clk_a 侧同步,保证不会同时选通
// 工程中直接例化库/SoC 提供的 clock mux,不要自己写组合选时钟六、常见的坑
- 不等 PLL LOCK 就切过去:启动期时钟不稳,跑飞或外设波特率错。
- 直接在当前系统时钟的 PLL 上改频率:自己锯断脚下时钟,芯片挂死。
- div 档位超规格:APB/AHB/外设超最大频率,偶发功能错。
- 改外设频率不先 gate:采到半周期脉冲,状态机进未知态。
- mux 自写组合逻辑产生毛刺:必须用 glitch-free IP/库单元。
- 外设时钟没开就访问寄存器:总线超时(见 总线超时)。
- USB/ENET 等需精确频点:用误差大的内部 RC 导致枚举/链路失败。
- DVFS 顺序错:高频时电压不够,时序违例;或降压快于降频。
- 门控时钟与调试冲突:关了时钟导致 JTAG/跟踪不可用。
- 分频寄存器有影子/busy:写入后要等生效/busy 清,连续改被忽略。
- Stop 唤醒后系统时钟仍在 HSI:以为回到高速 PLL,性能/时序异常,见 低功耗模式。
- 时钟测量脚(MCO)误配:拿不到波形却怀疑硬件。
相关与延伸
拓扑与 CTS 见 时钟树与复位网络、CTS;PLL 原理见 全数字 PLL;低功耗联动见 低功耗模式;下游外设见 UART。
总结
SoC 时钟树是「参考源→PLL(倍频,等 LOCK)→无毛刺 mux→divider→gate→外设」的级联,软件安全改频的铁律是先切到稳定中间时钟、再重配 PLL 等锁定、配好满足各总线/外设上下限的分频、最后用无毛刺 mux 切回;改单个外设要先 gate 再改 mux/div 再 ungate,DVFS 遵守升频先升压/降频后降压,时钟选择必须用 glitch-free mux——不等 LOCK、直接在现役 PLL 上改频、分频超档和外设时钟没开是四大典型坑。