4. 低功耗时钟系统配置与优化

在 Silicon Labs 的低功耗 MCU(如 EFM32、EFR32 系列)中,时钟系统是功耗预算里最容易被低估、却影响最直接的一环。同一颗芯片,运行同一段代码,仅因时钟源与分频配置不同,电流就可能从几百微安降到几微安。理解 HFXO、LFXO、HFRCO、LFRCO、ULFRCO 这五个时钟源的特性与代价,是低功耗优化的第一课。

五个时钟源的本质差异

这五个时钟源可以按“精度—功耗—启动时间”三个维度来理解。HFXO 是外部高频晶振,通常 38.4 MHz 或 32 MHz,精度可达 ±10 ppm 级别,但驱动它需要持续电流,典型工作电流在 200~400 µA 量级,且启动需要数百微秒到数毫秒。HFRCO 是内部高频 RC 振荡器,可选 1~38 MHz,无需外部器件,启动仅需几微秒,但精度较差(出厂校准后约 ±1%~±3%),且频率越高功耗越大。LFXO 是外部 32.768 kHz 晶振,精度 ±20 ppm 左右,工作电流通常低于 1 µA,是低功耗 RTC 与长时间计时的首选。LFRCO 是内部低频 RC,约 32.768 kHz,功耗与 LFXO 接近甚至更低,但精度只有 ±1%~±5%,且随温度漂移明显。ULFRCO 是超低功耗内部 RC,约 1 kHz,电流可低至几十纳安,但精度极差(±30% 以上),只适合“唤醒看门狗”这类对时间精度无要求的场景。

五个时钟源:精度—功耗—启动时间权衡 功耗(相对值,向右增大)→ 精度(向上更高)→ HFXO ±10 ppm / 高功耗 / 慢启动 HFRCO ±1~3% / 中功耗 / 快启动 LFXO ±20 ppm / 低功耗 / 慢启动 LFRCO ±1~5% / 低功耗 / 快启动 ULFRCO ±30% / 极低功耗 / 快启动 选择口诀 • 要精度 → HFXO / LFXO • 要省电 → LFXO / LFRCO / ULFRCO • 要快启动 → HFRCO / LFRCO

选择策略:按任务时间尺度分层

实际工程中不要“一个时钟走天下”,而应按任务的时间尺度分层配置。第一层是“常开域”:RTC、看门狗、低频定时器,应挂在 LFXO 或 LFRCO 上,让它们在 EM2/EM3 深度睡眠下继续计数。第二层是“突发高性能域”:ADC 采样、射频收发、加密运算,需要 HFXO 或 HFRCO 提供高频时钟,用完立即关闭。第三层是“极低功耗唤醒域”:ULFRCO 驱动看门狗或极慢速唤醒定时器,让系统在 EM4 下也能周期性醒来。

一个常见的误区是:为了“省事”把系统时钟一直挂在 HFXO 上。假设 HFXO 工作电流 300 µA,而任务实际只需要每 10 秒唤醒 5 ms 做一次采样,那么占空比仅 0.05%,平均电流本可低至 0.15 µA 量级;若一直开着 HFXO,平均电流就被抬到 300 µA,相差三个数量级。正确做法是:睡眠时切到 LFXO/LFRCO,唤醒后短暂切到 HFRCO 或 HFXO,处理完再切回。

时钟门控:关掉不用的分支

Silicon Labs 的 CMU(Clock Management Unit)允许对每个外设单独门控时钟。原则很简单:不用就关。例如未使用的 USART、LEUART、I2C、TIMER,应在初始化后通过 CMU_ClockEnable(cmuClock_XXX, false) 关闭其时钟分支。门控不仅省去外设自身的动态功耗,也减少时钟树翻转带来的开关功耗。需要注意的是,某些外设(如 LEUART)在 EM2 下仍需时钟才能唤醒,这类外设不能盲目关闭,而应确认其是否处于“低功耗仍工作”模式。

分频配置:频率与功耗的平方关系

数字电路的动态功耗近似满足 P ∝ C·V²·f。电压固定时,功耗与频率近似成正比。因此把 HFRCO 从 38 MHz 降到 19 MHz,核心动态功耗大致减半;降到 1 MHz,则降到约 1/38。分频通过 CMU_ClockDivSet(cmuClock_HF, cmuClkDiv_4) 这类调用完成。但分频不是越低越好:频率太低会导致任务执行时间变长,若任务本身有实时性要求,反而可能因“跑得慢、醒得久”而增加总能耗。经验法则是:在满足截止时间的前提下,选最低可用频率,即“跑得慢一点,但跑得短一点”与“跑得快、早睡”之间取能耗最小点。

实测对比方法与示例数据

要验证配置效果,最直接的方法是在 VDD 回路串入电流表或使用 Simplicity Studio 的 Energy Profiler。测试时保持固件逻辑不变,只切换时钟源与分频,记录 EM0 运行电流与 EM2 睡眠电流。下面是一组教学示例数据(基于典型 EFM32 参数合理假设,非实测值),用于说明量级差异:

配置 EM0 运行电流 EM2 睡眠电流 适用场景
HFXO 38.4 MHz,不分频约 8.5 mA—射频收发、高速运算
HFRCO 19 MHz,不分频约 3.2 mA—中等负载任务
HFRCO 1 MHz,不分频约 0.6 mA—低速控制、传感器轮询
LFXO 32.768 kHz 驱动 RTC—约 0.9 µA长时间计时、日历
LFRCO 32.768 kHz 驱动 RTC—约 0.7 µA对精度要求不高的计时
ULFRCO 1 kHz 驱动看门狗—约 0.05 µAEM4 极低功耗唤醒

从表中可以看出:高频域每降一档频率,运行电流大致按比例下降;而低频域的选择对睡眠电流影响在亚微安级别,看似很小,但在电池供电、要求十年寿命的应用中,0.2 µA 的差异就足以决定成败。例如一颗 1000 mAh 的纽扣电池,若平均电流 1 µA,理论寿命约 114 年;若 2 µA,则约 57 年——量级差异直接体现在产品规格上。

优化顺序建议:先做时钟门控(关掉不用的外设),再选低频源(睡眠域用 LFXO/LFRCO/ULFRCO),最后调分频(运行域选满足截止时间的最低频率)。三步做完,再上 Energy Profiler 验证,通常能获得数倍到数十倍的功耗改善。
切换时钟源时要注意:HFXO 启动需要等待稳定标志(如 CMU_OscillatorReady),不能在未稳定前就切换系统时钟,否则会导致取指错误或外设异常。从 HFXO 切回 HFRCO 前,也应确认当前没有依赖 HFXO 精度的外设(如高速 USART)正在传输。

总结来说,低功耗时钟优化的核心不是“记住五个名字”,而是建立“按任务时间尺度分层、按需开关、按截止时间选频”的配置思维。HFXO 与 LFXO 提供精度,HFRCO 与 LFRCO 提供灵活与低功耗,ULFRCO 提供极限待机。把它们放在正确的位置,功耗自然就降下来了。