经常做低功耗蓝牙项目的人对“休眠电流”这四个字应该又爱又恨。爱是因为它直接决定电池能撑多久恨是因为想把它做低牵涉的环节实在太多。最近看到 Nordic 新芯片宣传页上的数据还挺感慨休眠电流不到 50 nA算下来连续放一年也才消耗 0.438 mAh。这组数字放在低功耗蓝牙 SoC 里确实称得上夸张。这颗芯片解决的是物联网设备最核心的痛点能不能用纽扣电池跑几年。过去我们做 BLE 传感器节点休眠电流能做到 2µA 已经算不错日常项目里 5µA 也常见。如果方案能把休眠部分压到 50nA 级别那么设备的大部分时间都处于“关机但不完全关机”的状态整机寿命几乎完全由唤醒时间、射频通信和自放电决定。这篇文章我想从功耗数据怎么算、硬件上怎么逼近、以及 NimBLE 协议栈移植时要用到哪些 Nordic 厂商函数这几个方面把这类超低功耗 BLE 项目的思路完整梳理一遍。适合正在做可穿戴、资产追踪或者长续航传感器节点的人参考。1. 0.438 mAh 是小学数学但 50 nA 是真正的半导体工程1.1 电池年消耗的账先要算明白先把这个数字背后的计算过程说清楚。50 纳安等于 50×10⁻⁹ 安培一年的小时数是 8760。两者相乘50×10⁻⁹ A × 8760 h 438×10⁻⁶ Ah 0.438 mAh也就是说如果有个设备全年 365 天、每天 24 小时都只处于这种深度休眠状态一年消耗的电量只有 0.438 mAh。拿一颗 100 mAh 的纽扣电池做粗略估算仅休眠这一项就能撑 228 年。当然实际电池有自放电MCU 也有唤醒和通信的消耗但至少能看出休眠电流对系统续航的贡献是决定性的。这里有个容易被忽略的点芯片厂商宣传的“休眠电流”往往不是所有外设接通、内部稳压器全开的状态。以 Nordic 的芯片为例真正能摸到 50nA 这一档的通常是 System OFF 模式也就是说内部数字核心几乎完全断电、RAM 不保持、低频时钟不跑只保留 GPIO 唤醒、比较器唤醒和少数复位引脚。如果你还需要 RTC 在休眠时继续计时那就得进入 System ON 模式电流会直接跳到微安级。所以拿到数据手册先别高兴得看是哪一档休眠状态、外部有没有额外负载。注意厂商给的 nA 级电流都是“特定测试条件下的典型值”。实际产品中PCB 上任何一颗外部分压电阻、传感器漏电、甚至助焊剂残留都可能比芯片本身的休眠电流大几十倍。1.2 做到纳安级的代价哪些电路必须从睡眠里剔除芯片要把休眠电流做到 50nA 这种量级本质上是要把“不干活时的漏电”压到极限。漏电来源主要有几类内部线性稳压器或 DC-DC 的静态功耗带隙基准源的维持电流所有 GPIO 引脚的上拉/下拉电阻调试接口和复位电路的分压电流寄存器、RAM 和缓存单元的亚阈值漏电过去很多低功耗 MCU 在休眠时还保留内部 LDO因为这样唤醒速度快但代价是 LDO 本身要吃掉几百纳安甚至几微安。新架构的做法是反着来深度休眠时把这些模拟前级全部关掉只保留一条极低泄漏的电源路径给唤醒逻辑。对比一下工程经验早期我们用某款经典 BLE 芯片做资产标签System OFF 模式手册写 0.3µA实测加上外部 LDO 待机功耗以后变成 2.1µA。后来把外部 LDO 换成了负载开关、又把传感器电源彻底切断才降到 0.8µA。现在这颗新芯片把芯片自身的底数打到 50nA留给了外围电路更大的容错空间但实际上外围设计稍微随意一点50nA 就会被淹没整机照样还是微安级。2. 硬件上如何逼近 50nA测量与外设是两道真正的坎2.1 测量仪器和接线方式决定了你看到的数据很多工程师第一次测 nA 级电流时会在万用表上栽跟头。普通三位半万用表的 nA 档分辨率看着够用但接线接触电阻、表笔之间的漏电、还有测量时给被测设备造成的电压跌落都会让读数失真。我的建议是如果项目确实要做 nA 级休眠调优至少准备一台带“电流源自动量程”功能的台式数字源表或者一台低到 pA 级的静电计。测量时把仪器串联在电池和开发板之间并且要特别留意启动瞬间的浪涌如果设备刚上电时有一段时间在运行电流可能到毫安级源表需要能在 nA 档和 mA 档之间快速切换不然会被电容充电电流误导。测量步骤也很有讲究。我常用的方法先将板子完全断电在电源路径上串联一个 100Ω 采样电阻。用示波器观察电阻两端电压确认设备进入休眠后电压稳定。再把采样电阻换成 10kΩ通过万用表毫伏档换算电流。确认睡眠状态稳定后改用 nA 档直接跨接测量记录 10 分钟以上的平均值。这样做的好处是能同时看到动态电流和稳态电流。一个很容易踩的坑是拿万用表直接测休眠电流刚接通那一刻看到数值很高就以为是芯片没睡好。其实电源路径上的滤波电容在充电等 5 分钟再看才会稳定。所以测 nA 级电流一定要有耐心让设备在休眠状态下稳定足够长时间。2.2 外围电路会把好芯片拖回微安级一颗芯片自身休眠 50nA不代表整机休眠也是 50nA。下面这些外围器件每一样都在偷电锂电池电量计芯片很多电量计自己的待机电流就有几微安如果设备对电量百分比不是刚需宁可不去用它。传感器使能引脚加速度计、气压计如果直接从 VCC 供电即使处于待机也可能吃掉 1µA 以上。应该把传感器的电源接到 MCU 的 GPIO 控制的负载开关上休眠前把负载开关关断。分压电阻电池电压检测电路里常用的 1MΩ1MΩ 分压在 3V 电池下就有 1.5µA 漏电。想省电要么改成间歇式检测要么把分压电阻加大到 10MΩ 量级要么干脆用一个由 GPIO 控制通断的开关。GPIO 悬空脚即使代码里没配置某些 GPIO 内部会有默认状态。悬空引脚漂到中间电平会通过输入缓冲器产生穿通电流。正确做法是全部配置成输出低电平或者下拉输入。这些经验来自实际项目的“血泪史”。有一次我们做一款体温监测贴片芯片休眠电流本身只有 0.5µA但整机测出来 7.2µA。排查了整整一天最后发现罪魁祸首是板上的 NFC 天线引脚没有配置成普通 GPIONFC 检测电路一直在工作额外吃掉了几个微安。后来把引脚复用改掉整机休眠电流立刻降到 1µA 以下。3. 芯片选型谁需要为 50nA 买单谁不需要3.1 适合长期免维护设备和超低功耗可穿戴需要 50nA 级别的设备典型场景有这么几类资产管理标签货柜、托盘、工具箱里放一枚标签装一次电池用三五年期间大部分时间都在深度休眠。医疗贴片贴在身上测体温或心电不能用大电池又要求能连续工作一两周睡眠与唤醒的占比很悬殊。智能家居传感器门窗磁、人体感应、温湿度探头部署位置往往没有插座换一次电池的人工成本比电池本身贵得多。冷链运输记录仪记录温度曲线一个月甚至几个月才取回设备读一次数据。这类设备共同的特点是唤醒频率极低、单次唤醒时间短、突发数据量小。它们对休眠电流的敏感度极高把休眠电流从 5µA 降到 50nA电池寿命能提高两个数量级。3.2 不适合的场景也别硬贴反过来如果设备的屏幕常年点亮或者需要稳定维持常连接、高频进行双向数据交互那休眠电流再低也没用。因为系统大部分时间都在工作功耗的大头是运行功耗和射频功耗。这时候选型应该重点看 RX 电流、峰值电流和唤醒时间而不是只看休眠数字。所以我常把低功耗芯片选型拆成三档参考设备特征关注指标适合的芯片档位极高唤醒间隔、每天唤醒几次深度休眠电流有 nA 级 System OFF 档的芯片每分钟有传感器采集和通信RTC 待机电流 醒来工作电流休眠在 1µA 左右就够用屏幕常亮或持续音频流运行功耗 RF 功耗低功耗很重要但不看休眠数字从这个角度看Nordic 新芯片真正打动人的地方不只是 50nA 这个数字本身而是它在保持不错算力、缓存、射频性能和内存配置的前提下把休眠底数压到了这个水平。这给了产品定义更大的空间你可以在系统层面少加很多“省电旁路电路”因为芯片已经比你处理得更好。4. NimBLE 移植到 Nordic 芯片需要用到哪些厂商函数4.1 NimBLE 在 Nordic 上的存在方式NimBLE 是 Apache Mynewt 项目里的开源 BLE 协议栈包含 Host 层和 Controller 层也能以纯 Host 形式运行。很多人问“nimble 移植到 nordic 芯片上时会用到哪些厂商函数”其实答案取决于你采用哪种集成方式。用 Zephyr 系统的话NimBLE 被封装成CONFIG_BT_NIMBLE底层通过 Zephyr 的蓝牙驱动访问 Nordic 射频主要不需要你自己去碰厂商寄存器。但如果你在裸机上移植 NimBLE或者想控制底层功耗那就绕不开 Nordic 的 nrfx 驱动层和寄存器定义。在裸机环境下跑 NimBLE通常需要适配以下几类功能系统 tick 和定时器NimBLE 的 OS 层需要底层节拍Nordic 这边一般用 RTC0 或 TIMER0 提供。随机数生成器蓝牙协议栈处理地址和加密时需要随机数对应nrf_rng模块。引脚控制外部 PA/LNA 开关、状态指示灯、唤醒引脚对应nrf_gpio和nrf_gpiote。时钟管理低频时钟 LFCLK 是 BLE 协议栈的时基对应nrf_clock。电源管理休眠和唤醒对应nrf_power。硬件存储绑定信息、Flash 参数保存涉及nrf_nvmc或者nrf_fstorage。看门狗长时间运行的产品需要看门狗防死机对应nrf_wdt。4.2 几个最常打交道的 Nordic 厂商函数以典型 nRF52 系列裸机代码为例你会在移植 NimBLE 的过程中频繁看到这些函数nRF54 系列 API 类似具体头文件名称可能稍有调整#include nrf.h #include nrf_gpio.h #include nrf_clock.h #include nrf_rtc.h #include nrf_power.h #include nrf_gpiote.h // 启动低频时钟这是 BLE 协议栈工作的基础 nrf_clock_lfclk_start(); // 配置只用一路 GPIO 作为唤醒源其它引脚全部置为确定电平 nrf_gpio_cfg_default(NRF_GPIO_PIN_MAP(0, 10)); nrf_gpio_cfg_output(NRF_GPIO_PIN_MAP(0, 10)); nrf_gpio_pin_set(NRF_GPIO_PIN_MAP(0, 10)); // 进入深度休眠前确保所有 GPIO 不会悬空 nrf_gpio_cfg_default(NRF_GPIO_PIN_MAP(0, 11)); // 配置 GPIOTE 事件触发唤醒 nrf_gpiote_event_configure(0, wakeup_pin, NRF_GPIOTE_POLARITY_LOTOHI); nrf_gpiote_task_enable(0); // 调用 Nordic 的系统关断函数 nrf_power_systemoff_enter();有两点必须在移植时就考虑清楚。第一NimBLE 的 OS 层会自己管理任务调度和定时器如果你用 Nordic 的 RTC 提供系统节拍那么进入 System OFF 之前一定要关闭协议栈的活动不要带着软件定时器直接掉电。第二nRF52 系列上如果既使用 SoftDevice 又使用 NimBLE等于同时存在两套协议栈的调度器直接裸写寄存器会互相干扰。所以要么选 Zephyr 让底层处理好要么在裸机上彻底不用 SoftDevice或者只把 NimBLE 当 Host、搭配 Nordic 的 SoftDevice Controller 使用。4.3 移植时要特别小心的低功耗细节NimBLE 本身提供了低功耗管理接口叫做ble_npl_eventq和ble_npl_hs的 tickless 机制。移植到 Nordic 后能不能真正发挥 50nA 休眠能力很大程度上看这些细节用ble_npl_get_current_ticks把 Nordic 的 RTC 计数转换成 NimBLE 需要的 tick。如果 RTC 时钟没启动或者中断优先级配错协议栈就会发生漂移。在进入 System OFF 前要主动调用ble_hs_stop()停止 Host 层活动或者确保所有连接都断开。唤醒后的时钟恢复要做完整LFCLK 重新启动、RTC 重新载入、GPIOTE 事件清标志缺一个都会导致第一次广播或扫描异常。Nordic 芯片默认有 NFC 引脚复用如果没通过出厂配置禁用会在休眠时引入额外电流。用NRF_UICR-NFCPINS或者直接用引脚图上的专用引脚做普通 GPIO才能在硬件上把休眠电流真正压下去。这些就是网上很多人问“nimble 移植到 nordic 芯片上时会用到哪些厂商函数”的完整答案不是某一个神秘函数而是nrf_clock、nrf_power、nrf_gpio、nrf_rtc、nrf_rng、nrf_wdt这整套驱动在协议栈层面的配合。5. 功耗调优实测笔记从 7.2µA 压到 0.5µA 的记录5.1 一次完整的低功耗调试流程去年做某个设备项目板子硬件回来后第一次测整机休眠电流是 7.2µA目标是不超过 1µA。我按一套固定的流程逐步排查这里完整记录下来供参考第一步先测芯片最小系统。把除芯片、晶振、电源、复位外的所有器件断开实测 0.6µA。这说明芯片底子没问题。第二步接回传感器模块。传感器用 LDO 单独供电LDO 的使能脚由 GPIO 控制。休眠时把 GPIO 拉低但 LDO 的输出端还留着传感器和滤波电容实测 1.8µA。原因是 LDO 使能关断后输出电容上的电荷会缓慢漏回地同时 LDO 芯片本身有反向电流通路。换成集成负载开关并让输出端彻底放电后降到 0.7µA。第三步逐个点亮指示灯、开启外部 Flash、接上电池分压检测。这些看似小功能加起来又多 0.9µA。最后把分压检测从一直工作改成每 10 秒开一次加一个 NMOS 控制通路才把整机休眠电流压回 0.5µA 左右。这套流程的核心是永远从最小系统开始逐个加入外围并测量增量而不是把整个板子一次测完再去猜。5.2 常见问题与排查技巧实录实测现象可能原因排查方法休眠电流是 0.6µA比手册典型值高外部上下拉电阻、LED 泄露、调试接口检查所有外部被动元件把调试口改成立即关闭电流从几十 nA 一阵一阵跳变设备并未真正进入 System OFF或在定时唤醒用示波器抓采样电阻电压确认唤醒周期50nA 能到但唤醒后死机唤醒源配置不正确或唤醒后时钟没恢复查 GPIOTE 事件标志恢复 LFCLK 和 RTC烧录后第一次休眠电流偏高Flash 擦写后的相关电路仍带电拔掉调试器再测关掉 IDE 的调试连接整机电流始终有 1µA 级“地板”PCB 表面助焊剂残留或电池保护板漏电洗板后重测换一个不接保护板的电池座这里有个容易被忽略的排查工具热成像仪不适合测 nA 级漏电但适合找板上是否有什么器件在持续发热。如果休眠电流异常高用热成像扫一遍往往能看到某个小器件比周围温度高一点点那个就是偷电点。5.3 写给强迫症的两条避坑建议我踩过不少坑有两条经验特别值得说。第一不要在测量回路里串联普通万用表表笔夹表笔和夹子之间的氧化层会带来几百纳安甚至微安的误差。要用镀金的、短而粗的测试引线并且尽量直接焊接到测试点。第二测休眠电流前把设备的所有调试接口都断开包括 SWD、UART 转 USB 模块因为这些外设即使不工作也可能通过电平转换芯片反向漏电。6. 低功耗是一个系统问题不是一个营销数字我个人在做完这些低功耗项目后一个很深的体会是宣传页上的 50nA 更多是展示一个公司的半导体水平自己产品能不能吃到这个红利还是得看整体设计。芯片把底数做到这么漂亮是在给产品经理和硬件工程师提供“可以做以前做不到的事情”的窗口。但这个窗口能不能打开要靠软件配合、电路设计、测量方法共同支撑。如果你接下来也要用这类 Nordic 芯片做产品我建议从三个地方入手。第一硬件设计阶段就把“休眠时谁在用电”列成一张表每个引脚、每个器件都标注休眠状态下的处理方式。第二从第一天起就建立能测 nA 级电流的测试环境别等板子回来才临时抱佛脚。第三协议栈移植部分严格区分 Zephyr 自带 NimBLE 和裸机移植两种路线先想清楚要用哪种再动手改代码。最后再分享一个实际工作中的小技巧在设计 PCB 时把电池到系统的电源路径设计成可跳线断开的中间留一个 0Ω 电阻位。调试功耗时焊上精密电流测试座正常出货时换成 0Ω 电阻。这个看起来不起眼的设计能让你在调试阶段省掉很多飞线带来的干扰直接看到产品真正的睡眠电流水平。