
做低功耗硬件这些年我拿到一颗芯片第一件事就是翻休眠电流。原因很简单纽扣电池设备能不能撑一两年往往不取决于芯片跑起来有多强而取决于它睡下去之后有多省。最近Nordic这颗新芯片的公开数据就很抓人眼球休眠电流不到50nA按这个底电流连续放一年一整年才消耗0.438mAh。对做电池供电产品的工程师来说这已经接近“物理关断状态的极限漏电”了。这篇内容我会把数据怎么算、为什么难做到、怎么实测、怎么在真实电路里守住这个量级一层层拆开讲最后还会结合低功耗蓝牙场景里的NimBLE移植聊聊落地细节。如果你也正被“智能标签待机几个月就没电”“温湿度计换电池换到手麻”这类问题困扰那这里的思路可以直接拿去做参考。1. 数据背后的算术题50nA和0.438mAh到底意味着什么1.1 先来建立对nA这个单位的直觉50nA到底有多小很多人其实没有概念。这里先理一下电流单位1mA等于1000µA1µA又等于1000nA所以50nA就是0.05µA也就是0.00005mA。单看数字还是抽象我习惯拿实际设备做参照。传统低功耗MCU的深度睡眠电流普遍在几µA级别能做到几百nA已经算相当优秀。而50nA相当于把上一代“优秀”的数字再往下压一到两个数量级这个跨度不是靠软件省出来的而是芯片硬件架构本身的进步。另一个参照物是电池自放电。一颗常见的CR2032纽扣电池容量大约220mAh内阻、自放电率决定了它即便完全不接负载放两三年也可能自然耗尽。当芯片的睡眠电流低到几十nA以后它反而不再成为决定电池寿命的主要因素真正的限制变成了电池本身的化学衰减和外部电路漏电。这给产品设计带来的含义是你别光盯着芯片标称值得把整板的漏电路径全部控制好否则芯片省下来的nA级功耗轻易就会被外围电路吃掉。1.2 0.438mAh是这么算出来的标题里那个0.438mAh底层其实就是一个很直接的乘法50nA等于0.00005mA乘上一天24小时再乘上一年365天结果就是0.438mAh。也可以用nAh来算50nA乘以8760小时等于438000nAh再除以1000就是0.438mAh。这个计算过程没什么高深的但它背后的工程含义值得展开。拿一个典型的低功耗蓝牙温湿度标签举例。CR2032容量按220mAh算芯片如果整年都处于休眠消耗的0.438mAh只占电池容量的约0.2%。也就是说就算再加上偶尔的唤醒、蓝牙连接、传感器采样只要活动频次控制得当一颗纽扣电池撑一两年是非常现实的目标。很多“每15分钟上报一次数据”的小产品之前做不长续航核心瓶颈往往就卡在待机底电流太高。现在底电流被压到这种程度整个功耗预算结构就变了省电的重点不再是怎么压芯片而是怎么设计好唤醒调度和外围电路。1.3 休眠电流低不等于整板待机功耗就低这里必须提醒一句芯片标称的“休眠电流低于50nA”是在特定电压、特定温度、特定配置下测出的极限值它不等于你成品整板的待机功耗。我见过不少开发者看到芯片低功耗参数漂亮默认自己做出来的板子也会一样省电结果实测偏高几十上百倍然后回头质疑芯片参数造假。真相往往很简单板上有一颗静态电流几µA的LDO、两个GPIO外接了10kΩ上拉电阻、一颗传感器睡眠电流800nA任何一项都比芯片的50nA大得多。所以把“芯片休眠电流低”直接等同于“整机待机功耗低”是新手最容易踩的误判。正确的态度是认可这颗芯片的潜力同时把系统级睡眠电流当成一个独立的设计目标来抓。芯片提供了好的下限但它不会替你把外围电路的漏电也省掉。2. 为什么nA级休眠电流这么难做到2.1 芯片内部那些偷偷耗电的地方要理解50nA为什么值得关注得先弄明白芯片内部有哪些东西天生就在漏电。第一个是时钟源一颗32.768kHz低速晶振的起振和维持电路功耗虽然不高但跟nA级目标比起来仍然是大数目。芯片用内部低频RC振荡器能省电但精度差很多协议栈对定时精度有要求必须依赖外部晶振于是晶振电路一直在跑休眠电流就很难压下来。第二个是电压调节器。芯片内部逻辑供电通常要靠LDO或者DC-DC这些电源电路即使空载也有静态电流。新一代低功耗芯片普遍引入低压差模式或者支持让部分模块在睡眠时直接断开稳压器供电就是为了省掉这部分成本。第三个是数字逻辑的漏电。晶体管在关断状态并不是绝对绝缘亚阈值漏电每一颗都很微小但一颗SoC里有数以亿计的晶体管加总起来就非常可观。这也是先进工艺制程能显著改善休眠电流的关键原因工艺越老漏电越难压。第四个是RAM保持。要保留数据就得持续给存储阵列供电RAM容量越大保持电流越高。所以现代低功耗芯片会把RAM切成多个bank深度睡眠时只保留必要的部分不用的全部断电。第五个是GPIO和外设偏置。引脚悬空、模拟比较器、内部上拉电阻、温度传感器偏置这些平时不起眼的功能在nA级测量里全都可能变成漏电来源。把这五类漏电叠加起来传统芯片能压到几百nA已经是极限。想做到50nA意味着所有漏电项都要同步压到极低这不是单纯优化某一模块能做到的。2.2 从nRF52到新一代这代芯片靠什么把漏电压到极限以Nordic为参照印象中nRF52系列在System OFF模式下的典型电流也就0.3µA左右也就是300nA上下这在BLE市场里已经算相当能打。到了nRF54这一代公开资料和开发套件的实测反馈都把System OFF电流推进到了50nA这个量级。这背后不只是工艺节点进步的功劳更关键的是芯片内部电源域管理做得更细了RAM可以按bank独立断电射频前端可以完全下电通信协议栈在睡眠时能关掉所有不必要的外设时钟甚至部分必须常供电的功能被单独放进了超低功耗域。你可能觉得这些靠软件也能实现其实不完全对。上一代很多MCU即使在软件里关掉了所有外设芯片内部仍有一些模拟电路固定上电用来实现快速唤醒、电平监测等功能。新一代芯片把这些电路也纳入了可关断范围等于从硬件层面给了软件更大的操作空间。这类优化属于芯片架构级别的改动不是刷一个SDK补丁就能追上的。所以看到50nA这个数字时我的第一反应是这台芯片内部确实做了不少狠功夫。2.3 温度、电压、工艺nA级别的漏电十分“娇贵”这里还要解释一个很多人对nA级数字的误解半导体漏电和温度是指数关系。PN结的漏电流会随温度升高快速增长工程上有个粗略经验温度每升高大约10℃漏电流可能翻一倍。假设芯片在25℃下测出50nA把环境温度拉到45℃漏电可能会涨到200~300nA甚至更高反过来在低温环境漏电流又可能比标称更低。工作电压也有类似影响VDD越高漏电路径上的压差越大整体漏电越明显。所以芯片datasheet里的低功耗数字通常会标注测试条件和电源电压。做产品设计时不能用25℃、额定电压下的标称值直接代替全温区指标。如果设备可能放在户外暴晒的场合或者电池电压在寿命末期偏高必须用实测数据反推续航而不是拿实验室里最好看的数字做宣传。这个差异在µA级时代大家还不太在意到了nA级就会被明显放大。3. 测量50nA这件事本身就是技术活3.1 为什么普通万用表测不了nA级电流很多人拿到板子第一步会掏出万用表去测功耗这是个很自然的动作但结果通常不靠谱。拿常见的Fluke 87V来说它电流档的最高分辨率大概在0.1µA也就是100nA测50nA时读数基本就是0或者被噪声带得乱跳。更麻烦的是万用表电流档串进电路时是有内阻的µA档的内阻可能高达几kΩ甚至几十kΩ这个内阻会在供电回路上产生额外压降。对一颗工作电流只有几mA的芯片来说这点压降可能触发欠压复位也可能让内部电源管理电路误判状态最终测出来的数据既不准又不可复现。专业低功耗验证要用更高精度的设备。常见的方案有Keysight B2985A这类静电计能测到pA甚至fA级但价格和使用门槛都比较高更接地气的是Nordic的Power Profiler Kit 2也就是PPK2它自带可编程电源和高速电流采样专门为这类型嵌入式调试场景设计能覆盖nA到几百mA的动态范围。用这类设备测出来的曲线才有资格拿去和datasheet上的标称值做对比。3.2 用PPK2一类专用设备实测的正确姿势我自己用PPK2做过不少低功耗验证流程大致是这样先规划测试边界把开发板上跟功耗测试无关的部分全部隔离。开发板上的USB转串口芯片、电源指示灯、电平转换电路每一个都在持续耗电哪怕只多出几百µA都会毁掉整个测量。如果必须在完整产品板上测至少要把这些模块的跳线或者使能引脚断开。第二步是设置PPK2的输出电压尽量贴合真实供电场景。目标用3V纽扣电池就设3.0V别为了偷懒用5V供电电压不同漏电数据完全不一样。第三步是把目标固件刷好让设备进入设计的睡眠模式然后观察电流曲线。观察时间不能太短至少要覆盖几个完整的唤醒周期。有的设备进入睡眠后需要一段稳定时间只看一两秒很容易错过真实的底电流。第四步是记录睡眠段的最小电流、平均电流以及每次唤醒尖峰的幅值和持续时间这些数据要填进功耗预算表才有意义。最后对同一状态多测几次取稳定值nA级测量受温湿度、电源噪声影响很大一次读数没有代表性。3.3 抓电流曲线时最容易被忽略的三个环境干扰实际测试里我碰到最多的不是设备问题而是环境干扰导致的数据“漂移”。第一个干扰源是测试线缆和探头电容。睡眠唤醒瞬间电流变化本身就快线缆的寄生电容会把尖峰抹圆波形失真后你就看不清楚设备到底醒了多久、尖峰多大。解决办法是尽量缩短连线或者使用同轴探针。第二个干扰源是环境中的射频信号。芯片即使处于睡眠射频前端如果没有彻底关闭旁边突然来一个强BLE广播也可能把它唤醒电流曲线上就会多出一段不应该出现的活动毛刺。第三个干扰源是温度。手摸一下芯片、灯光直射、空调风口对着板子吹都能让nA级读数产生明显漂移。低功耗测量讲究环境稳定我会固定在一个室温、无风、无强电磁干扰的角落做对比测试数据才谈得上可复现。4. 把整板漏电压到nA级硬件和软件共同协作4.1 硬件侧按优先级排查的外部漏电路径芯片做到了50nA但外围电路分分钟贡献出几个µA。我把容易漏电的外部路径按优先级列了一遍基本就是一套排查顺序。首先是电源路径上的线性稳压器和DC-DC。很多LDO的静态电流高达几十到几百µA睡眠时如果没法关断整板的功耗指标直接报废。解决办法是选用静态电流更低或者带shutdown引脚的型号必要时用负载开关把供电彻底切断。其次是外部上下拉电阻。一颗10kΩ电阻在3V电压下持续耗电300µA就算换成一颗1MΩ电阻也还有3µA这跟50nA相比依然差了两个数量级。低功耗设计里能用芯片内部弱上拉/弱下拉就别用外部电阻能用代码配置引脚状态就别依赖硬件固定电平。第三是分压电阻网络做电池电压检测时常用两颗电阻串联分压总阻值哪怕做到1MΩ在3V下也有3µA持续消耗睡眠时必须用MOS管或者模拟开关把这串分压电阻断开。第四是传感器和外围IC的sleep电流很多MEMS传感器睡眠电流在0.5µA到5µA之间比芯片高一到两个数量级如果睡眠时不需要它工作就用GPIO控制它整个电源域。第五是PCB表面漏电。助焊剂残留加上潮湿空气在高阻抗节点之间会形成微弱电流通道这对nA级系统来说是很隐蔽的坑产品量产后要考虑清洗和三防涂覆。4.2 软件侧睡眠模式配置最容易犯的错硬件堵完软件如果没配对一样白搭。日常调试中我见过的软件问题集中在这么几个地方。第一个是睡眠模式选错。很多芯片有普通浅睡和深度睡眠之分浅睡模式下CPU停了但RAM、外设时钟、电源域还在工作待机电流自然高。追求极致低功耗就要进System OFF这类深层睡眠虽然唤醒代价是重新初始化但漏电最低。开发阶段经常发现设备根本没进入预期深度睡眠而是停在了默认的浅睡状态。第二个问题是GPIO没处理。睡眠前如果不把所有未使用的GPIO设置成确定电平这些悬空引脚就会成为漏电来源。正确做法是逐个检查引脚配置拉到输出低电平或者启用内部弱下拉让它有一个稳定的状态。第三个问题是不用的外设时钟没有全部关闭包括定时器、ADC、通信外设甚至调试接口。SWD、ITM这类调试功能如果保持使能会持续产生电流。量产固件里记得把调试接口关掉。第四个问题是唤醒源配置不合理。比如不小心开了一个周期唤醒的RTC结果设备每秒醒一次电流曲线上就会出现连续的台阶而不是平直线平均功耗被拉高好几倍。4.3 从原理图阶段就做一张睡眠电流预算表这件事是我做低功耗项目以来觉得最有效的一步。原理图评审阶段把每一个电源域、每一个IC、每一组上下拉电阻的睡眠电流逐项列出来加总得到理论上的整板睡眠电流。举个例子芯片50nA传感器sleep电流1µA外部上拉电阻3µALDO静态电流5µA加起来大约是9.05µA。这个数字在画板之前就能算出来够不够支撑电池年续航一目了然。等板子拿回来实测再拿这张预算表去对照哪一项对不上就重点排查哪一项。我踩过最典型的坑是板子的休眠电流实测比预算高了整整20倍从表里逐项排查才发现是一颗LED的偏置电阻在睡眠状态下还被误接在电源上。设计阶段如果提前做了这张表这个问题在原理图评审时就能发现能省下一轮改板时间。5. 低功耗蓝牙场景的实战配合NimBLE移植到Nordic芯片5.1 为什么移植NimBLE会直接影响睡眠底电流BLE产品里睡眠电流好不好很大程度取决于协议栈在连接事件和广播事件之间是否真的“睡到底”。官方SoftDevice的兼容性和稳定性都不错但有些场景下你想裁剪、想看源码、想精细控制睡眠流程就会考虑用NimBLE。NimBLE的问题是它在不同硬件平台上的移植需要自己接底层。移植得不好最容易出现的现象就是连接事件结束后应该关闭的射频和外设时钟没有关干净或者RTC仍然高频触发导致设备根本睡不进去。把NimBLE移植到Nordic芯片上本质就是在做“让上层BLE协议逻辑和Nordic底层硬件资源对齐”这件事绕不开厂商驱动。如果你发现移植之后设备功耗比预期高先别怀疑NimBLE本身多半是底层硬件回调没有正确处理射频该关没关时钟该停没停。5.2 移植时要对接的Nordic厂商函数我这些年做NimBLE移植到Nordic芯片经常要打交道的底层函数主要分布在五个方向。第一个是时钟和RTCNimBLE的事件调度依赖系统时钟尤其需要低频时钟作为协议定时基准涉及nrf_clock_lfclk_start、nrf_rtc_enable、nrf_rtc_cc_set这一类的接口。第二个是射频收发BLE链路层最终要落到Radio硬件上会涉及nrf_radio或者协议栈封装好的LL层接口不同SDK版本函数名会有差别但核心职责不变设定收发的频率、功率以及开启和关闭射频。第三个是电源管理。睡眠前关闭射频、关闭高频时钟、进入低功耗模式通常涉及nrf_power相关接口。要注意的是PPI模块也很关键它能让外设事件直接触发任务而不经过CPU这是低功耗睡眠唤醒路径中的重要一环。第四个是GPIO和唤醒源。按键、传感器中断这类唤醒引脚要通过nrf_gpio配置同时要留意睡眠期间这些引脚是否有确定电平。第五个是非易失存储。蓝牙地址、配对信息需要掉电保存会用到nrf_nvmc或者Nordic的Flash访问接口。需要说明的是具体函数名会随nrfx版本、NimBLE版本和移植方式变化近年还有Mynewt HAL层做了封装。真正的重点是记住映射关系NimBLE负责协议逻辑所有硬件动作最终都要落到Nordic的Radio、时钟与RTC、PPI、Power、GPIO、Flash这几个模块上。5.3 一种可复用的低功耗BLE唤醒策略做传感器节点我很推荐“平时深度睡眠定期或者按需唤醒上报”的架构。比如每15分钟醒来一次起来之后连接网关、发送数据、然后继续睡。这种模式对BLE协议栈的要求是睡觉之前协议栈必须干净退出不能留着后台任务持续占用RTC和射频。结合NimBLE的具体做法是在睡眠前停止广播或者断开连接把射频相关外设全部关闭再进入深度睡眠唤醒之后重新初始化协议栈发起广播或者重建连接。这里有个产品层面的取舍需要想清楚深度睡眠意味着无法保持连接所以“在线实时可控”和“超低功耗”天然冲突。如果你要求设备随时能被服务器连上就得拉长广播窗口或者缩短连接间隔牺牲一部分睡眠时间换取实时性。这个权衡没有标准答案完全取决于产品形态。但如果你做的正好是周期上报类设备那这套策略基本可以直接照搬。5.4 用一组数据算出电池寿命的真实边界我觉得最有说服力的还是实际算一笔电池账。假设一个BLE温湿度传感器每小时醒一次每次醒来连接网关并发数据射频平均工作电流5mA持续时间3ms。那么射频活动折算到整个小时里的平均电流贡献是5mA乘以3ms再除以3600秒大约是4nA。再加上50nA的睡眠底电流整机平均电流大约54nA。每次活动时间就算放宽松到10ms折算下来也不过14nA加上底电流仍然不到70nA。这样一颗220mAh的CR2032理论上放电时间会非常长实际最终限制续航的反而是电池自放电、高温下的漏电增长以及外围电路的微小泄漏而不是BLE通信本身。这个结论对做无线传感器的人挺有启发产品续航不够时别急着怀疑射频消耗太大先确认睡眠期间到底有没有真正省下电。6. 实测与产品化阶段的排障实录6.1 一测休眠电流就比标称高先查这五个地方我收到过很多类似的反馈“芯片标称50nA我实测100µA”。每次遇到这种问题排查路径基本就是这五个点。第一有没有真的进入System OFF模式。很多demo默认的睡眠只是浅睡寄存器状态一查便知。第二板上有没有外围IC没有睡尤其是LDO、运放、传感器用逐级断电法很容易定位。第三GPIO有没有悬空或者被错误电平拉住睡眠前把所有引脚状态固定一遍再说。第四调试器有没有还连着SWD、ITM持续工作会额外耗电。第五测量设备本身的内阻或者量程是否合适。每排查完一项就重测一次基本都能找到大头。这里多说一句如果你用的是带扩展板的高级开发板上面通常还挂着电平转换、LED、USB接口芯片这些都会让整板待机电流居高不下。低功耗验证一定要在一块干净的、最小系统的板子上做否则测量结果会被外围电路彻底淹没。6.2 电流曲线里的周期性尖峰意味着什么用PPK2抓出来的电流曲线如果每隔一段时间就有一个小尖峰先不用慌。这通常不代表设备坏了而是说明有东西还在周期性地工作。常见的来源包括RTC周期唤醒、传感器自动采样、内部稳压器的周期性补偿甚至是不小心开启的看门狗。处理思路是先看尖峰的频率和宽度。如果尖峰很窄、频率很低摊到整个睡眠周期的平均电流贡献可以接受那就不动它如果尖峰很宽、频率又高平均功耗就会被显著拉高这时候需要用示波器或者逻辑分析仪配合确认尖峰对应的中断源再决定是把唤醒周期拉长还是直接关闭对应功能。还有一类尖峰来自电池电压波动。当设备睡眠底电流极低而外部电源又有纹波时芯片的电源检测电路可能周期性触发产生看起来像唤醒的尖峰。这种问题在纯电池供电下通常不会出现但用桌面电源调试时很容易碰到排查时要先把电源的纹波指标确认清楚。6.3 电池寿命为什么总比算出来的短睡眠电流明明很低产品实际续航却总是达不到理论估算这个问题被问过很多次。原因通常是叠加的。第一个是电池自放电。纽扣电池和小型锂电池的月自放电率看着不高累计到一年可能就是百分之几到百分之十几。第二个是温度。半导体漏电随温度上升呈指数增长夏天户外产品的高温环境会让整板漏电明显增加这在设计阶段经常被忽略。第三个是电池容量标称值的测试条件跟实际放电条件不同。低电流放电下电池的有效容量并非严格等于标称容量倍率、温度、截止电压都会影响实际可用能量。第四个是电源转换效率。系统里如果有LDO电池电压和LDO输出之间的压差会产生额外损耗压差越大损耗越高。我的习惯是用实测平均电流乘以客户要求的寿命年数算出总容量需求再预留至少1.5到2倍的裕量选型最后根据高低温环境做系数修正。对外宣传的续航数要保守低功耗产品最怕的就是实测打脸。6.4 团队协作里最好用的低功耗检查清单最后分享一张我用了几年的检查清单每次低功耗项目评审都会过一遍芯片是否进入了目标睡眠模式RAM需要保持哪些bank所有GPIO是否有确定的电平是否有外部上下拉还在工作传感器、LDO、DC-DC、运放等外围IC的睡眠功耗是否已经计入预算分压电阻、电压检测电路在睡眠时是否断开调试接口和编程器连接是否移除测量环境是否稳定温湿度、电磁干扰是否可控电流曲线是否覆盖了完整唤醒周期平均电流是否由“睡眠底电流周期活动”组成电池自放电和温度影响是否已经算进最终续航预估。这张清单看着简单但它真的让我少踩了很多坑。有一次项目因为一个看似无关紧要的电源指示灯漏电导致整机平均电流高了三倍如果不在评审阶段逐项过一遍这种问题等到样机测试阶段才暴露会浪费好几天时间。我个人的体会是低功耗设计没有魔法。标称值再漂亮最后也必须一块一块地实测、一项一项地抠。50nA这种数字最大的价值不是拿出去给PPT充门面而是它给系统设计提供了一个足够好的下限逼着你把注意力放到外围电路、软件睡眠流程和产品真实使用场景上。如果你也打算用这类芯片做电池设备建议从第一次上电就开始记录电流曲线把每一次改动后的数据留档。做了几个低功耗项目之后你会发现决定产品续航的往往不是芯片多强而是你愿不愿意把每一个nA都当回事。