2. nRF芯片电源架构与工作模式
nRF 系列 SoC(以 nRF52832、nRF52840 为例)的功耗表现,本质上由两件事决定:芯片当前处于哪个电源/工作模式,以及在该模式下哪些外设、时钟和电源域仍然开启。很多“续航不达标”的问题,并不是射频参数没调好,而是芯片长期停留在了一个本可以更省电的模式里,或者唤醒源配置不当导致频繁被唤醒。理解电源架构与模式切换,是后续所有功耗优化的基础。
一、电源域与模式总览
nRF SoC 内部大致可分为几个关键电源/时钟域:CPU 核心与高速时钟域、外设总线与低速时钟域、RAM 保持域、以及射频域。芯片通过“模式”来统一管理这些域的开关状态。Nordic 官方把工作状态划分为几个层次,最常用的是:System ON(系统开启,包含 Run、Idle、Sleep 等子状态)与 System OFF(系统关闭)。此外还有 System OFF + RAM retention 这类折中状态。
需要先明确一个容易混淆的概念:System ON 并不等于“全速运行”。System ON 是一个大状态,只要芯片没有进入 System OFF,它就处于 System ON。在 System ON 内部,CPU 可以处于 Run(运行)、Idle(空闲,CPU 停止但外设可运行)、Sleep(睡眠,等待事件)等子模式。真正决定电流大小的,是这些子模式以及外设的开关组合。
二、各模式电流消耗的典型量级
下面给出的是 nRF52832 在典型条件下的示例量级(3V 供电、25℃、DC/DC 开启、无外部负载),用于建立数量级概念,实际值请以数据手册和实测为准:
| 模式 | 典型电流(示例量级) | 关键条件 |
|---|---|---|
| System OFF | 约 0.3 µA | 无 RAM 保持,仅少数唤醒源有效 |
| System OFF + RAM 保持 | 约 1~2 µA | 按保持的 RAM 区块数量增加 |
| System ON Sleep(Idle) | 约 1.5~3 µA | RTC 运行、RAM 全保持、无外设 |
| System ON Run(CPU 运行) | 约 3~6 mA | 64MHz 主频,取决于代码与外设 |
| 射频发射/接收 | 约 5~15 mA | 取决于发射功率与射频活动 |
从这张表可以看出一个关键结论:Sleep 与 Run 之间相差约三个数量级。因此,续航优化的核心思路不是“把 Run 模式电流压低一点”,而是“让芯片尽可能长时间待在 Sleep 或 System OFF,并减少被唤醒的次数与时长”。
三、唤醒源配置
不同模式支持的唤醒源不同,这是配置时最容易出错的地方。System ON 的 Sleep 模式几乎支持所有中断源唤醒:GPIO(DETECT 信号)、RTC、定时器、比较器、射频事件、串口事件等。而 System OFF 只支持极少数唤醒源:GPIO DETECT 信号和 NFC 场检测(部分型号),并且唤醒后芯片会复位重启,程序从 main 重新执行。
配置 GPIO 唤醒时,需要设置引脚为输入,并使能 DETECT 信号,同时指定触发沿(高电平、低电平、上升沿、下降沿或任意变化)。例如让一个按键在按下时把芯片从 System OFF 唤醒:
// 配置 P0.13 为输入,并使能 DETECT
nrf_gpio_cfg_sense_input(13,
NRF_GPIO_PIN_PULLUP,
NRF_GPIO_PIN_SENSE_LOW);
// 进入 System OFF,等待按键拉低唤醒
nrf_power_system_off();
这里有一个常见陷阱:如果引脚配置了上拉,而按键另一端接 GND,那么按下时引脚被拉低,应使用 NRF_GPIO_PIN_SENSE_LOW;如果配置错误,芯片可能永远无法唤醒,或者被持续唤醒。另一个陷阱是:System OFF 唤醒后是复位,所有外设和变量都会重新初始化,不能依赖唤醒前的 RAM 内容(除非使用了 RAM 保持并正确读取)。
四、模式切换的实测方法
要验证模式切换是否符合预期,最直接的方法是用电流表或功耗分析仪观察电流波形。推荐使用 Nordic 的 Power Profiler Kit II(PPK2),它可以动态测量 µA 到 mA 范围的电流,并配合 nRF Connect SDK 的采样工具使用。
一个典型的实测流程是:让芯片先运行一段代码(Run),然后进入 Sleep 等待 RTC 事件,事件触发后短暂唤醒处理,再回到 Sleep,最后进入 System OFF。在 PPK2 的波形上,你应该能看到:一段较高的 Run 电流平台、一段极低的 Sleep 电流平台、周期性的窄脉冲唤醒尖峰,以及最后降到接近零的 System OFF 电流。如果 Sleep 电流明显高于预期(例如达到几十 µA),通常说明有外设未关闭、GPIO 悬空漏电、或高频时钟仍在运行。
五、模式选择与切换的实践建议
在实际项目中,模式选择应遵循“够用即省”的原则。如果设备需要保持连接、周期性采集数据,通常使用 System ON + Sleep,让 RTC 周期性唤醒,唤醒后快速处理再回到 Sleep。如果设备是电池供电、长时间不需要工作、只靠按键或外部事件触发,则应使用 System OFF,把电流压到亚微安级。
切换时要注意几个细节。第一,进入 System OFF 前应关闭所有不需要的外设,尤其是高频时钟和射频,否则电流可能降不到预期值。第二,如果使用了 RAM 保持,要明确哪些变量需要在唤醒后保留,并正确配置保持区块,否则唤醒后数据丢失。第三,GPIO 在进入低功耗模式前应配置为确定状态,悬空引脚会因输入级漏电而增加电流。第四,唤醒后的初始化代码要尽量短,减少 Run 模式停留时间。