2. nRF芯片功耗基础

在动手优化续航之前,必须先建立一张“电流地图”:芯片在任意时刻的电流,等于当前处于工作状态的各个电源域与外设电流之和,再加上无线收发链路在特定状态下的瞬时电流。nRF 系列(以 nRF52832、nRF52840 为例)把功耗拆成几个可独立控制的层次,理解这些层次之间的开关关系,才能判断“哪一部分在偷偷耗电”。

一、系统电源域:谁在供电,谁可以被关掉

nRF 芯片内部大致分为三个供电层次。第一层是 VDD 主电源域,为 CPU、RAM、Flash、高速外设供电,是电流消耗的主体。第二层是 VDD_nRF 内核域,由片内 DC/DC 或 LDO 稳压后供给内核逻辑,DC/DC 模式在中等负载下效率明显高于 LDO,是降低运行电流的关键开关。第三层是 VBUS/USB 与 NFC 等独立域,在 nRF52840 上 USB 和 NFC 天线接口有独立的供电与检测路径,不用时应彻底关闭。

需要特别注意的是 GPIO 的漏电路径。即使外设已关闭,若某个引脚被外部电路拉高而芯片内部仍配置为输入且未使能上拉,电流可能通过 ESD 保护二极管倒灌进 VDD,形成“关不干净”的漏电。因此低功耗设计的第一步,是把未使用引脚配置为输出低电平或带明确上下拉的输入,而不是悬空。

二、外设功耗:按需开启,用完即关

外设电流的差异非常大。以 nRF52832 数据手册的典型值为参考(3V、25℃、DC/DC 开启):

外设/模块典型电流说明
CPU @64MHz 运行约 3.7mA含 Flash 访问
RADIO 发射 0dBm约 5.3mA峰值,非平均值
RADIO 接收约 5.4mA峰值
SAADC 采样约 0.2~1mA与采样率、增益有关
TWI/SPI 传输约 0.1~1mA与速率、引脚负载有关
RTC 运行约 0.3µA低频时钟域

这些数字说明一个事实:CPU 和无线是“大电流户”,外设是“中等电流户”,RTC 等低频模块几乎可以忽略。因此优化顺序通常是先压缩无线占空比,再压缩 CPU 运行时间,最后才处理外设。外设管理的核心动作是“用前初始化、用完 deinit”,例如 TWI 传输完成后调用 nrf_drv_twi_disable(),SAADC 单次采样后立即停止,而不是让它持续转换。

三、无线收发功耗:峰值高,但真正决定续航的是占空比

无线部分的电流特性与 CPU 完全不同。发射和接收都是峰值电流,持续时间由协议决定。BLE 连接事件中,一次收发可能只有几百微秒到几毫秒,但峰值可达 5~6mA。真正影响平均电流的是三个参数:连接间隔(Connection Interval)、从机延迟(Slave Latency)、每次事件的实际收发时长。

举例说明:若连接间隔为 100ms,从机延迟为 4,则从机每 5 个连接间隔才响应一次,即每 500ms 唤醒一次。假设每次事件射频活动 1ms、平均电流 5mA,则射频平均电流约为 5mA × 1ms / 500ms = 10µA。若把从机延迟改为 0,则平均电流变为 50µA,相差 5 倍。这说明无线功耗优化的主战场是“减少唤醒次数”,而不是降低单次峰值。

四、睡眠与深度睡眠:µA 与 nA 的差别

nRF 的低功耗模式分为两级。第一级是 System ON 睡眠:CPU 停止,RAM 保持,RTC、GPIO 唤醒源、部分外设仍可工作,典型电流约 1~3µA。第二级是 System OFF 深度睡眠:几乎全部电源域关闭,仅保留极少数唤醒源(如 GPIO 检测、NFC 场检测),典型电流可低至 0.3~0.5µA,但 RAM 内容丢失,唤醒后相当于复位重启。

选择哪种模式,取决于“唤醒后是否需要保留状态”。如果设备只是周期性采集并发送,且每次都可以重新初始化,System OFF 更省电;如果需要保持连接或保留 RAM 中的协议栈状态,则只能使用 System ON。很多实际项目在“连接保持”和“深度睡眠”之间做折中:断开连接后进入 System OFF,需要时再重新广播连接。

nRF 功耗层次与电流量级对照 系统电源域 VDD 主域(CPU/RAM/Flash) VDD_nRF 内核域(DC/DC) USB / NFC 独立域 GPIO 漏电路径(需处理) 外设功耗(按需开启) SAADC 0.2~1mA TWI/SPI 0.1~1mA Timer/PWM 约 0.1mA RTC 约 0.3µA 用完 deinit 无线收发功耗(峰值高,看占空比) TX 0dBm 约 5.3mA 峰值 RX 约 5.4mA 峰值 平均电流 ≈ 峰值 × 占空比(连接间隔/从机延迟决定) 睡眠与深度睡眠 System ON 睡眠 RAM 保持 · RTC/GPIO 唤醒 · 约 1~3µA System OFF 深度睡眠 RAM 丢失 · 仅 GPIO/NFC 唤醒 · 约 0.3~0.5µA nA µA mA 10mA

五、把四层串起来看:一个可复现的估算示例

假设一个 BLE 温度传感器,使用 nRF52832,DC/DC 开启,3V 供电,参数如下(示例假设,非实测):广播间隔 1s,广播事件射频活动 2ms、平均 5mA;CPU 每次唤醒处理 1ms、3.7mA;SAADC 采样 0.5ms、0.5mA;其余时间 System ON 睡眠 2µA。

计算平均电流:广播贡献 5mA × 2ms / 1000ms = 10µA;CPU 贡献 3.7mA × 1ms / 1000ms = 3.7µA;SAADC 贡献 0.5mA × 0.5ms / 1000ms = 0.25µA;睡眠贡献 2µA。合计约 16µA。若使用 200mAh 纽扣电池,理论续航约 200mAh / 0.016mA ≈ 12500 小时,约 520 天。这个估算说明:在低占空比场景下,睡眠电流和广播占空比共同决定续航,而 CPU 和外设的贡献相对较小。

判断“哪一层在耗电”的实用方法:先用 nrf_pwr_mgmt 或 __WFE() 让系统进入睡眠,测量整机静态电流;若远高于 2µA,优先检查 GPIO 悬空、外设未 deinit、DC/DC 未使能这三项。

六、关键配置与观察点

在代码层面,影响这四层功耗的关键动作包括:使能 DC/DC(NRF_POWER->DCDCEN = 1)、关闭未使用外设时钟、把未使用引脚设为输出低、合理设置连接参数、在空闲时调用 __WFE() 进入睡眠。观察手段上,可以用 nrf_pwr_mgmt 的调试引脚配合示波器看唤醒占空比,也可以用 Nordic 的 Power Profiler Kit 直接看平均电流曲线,把“睡眠—唤醒—射频—睡眠”的波形与上面的估算逐段对照,就能定位偏差来自哪一层。