2. 电源管理核心寄存器与时钟系统
RA 系列 MCU 的功耗表现,很大程度上不是由 CPU 内核决定的,而是由“哪些时钟在跑、跑多快、由谁驱动”决定的。时钟生成电路(Clock Generation Circuit,CGC)是整个低功耗设计的源头:它决定了系统时钟(ICLK)、外设时钟(PCLKB/PCLKD)、闪存时钟(FCLK)以及各功能模块时钟的频率与来源。理解 CGC 的寄存器结构,是后续做低功耗切换、外设降频、休眠唤醒配置的基础。
一、时钟源与时钟树的基本结构
RA 的时钟源主要有四类:外部主时钟(MAIN OSC)、外部子时钟(SUB OSC)、内部高速振荡器(HOCO)、内部中速振荡器(MOCO)和内部低速振荡器(LOCO)。其中 HOCO 可提供 16/18/20 MHz 等频率,MOCO 通常为 8 MHz,LOCO 约 32.768 kHz。外部主时钟一般接 8~24 MHz 晶振,外部子时钟接 32.768 kHz 晶振,用于 RTC 和低功耗计数。
这些时钟源经过选择器、分频器和 PLL 后,形成系统时钟树。PLL 可以把 MAIN OSC 或 HOCO 倍频到更高频率,例如 8 MHz 输入 × 12 = 96 MHz,再经过 SCKDIVCR 分频得到 ICLK、PCLKB、PCLKD、FCLK。SCKSCR 决定系统时钟的最终来源,OSCSF 则反映各振荡器是否稳定起振。理解这条链路,才能明白“改一个寄存器,为什么整个芯片的功耗和时序都变了”。
二、SCKDIVCR:分频比决定动态功耗
SCKDIVCR 是系统时钟分频控制寄存器,它把经过 PLL 或直接来自振荡器的高频时钟,分频成 ICLK、PCLKB、PCLKD、FCLK 四路。每一路都有独立的 3 位分频字段,支持 ÷1、÷2、÷4、÷8、÷16、÷32、÷64。动态功耗近似与频率成正比,因此把 ICLK 从 96 MHz 降到 48 MHz,CPU 动态功耗大约减半;把 PCLKB 从 48 MHz 降到 12 MHz,外设功耗也会明显下降。
实际配置时要注意顺序:先写 SCKDIVCR 设定分频,再确认时钟稳定,最后才允许切换系统时钟源。如果先切源再改分频,可能出现瞬间超频或时序违例。下面是一段典型的寄存器配置示例,用于把 ICLK 设为 48 MHz、PCLKB 设为 24 MHz、PCLKD 设为 48 MHz、FCLK 设为 24 MHz:
/* 假设 PLL 输出 96 MHz,作为系统时钟源 */
/* SCKDIVCR: ICLK=÷2, PCLKB=÷4, PCLKD=÷2, FCLK=÷4 */
R_SYSTEM->SCKDIVCR = (1u << 24) | /* FCLK ÷4 */
(1u << 16) | /* PCLKD ÷2 */
(2u << 8) | /* PCLKB ÷4 */
(1u << 0); /* ICLK ÷2 */
/* 等待分频设置生效 */
while (R_SYSTEM->SCKDIVCR != expected_value) {
/* 轮询确认 */
}
这段代码的关键不是“写寄存器”,而是理解每个字段对应的时钟域。ICLK 影响 CPU 和高速总线,PCLKB 影响大多数外设,PCLKD 影响部分高速外设,FCLK 影响闪存访问。降低 FCLK 可以省电,但会拉长闪存读取时间,需要评估是否影响实时性。
三、SCKSCR 与 OSCSF:时钟源切换与稳定判断
SCKSCR 用于选择系统时钟源,可选 MAIN OSC、HOCO、MOCO、LOCO、SUB OSC 或 PLL。切换时不能直接改写了事,必须先确认目标时钟已经稳定。OSCSF 就是干这个的:它的每一位对应一个振荡器或 PLL 的稳定标志。例如 MAIN OSC 稳定位、HOCO 稳定位、PLL 稳定位。只有对应位为 1,才允许把 SCKSCR 切过去。
典型切换流程是:先启动目标振荡器,轮询 OSCSF 等待稳定,再写 SCKSCR 切换,最后关闭不再使用的时钟源。这个顺序如果颠倒,轻则时钟异常,重则程序跑飞。下面是一个从 HOCO 切到 PLL 的示例逻辑:
/* 1. 启动 PLL 并等待稳定 */
R_SYSTEM->PLLCR = ...; /* 配置倍频/分频 */
while (0 == (R_SYSTEM->OSCSF & (1u << 5))) {
/* 等待 PLL 稳定位 */
}
/* 2. 切换系统时钟源到 PLL */
R_SYSTEM->SCKSCR = 0x05; /* PLL 作为系统时钟 */
/* 3. 确认切换完成 */
while (R_SYSTEM->SCKSCR != 0x05) {
/* 轮询 */
}
这里 0x05 只是示例值,实际取值要以芯片手册的 SCKSCR 定义为准。重点是“先稳定、后切换、再确认”这个顺序,它比具体数值更重要。
四、各时钟源对功耗的影响与切换策略
不同时钟源的功耗差异很大。MAIN OSC 需要外部晶振,起振慢但精度高;HOCO 起振快、无需外部器件,适合快速唤醒;MOCO 功耗更低,适合中低速外设;LOCO 功耗最低,但精度差,适合 RTC 或看门狗;SUB OSC 精度高、功耗低,适合长期计时。PLL 本身会额外消耗电流,因此在不需要高频时,应关闭 PLL。
低功耗切换策略可以概括为:运行模式用 PLL + 高分频,兼顾性能与功耗;待机前切到 HOCO 或 MOCO,关闭 PLL 和 MAIN OSC;深度休眠时只保留 LOCO 或 SUB OSC 给 RTC 供电;唤醒后先恢复 HOCO,再启动 PLL,最后切回高速。这样既保证唤醒速度,又避免长时间高频运行。
判断切换是否成功,不能只看 SCKSCR 写没写进去,还要看 OSCSF 对应稳定位是否为 1,以及实际输出时钟是否在预期范围内。可以用示波器测 PCLKB 输出,或通过定时器计数反推频率。
关闭正在作为系统时钟源的振荡器会导致芯片立即失去时钟。切换顺序必须是:启动新源 → 等待稳定 → 切换 SCKSCR → 确认 → 再关闭旧源。任何一步颠倒都可能造成死机。
五、配置检查清单
| 检查项 | 寄存器/信号 | 判断依据 |
|---|---|---|
| 目标时钟源是否稳定 | OSCSF 对应位 | 稳定位 = 1 |
| 系统时钟源选择 | SCKSCR | 写入值与手册定义一致 |
| 各时钟分频比 | SCKDIVCR | ICLK/PCLKB/PCLKD/FCLK 符合设计 |
| PLL 倍频/分频 | PLLCR / PLLCCR | 输出频率在允许范围 |
| 旧时钟源是否可关闭 | 各振荡器控制位 | 确认不再被任何模块引用 |
把这张表当作切换前后的自检工具,可以避免绝大多数时钟配置事故。时钟系统是低功耗设计的地基,地基不稳,后面所有省电策略都无从谈起。