4. 时钟系统与功耗
在MCU低功耗设计中,时钟系统往往比电源域更早决定整机功耗的下限。CMOS电路的动态功耗近似满足 P = C·V²·f,其中频率 f 与功耗成正比,因此“让不需要工作的模块没有时钟”比“让它们工作在低频”更有效。理解时钟树、分频、门控、低功耗振荡器与时钟切换策略,是构建低功耗硬件系统的第一道关口。
一、时钟树:从源头到末端的功耗路径
MCU内部时钟通常由多个源头汇聚到一棵“时钟树”上:高速外部晶振(HSE)、内部高速RC(HSI)、锁相环(PLL)、低速外部晶振(LSE,常为32.768kHz)、内部低速RC(LSI)。这些源经过选择器、分频器、门控单元,最终分发到CPU内核、总线、外设和定时器。时钟树上的每一个节点都对应一个可配置的开关或分频比,因此它既是频率分配图,也是功耗控制图。
设计时应先画出目标MCU的时钟树,标注每个分支的源、分频比、门控位和对应外设。常见误区是只关注系统主频,却忽略了总线时钟(AHB/APB)与外设时钟的独立分频——很多时候CPU降频收益有限,而关闭未用外设时钟能立刻省下数毫安。
二、分频与门控:最直接的两把功耗刀
分频器把高频时钟按整数比降低,直接线性降低动态功耗。例如系统时钟从 72MHz 降到 8MHz,CPU 动态功耗约降至 1/9。但分频并非越低越好:过低频率会拉长唤醒响应时间,也可能使某些外设(如USB、CAN)无法工作。因此分频策略应遵循“够用即降”的原则。
门控则是把时钟“关掉”。MCU通常为每个外设提供独立的时钟使能位,未使用的外设必须关闭其时钟。以STM32为例,通过RCC寄存器控制:
// 使能 GPIOA 与 USART1 时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN;
// 关闭未使用的 SPI1 时钟,降低动态功耗
RCC->APB2ENR &= ~RCC_APB2ENR_SPI1EN;
// 降低 AHB 分频:72MHz → 36MHz
RCC->CFGR &= ~RCC_CFGR_HPRE;
RCC->CFGR |= RCC_CFGR_HPRE_DIV2;
三、低功耗振荡器:源头的选择
不同振荡器的功耗差异巨大。高速晶振与PLL功耗通常在毫安级,而32.768kHz晶振和内部低速RC仅需微安级。低功耗场景下,应尽量让系统运行在LSI/LSE上,仅在需要高速计算时短时开启HSE/PLL,用完立即切回。
| 振荡器 | 典型频率 | 功耗量级 | 适用场景 |
|---|---|---|---|
| HSE 外部晶振 | 4~26 MHz | mA 级 | 高速通信、精确计时 |
| HSI 内部RC | 8~16 MHz | 百 µA~mA | 快速启动、低成本 |
| PLL | 倍频至 72~200 MHz | mA 级 | 高性能运算 |
| LSE 32.768kHz | 32.768 kHz | µA 级 | RTC、低功耗定时 |
| LSI 内部低速RC | ~32 kHz | µA 级 | 看门狗、低成本RTC |
四、时钟切换策略:在性能与功耗之间动态平衡
时钟切换是低功耗运行的核心动作。典型策略是“事件驱动切换”:平时系统运行在LSI低速时钟,CPU进入Sleep;当外部中断或RTC闹钟到来时,先切换至HSI/HSE并启动PLL,待时钟稳定标志(如HSIRDY、PLLRDY)置位后再提升主频执行任务;任务完成后切回低速源并再次休眠。
切换时必须等待目标时钟稳定,否则会导致总线错误或程序跑飞。以下为切换流程要点:
- 使能目标时钟源,等待其稳定标志置位。
- 配置分频器与Flash等待周期,匹配新频率。
- 切换SYSCLK选择位,确认切换完成标志。
- 关闭原时钟源或PLL,避免无谓功耗。
五、案例与复盘:一个低功耗数据采集节点
某电池供电的温湿度采集节点,要求平均电流低于50µA。初始设计使用HSE+PLL运行在72MHz,采集间隔1秒,实测平均电流约8mA,电池仅能维持数天。复盘发现三个问题:一是采集完成后未关闭ADC与SPI时钟;二是休眠时仍保持PLL开启;三是RTC使用LSI但系统时钟未切换。
优化后:采集时用HSI 16MHz短时运行,采集完毕立即关闭ADC/SPI门控并切回LSI;休眠时关闭PLL与HSE,仅保留LSE驱动RTC;将AHB分频设为/1但主频已降至32kHz。最终平均电流降至约35µA,电池寿命提升至一年以上。这个案例说明:时钟系统的功耗优化,重点不在“降多少频”,而在“关多少时钟、切多快、睡多深”。