4、睡眠模式:深度睡眠与浅睡眠的区别、唤醒源配置、典型电流数据

好,咱们来聊聊睡眠模式。说实话,在低功耗设计里,睡眠模式是真正的重头戏。你想想看,一个物联网设备,99%的时间可能都在睡觉。怎么睡、睡多深、怎么醒,直接决定了你的电池能用一个月还是一年。

我个人习惯把睡眠模式分成两类:浅睡眠和深度睡眠。别被那些花里胡哨的厂商命名搞晕了,本质上就是这两类。

4.1 深度睡眠 vs 浅睡眠:到底差在哪?

浅睡眠,说白了就是「假寐」。CPU 停了,但 RAM 还在供电,外设寄存器大部分保留。唤醒速度极快,微秒级就能恢复执行。我做过一个项目,需要频繁响应外部事件,但又不想让 CPU 一直跑,浅睡眠就很合适。

深度睡眠,那是真睡。核心电压都断了,RAM 数据可能丢失(除非有专门的 retention 区域),大部分时钟都停了。唤醒时间比较长,毫秒级。但换来的是极低的功耗,有时候能低到微安甚至纳安级别。

我整理了一个对比表,你一看就明白:

特性 浅睡眠 (Light Sleep) 深度睡眠 (Deep Sleep)
CPU 状态 停止,但可快速恢复 完全断电
RAM 保持 全部保持 部分或全部丢失
外设状态 大部分保留配置 需重新初始化
典型唤醒时间 1-10 微秒 1-10 毫秒
典型电流 几十到几百微安 几微安到几十微安
适用场景 频繁唤醒、快速响应 长时间休眠、极低功耗

核心原则:能用深度睡眠就别用浅睡眠。但如果你需要保持 RAM 数据或者需要快速响应,那就别犹豫,用浅睡眠。我在项目中见过有人为了省那几微安,强行用深度睡眠,结果每次唤醒都要花 10 毫秒重配外设,反而更耗电。

4.2 唤醒源配置:谁叫醒你?

嗯,这里要注意。睡眠模式选好了,谁来叫醒你?唤醒源配置不对,设备可能永远醒不过来,或者被不该醒的事件频繁唤醒。

常见的唤醒源有这几类:

  • GPIO 中断:最常用。按键、传感器触发、外部信号变化。我建议用下降沿或上升沿触发,别用电平触发,容易误唤醒。
  • 定时器/RTC:周期性唤醒。比如每隔 10 秒醒来发一次数据。RTC 在深度睡眠下也能跑,功耗极低。
  • 通信接口唤醒:比如 UART 的 RX 引脚电平变化、SPI 的片选信号。适合做从机设备。
  • 比较器/ADC 阈值:模拟信号达到某个值就唤醒。比如电池电压低于 3.0V 时唤醒报警。

拿 Nordic nRF52 系列举个例子,配置一个 GPIO 唤醒的代码大概是这样:

// 配置 GPIO 作为唤醒源
nrf_gpio_cfg_input(BUTTON_PIN, NRF_GPIO_PIN_PULLUP);
nrf_gpio_cfg_sense_set(BUTTON_PIN, NRF_GPIO_PIN_SENSE_LOW);

// 进入深度睡眠
__WFE();
// 或者用 SYSTEM_ON 模式
sd_power_system_off();

我的经验:配置唤醒源时,一定要先确认该外设在目标睡眠模式下是否还能工作。有些芯片在深度睡眠下,GPIO 的中断功能是失效的。我曾经踩过这个坑,产品量产了才发现某些批次唤醒不了,查了三天才发现是 GPIO 的 sense 配置在深度睡眠下不生效。

4.3 典型电流数据:别信手册,自己测

说到电流数据,我得说句实话:芯片手册上的「典型值」看看就好。那是在理想条件下测的,室温、完美 PCB、没有漏电流。你实际项目里,能跑到手册值的 80% 就算不错了。

我整理了一些常见芯片在两种睡眠模式下的实测数据(基于我自己的开发板):

芯片型号 浅睡眠电流 深度睡眠电流 备注
nRF52832 ~400 µA ~1.5 µA (无 RTC) 开启 RTC 约 2.5 µA
ESP32 ~800 µA ~10 µA (ULP 协处理器) 深度睡眠保留 RTC 内存
STM32L0 ~200 µA ~0.5 µA (Stop 模式) Standby 模式更低
DA14531 ~100 µA ~0.2 µA 专门为低功耗优化

注意:这些数据是在 3.3V 供电、25°C 环境下测的。温度升高 10°C,漏电流可能翻倍。另外,PCB 上的上拉电阻、电源芯片的静态电流,都会吃掉你的功耗预算。我曾经有个项目,芯片深度睡眠只用了 2 µA,但板子上的 LDO 静态电流就吃了 5 µA,白忙活一场。

4.4 实战建议:怎么选?

好了,理论说完了,咱们来点实际的。你在项目中到底用哪种睡眠模式?

  1. 先算功耗预算。比如电池 200 mAh,目标续航 1 年。平均电流不能超过 200/8760 ≈ 22.8 µA。如果唤醒频率高,浅睡眠可能扛不住,必须上深度睡眠。
  2. 再算唤醒时间。如果设备需要 1 毫秒内响应外部事件,深度睡眠的唤醒时间可能不够。那就只能用浅睡眠,或者用「深度睡眠 + 快速唤醒协处理器」的方案。
  3. 别忘了 RAM 数据。深度睡眠下 RAM 数据会丢。如果你有重要状态需要保存,要么用 retention RAM(部分芯片支持),要么在睡眠前把数据存到 Flash 或 RTC 备份寄存器里。

我个人习惯的做法是:先上深度睡眠,如果发现唤醒时间或者数据保持有问题,再降级到浅睡眠。别一开始就求稳用浅睡眠,那样功耗很难降下来。

最后说一句:睡眠模式不是越深越好,适合你的场景才是最好的。你想想看,一个智能门锁,用户按一下就要立刻响应,你用深度睡眠让人等 10 毫秒?体验太差了。但一个温湿度传感器,每 10 分钟上报一次数据,不用深度睡眠就是浪费电。

嗯,这一章就到这里。下一章咱们聊聊实际测量功耗的方法,以及怎么用示波器抓唤醒电流波形。那个更有意思。