第二讲:MCU选型与模式——低功耗架构的底层逻辑

各位工程师朋友,咱们直接进入正题。这一讲我重点聊聊MCU选型和各种睡眠模式。说实话,我在医疗贴片项目里踩过的坑,十有八九都跟这两件事有关。

2.1 三大低功耗架构对比:Cortex-M0+ / M4 / RISC-V

选MCU就像选搭档,得看它能不能陪你熬夜。我个人习惯把这三类架构放在一起比,心里才有底。

特性 Cortex-M0+ Cortex-M4 RISC-V (低功耗核)
典型功耗 (uA/MHz) 30-50 50-100 25-60
唤醒时间 (us) 1-3 3-8 2-5
运算能力 够用 带FPU/DSP 可定制
生态成熟度 ★★★★★ ★★★★★ ★★★☆☆

Cortex-M0+: 我的首选。为什么?它简单、省电、够用。做贴片测体温、测心率,M0+完全能扛。我在一个血糖贴片项目里,用M0+跑1MHz,整体功耗压到了8uA。嗯,这个数字我记得很清楚。

Cortex-M4: 如果你要做心电信号处理、加速度计姿态解算,M4的FPU能帮你省下大量CPU时间。但代价是漏电流更大。我建议:只有在需要实时计算时才选它,否则别给自己找麻烦。

RISC-V: 新秀,潜力大。我最近试了一款国产RISC-V核,休眠功耗能做到2uA以下。但坑也不少——工具链不完善,有些外设驱动得自己写。说白了,适合有团队支撑的项目。

我的经验: 贴片项目90%的场景,Cortex-M0+就够了。别为了“未来扩展”选M4,那多出来的功耗你未来还得想办法降。

2.2 睡眠模式详解:Sleep / DeepSleep / Standby

这三种模式,我当年刚入行时傻傻分不清。后来在项目里烧了几块板子才搞明白。你想想看,它们本质上是“关多少东西”的区别。

  • Sleep模式: 只停CPU时钟,外设全跑。唤醒最快,但功耗还有几百uA。适合需要频繁响应的事件,比如按键扫描。
  • DeepSleep模式: 停掉大部分时钟,只留低速时钟和必要外设。功耗能到10uA级别。我做的体温贴片,平时就待在这个模式,RTC每10秒唤醒一次采样。
  • Standby模式: 几乎全关,只留唤醒逻辑。功耗可以做到1uA以下。但唤醒后相当于复位,你得重新初始化。我曾经在Standby模式下忘了保存RTC计数值,结果时间全乱了——这个坑你们别踩。

警告: 进入Standby前,一定要把关键数据存到备份寄存器或RTC RAM里。否则唤醒后数据全丢,哭都来不及。

2.3 唤醒源配置:RTC / GPIO / 比较器

唤醒源选得好,功耗能降一半。我个人习惯按场景来配:

  • RTC唤醒: 最常用。比如每1秒唤醒一次,采集数据,然后继续睡。注意RTC时钟源要选LSE(32.768kHz),精度高、功耗低。
  • GPIO唤醒: 适合外部触发事件。比如贴片被撕下来时,一个GPIO电平变化就能唤醒MCU做紧急处理。我建议用下降沿触发,抗干扰能力强。
  • 比较器唤醒: 这个我重点说说。模拟信号超过阈值时唤醒,比ADC轮询省电得多。我在一个血氧贴片里,用比较器监测光信号,平时MCU完全休眠,只有信号来了才唤醒。功耗从50uA降到了5uA。

小技巧: 多个唤醒源可以同时使能。比如RTC定时唤醒做常规采样,GPIO紧急唤醒处理异常。但要注意中断优先级,别让它们打架。

2.4 时钟树优化:LSE / LSI / HSE

时钟是功耗的源头。你想想看,跑100MHz和跑1MHz,功耗差几十倍。所以时钟树优化是低功耗设计的核心。

时钟源 频率 典型功耗 适用场景
LSE (外部低速晶振) 32.768 kHz 0.5-1 uA RTC、定时唤醒
LSI (内部低速RC) 32-40 kHz 0.2-0.5 uA 看门狗、低精度定时
HSE (外部高速晶振) 4-25 MHz 100-500 uA 主时钟、通信

我的做法:

  • 平时用LSE跑RTC,LSI跑看门狗。这两个时钟加起来不到1uA。
  • 需要工作时,快速切换到HSE,干完活立刻切回来。
  • 千万别让HSE一直开着。我曾经有个项目,HSE忘了关,待机功耗多了300uA,查了两天才找到原因。

避坑指南: LSI精度差,温度变化时频率能漂10%以上。如果你用LSI做RTC,一天能差几分钟。所以RTC一定要用LSE,别省那0.3uA。

2.5 实战建议:一个典型的贴片功耗预算

最后我分享一个实际案例。一个心率贴片,要求电池用一年(CR2032,220mAh)。

// 伪代码:主循环
while(1) {
    // 进入DeepSleep,RTC每5秒唤醒
    enter_deep_sleep(RTC_WAKEUP_5S);
    
    // 唤醒后:采集心率数据(耗时50ms)
    heart_rate_sample();
    
    // 处理数据(耗时20ms)
    process_data();
    
    // 蓝牙发送(耗时100ms,每30秒一次)
    if (send_flag) {
        ble_send();
    }
    
    // 继续睡
}

算下来:

  • DeepSleep平均功耗:8uA
  • 工作状态平均功耗:2mA(占空比约0.5%)
  • 总平均功耗:约18uA
  • 电池寿命:220mAh / 18uA ≈ 12222小时 ≈ 1.4年

嗯,这个方案后来量产了,实测寿命1.3年,基本符合预期。所以你看,选对MCU、用对模式、配好时钟,低功耗没那么玄乎。

最后一句: 别迷信数据手册上的“最低功耗”数字。那是在理想条件下测的。你实际跑起来,加上外设、漏电流、温度影响,至少翻一倍。留够余量,才是工程师的生存之道。