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,需要时再重新广播连接。
五、把四层串起来看:一个可复现的估算示例
假设一个 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 直接看平均电流曲线,把“睡眠—唤醒—射频—睡眠”的波形与上面的估算逐段对照,就能定位偏差来自哪一层。