3. 时钟系统与功耗:PLL、OSC、RC振荡器的功耗对比与选择策略
时钟系统,说白了就是MCU的心脏。心跳多快,功耗就有多高。但这里有个坑——很多人以为只要把主频降下来就能省电,其实时钟源本身的选择,往往比频率调整更关键。
我刚开始做低功耗项目时,就吃过这个亏。当时为了省事,全程开着PLL,结果待机电流死活降不下去。后来才发现,PLL本身就是一个功耗大户。嗯,今天我们就来掰扯掰扯,全志R系列里这几种时钟源到底该怎么选。
3.1 三种时钟源的本质区别
全志R系列MCU内部,主要有三种时钟源:
- HOSC(高速外部晶振)—— 通常是24MHz或40MHz的无源晶振
- PLL(锁相环)—— 基于HOSC倍频产生高频时钟,比如480MHz、600MHz
- RC振荡器—— 内部集成的电阻电容振荡器,分高速和低速两种
这三种东西,功耗差距有多大?我直接给你看一组实测数据:
| 时钟源 | 典型频率 | 典型功耗(@1.2V) | 启动时间 | 精度 |
|---|---|---|---|---|
| 低速RC (LOSC) | 32.768kHz | ~1-5 µA | ~10µs | ±3% ~ ±10% |
| 高速RC (HOSC内部模式) | 24MHz | ~50-100 µA | ~5µs | ±1% ~ ±5% |
| 外部晶振 (HOSC) | 24MHz | ~200-500 µA | ~1-5ms | ±10ppm ~ ±50ppm |
| PLL (倍频输出) | 480MHz | ~1-5 mA | ~50-200µs | 与参考源相同 |
看到没?PLL的功耗是RC振荡器的上千倍。你想想看,如果只是做简单的按键扫描,有必要开着PLL吗?
3.2 什么时候该用谁?
我个人习惯,把应用场景分成三类:
3.2.1 深度睡眠场景 —— 只用低速RC
这是最省电的模式。全志R系列进入standby模式后,CPU和大部分外设都断电了,只保留LOSC给RTC和唤醒逻辑用。
关键点:LOSC的精度虽然差,但做RTC计时足够了。我曾经在项目中遇到一个问题——用外部32.768kHz晶振做RTC,结果待机电流多了20µA。后来换成内部LOSC,虽然每天会慢几秒,但电池续航从3个月延长到了半年。这就是取舍。
3.2.2 轻量任务场景 —— 只用内部RC
比如定时采集传感器数据、做简单的IO控制。这时候直接用HOSC内部RC模式就够了,24MHz跑起来,任务做完立刻切回睡眠。
我的经验:内部RC的精度其实没你想的那么差。全志R系列出厂前会做校准,常温下误差通常在±1%以内。除非你要做UART通信或者需要精确计时,否则完全够用。
3.2.3 高性能场景 —— 开PLL
需要跑复杂算法、刷LCD屏幕、做音频处理时,才需要开PLL。但记住一个原则:用完立刻关。
我见过很多工程师,程序里初始化完PLL就再也不管了。哪怕CPU在空闲循环里空转,PLL也一直开着。这其实很浪费。正确的做法是:
// 伪代码示例:按需开关PLL
void do_heavy_computation() {
// 1. 打开PLL
pll_enable(PLL_PERIPH, 480000000);
clock_set_sysclk(SRC_PLL_PERIPH);
// 2. 干活
perform_fft();
update_display();
// 3. 干完活立刻切回RC,关PLL
clock_set_sysclk(SRC_HOSC_RC);
pll_disable(PLL_PERIPH);
}
3.3 时钟切换的坑
这里我要重点提醒一下:时钟切换不是瞬间完成的。尤其是从RC切到PLL,或者从PLL切回RC,中间有个过渡期。
我曾经踩过的坑:有一次做产品,在切换时钟源时没有等待时钟稳定标志位,结果系统直接死机了。后来查了半个月,才发现是切换太快,CPU在时钟还没稳定时就开始取指令,导致总线错误。
正确的切换流程应该是:
- 使能目标时钟源
- 等待时钟稳定标志位置位
- 切换系统时钟源
- 等待切换完成
- 关闭旧时钟源
全志R系列的BSP里其实有现成的API,但很多人图省事直接操作寄存器跳过了等待步骤。嗯,这里我建议你还是老老实实调用官方接口,别自己造轮子。
3.4 选择策略总结
说了这么多,最后给个简单粗暴的选择策略:
- 待机/休眠 → 只用LOSC,其他全关
- 轻量工作(< 24MHz) → 用内部RC,别开PLL
- 中等负载(24-200MHz) → 用外部晶振直通,或者低倍频PLL
- 高性能(> 200MHz) → 开PLL,但用完立刻切回RC并关PLL
你想想看,如果每个任务都能按这个策略来,整体功耗至少能降30%-50%。我做过一个温湿度采集项目,用这个策略,两节AA电池撑了两年多。
最后说一句:时钟系统是低功耗设计的起点,也是最容易出问题的地方。别小看这几微安、几毫安的差别,积少成多,电池续航就是这么抠出来的。