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 实战建议:怎么选?
好了,理论说完了,咱们来点实际的。你在项目中到底用哪种睡眠模式?
- 先算功耗预算。比如电池 200 mAh,目标续航 1 年。平均电流不能超过 200/8760 ≈ 22.8 µA。如果唤醒频率高,浅睡眠可能扛不住,必须上深度睡眠。
- 再算唤醒时间。如果设备需要 1 毫秒内响应外部事件,深度睡眠的唤醒时间可能不够。那就只能用浅睡眠,或者用「深度睡眠 + 快速唤醒协处理器」的方案。
- 别忘了 RAM 数据。深度睡眠下 RAM 数据会丢。如果你有重要状态需要保存,要么用 retention RAM(部分芯片支持),要么在睡眠前把数据存到 Flash 或 RTC 备份寄存器里。
我个人习惯的做法是:先上深度睡眠,如果发现唤醒时间或者数据保持有问题,再降级到浅睡眠。别一开始就求稳用浅睡眠,那样功耗很难降下来。
最后说一句:睡眠模式不是越深越好,适合你的场景才是最好的。你想想看,一个智能门锁,用户按一下就要立刻响应,你用深度睡眠让人等 10 毫秒?体验太差了。但一个温湿度传感器,每 10 分钟上报一次数据,不用深度睡眠就是浪费电。
嗯,这一章就到这里。下一章咱们聊聊实际测量功耗的方法,以及怎么用示波器抓唤醒电流波形。那个更有意思。