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在时钟还没稳定时就开始取指令,导致总线错误。

正确的切换流程应该是:

  1. 使能目标时钟源
  2. 等待时钟稳定标志位置位
  3. 切换系统时钟源
  4. 等待切换完成
  5. 关闭旧时钟源

全志R系列的BSP里其实有现成的API,但很多人图省事直接操作寄存器跳过了等待步骤。嗯,这里我建议你还是老老实实调用官方接口,别自己造轮子。

3.4 选择策略总结

说了这么多,最后给个简单粗暴的选择策略:

  • 待机/休眠 → 只用LOSC,其他全关
  • 轻量工作(< 24MHz) → 用内部RC,别开PLL
  • 中等负载(24-200MHz) → 用外部晶振直通,或者低倍频PLL
  • 高性能(> 200MHz) → 开PLL,但用完立刻切回RC并关PLL

你想想看,如果每个任务都能按这个策略来,整体功耗至少能降30%-50%。我做过一个温湿度采集项目,用这个策略,两节AA电池撑了两年多。

最后说一句:时钟系统是低功耗设计的起点,也是最容易出问题的地方。别小看这几微安、几毫安的差别,积少成多,电池续航就是这么抠出来的。