做电池供电的物联网产品,低功耗设计是必修课。STM32WBA62作为一颗无线MCU,低功耗模式做得非常细——从全速运行到深度睡眠,一共分了好几个档位。搞明白每个模式的功耗、唤醒时间、保留哪些资源,后面做功耗优化的时候才能选对模式。
一、为什么要分这么多低功耗模式?
很多刚接触低功耗的朋友会问:不就是睡觉吗?睡深点睡浅点有什么区别?
区别大了。低功耗设计的核心矛盾是:功耗和唤醒速度的权衡。
• 睡得越深,功耗越低,但是醒来需要的时间越长,唤醒后要重新配置时钟、外设,响应慢;
• 睡得越浅,功耗越高,但是醒来很快,几微秒就能继续跑程序。
所以芯片厂商设计了好几个档位的睡眠模式,让你根据不同的场景选最合适的。比如:
• 短暂的等待(比如等串口发完数据)→ 用Sleep模式,唤醒快;
• 几秒钟没事情做 → 用Stop模式,功耗低,唤醒也不算太慢;
• 几分钟甚至几小时才唤醒一次 → 用Standby模式,功耗最低。
二、STM32WBA62的五种低功耗模式
2.1 Run模式(运行模式)
这就是正常工作状态,CPU全速跑100MHz,所有外设都开着。
• 功耗:大概10~20mA(具体看开了多少外设)
• 特点:CPU在执行指令,所有外设都正常工作
• 适用场景:处理数据、跑算法、和手机通信的时候
2.2 Sleep模式(睡眠模式)
CPU停了,但是外设(定时器、串口、ADC)还在跑,时钟也没关。
• 功耗:大概5~10mA(主要是外设耗电)
• 唤醒时间:几微秒,非常快
• 保留资源:所有寄存器、SRAM内容都保留
• 唤醒源:任何中断(外部中断、定时器中断、串口接收等)
• 适用场景:CPU没事做了,但是还要等外设完成任务。比如等ADC采样完成、等串口发完一帧数据。
这个模式其实功耗降得不多,因为外设和时钟都还开着。适合很短时间的等待。
2.3 Stop模式(停机模式)
这个是做电池产品最常用的模式。CPU停了,时钟也关了,但是SRAM内容保留,寄存器也都保留。唤醒之后不用重新初始化,直接接着跑。
• 功耗:大概1~3uA(没开SMPS的话)
• 唤醒时间:几十微秒到几百微秒(要重新启动HSE晶振)
• 保留资源:SRAM全部保留,寄存器全部保留
• 唤醒源:外部中断(GPIO)、RTC闹钟、低功耗定时器等
• 适用场景:BLE广播间隔之间的睡眠,或者定时采集数据的场景。
这里要注意:STM32WBA的Stop模式还分深浅两种,Stop1和Stop2。Stop2关的东西更多,功耗更低,但是唤醒更慢一点。做BLE的时候,协议栈会自动选合适的模式。
2.4 Standby模式(待机模式)
这个是最深的常用睡眠模式,除了RTC和备份寄存器,其他全部关了。SRAM内容也丢了,唤醒相当于复位,程序从头跑。
• 功耗:大概0.2~0.5uA
• 唤醒时间:几毫秒(相当于冷启动)
• 保留资源:只有备份寄存器和RTC保留,其他全部丢失
• 唤醒源:RTC闹钟、外部唤醒引脚、看门狗等
• 适用场景:长时间休眠的场景,比如几个小时才采集一次数据的传感器。
这个模式虽然功耗最低,但是唤醒后要从头跑程序,初始化时间长,而且RAM里的数据全没了。所以不是越深度的模式越好,要根据实际场景选。
2.5 Shutdown模式(关断模式)
比Standby还深,连RTC都可以关掉,功耗最低能到0.1uA以下。一般消费类产品很少用到这个模式。
三、各模式功耗对比
注:以上是典型值,具体会根据开了多少外设、温度、电压有差异。如果开了SMPS开关电源,Stop模式功耗还能再降30%左右。
四、BLE场景下是怎么用这些模式的?
做BLE设备的时候,大部分时间其实是在睡觉的。比如一个温湿度传感器:
1. 平时睡在Stop模式,功耗不到1uA;
2. 每隔1秒,硬件自动唤醒,发一个BLE广播包(大概几毫秒时间,电流到十几mA);
3. 发完广播,马上又睡过去;
4. 如果手机连接了,就按连接间隔,定时醒来收发数据;
5. 没连接的时候,就一直广播+睡觉的循环。
算一下平均功耗:假设广播间隔1秒,每次广播耗电10mA持续1ms,那平均功耗大概是:
平均电流 = 10mA × 1ms / 1000ms + 1uA = 11uA
用一节CR2032纽扣电池(容量220mAh),大概能用:
电池寿命 = 220mAh / 0.011mA = 20000小时 ≈ 2.3年
这就是为什么BLE设备电池能撑很久——大部分时间都在睡觉,只有很短的时间在工作。
五、怎么选合适的模式?
• 如果等待时间 < 1ms → 用Sleep模式,唤醒快;
• 如果等待时间 1ms ~ 1分钟,而且需要保留RAM数据 → 用Stop模式;
• 如果等待时间 > 1分钟,而且RAM里的数据丢了也没关系 → 用Standby模式;
• BLE设备 → 协议栈自动管理,一般用Stop2模式。
六、功耗怎么测?三种方法对比
很多朋友做低功耗项目的时候会遇到一个问题:手册上写的是uA级功耗,实际测出来差了好多,不知道哪里出了问题。测功耗看起来简单,就是串个电流表进去嘛。但是做低功耗产品的时候,会发现几个问题:
1. 电流太小了,uA级别的,普通万用表分辨率不够;
2. 电流是动态的,一下子几uA,一下子几十mA(发BLE包的时候),万用表反应慢,读数跳来跳去;
3. 平均功耗怎么算?睡1秒,醒1ms,平均电流是多少?
所以测功耗不能只用一块万用表,要根据不同的测试场景选不同的方法。
6.1 方法一:万用表测平均电流
这是最简单的方法,适合快速估算。
接线方法:把万用表串在电源回路里——电池正极 → 万用表电流档 → 板子电源输入。注意万用表要拨到uA或者mA档位,别用错了烧表。
优点:简单,谁都有万用表;
缺点:
• 分辨率不够,好一点的万用表uA档大概是0.1uA分辨率,差一点的只有1uA;
• 反应慢,动态电流测不准,只能看平均;
• 万用表本身有压降,大概几十mV到几百mV,电池电压低的时候可能影响板子正常工作。
适用场景:大概估算一下平均功耗,比如产品做完了,测一下平均电流大概是多少,算一下电池能用多久。不适合做精细化的功耗优化。
6.2 方法二:采样电阻 + 示波器看波形
这个方法适合看动态电流的波形,能看到什么时候电流大、什么时候小。
原理:在电源回路里串一个小电阻,比如10Ω或者100Ω。电流流过电阻的时候会产生压降,用示波器量电阻两端的电压,然后根据欧姆定律 I = U/R,就能算出电流了。
比如:R = 10Ω,示波器测到电压 U = 0.1V,那么电流 I = U / R = 0.1V / 10Ω = 10mA。
采样电阻怎么选?电阻大小是个权衡:
• 电阻越大,压降越大,示波器越好测,但是损耗也大,而且可能影响板子电压;
• 电阻越小,损耗小,但是压降小,示波器测不准。
一般选10Ω~100Ω之间。如果是测uA级别的小电流,就选100Ω;如果是测mA级的大电流,就选1Ω或者10Ω。
优点:能看到电流随时间变化的波形,动态过程一目了然;可以看到BLE广播的时候那个电流尖峰是多大、持续多久;
缺点:小电流测不准,因为压降太小,示波器的底噪声可能都比信号大;要自己算,还要考虑电阻的精度、温漂。
6.3 方法三:专用功耗分析仪(推荐)
如果是做专业的低功耗产品开发,强烈建议搞一台专用的功耗分析仪。比如 Joulescope、 Nordic PPK2、 ST的STLINK-PWR这几款。
有什么好处?
1. 动态范围大,从nA级到A级都能测;
2. 自动切换量程,不会出现小电流测不准、大电流超量程的问题;
3. 实时波形显示,能看到电流随时间的变化;
4. 自动算平均功耗、电量消耗,直接告诉你电池能用多久;
5. 有些还能和示波器一样,带触发功能,比如电流超过某个值的时候自动抓波形。
我用Nordic的PPK2测了一下我们板子BLE广播的电流波形:
• 平时休眠的时候,电流大概0.8uA;
• 广播的时候,电流冲到12mA左右,持续大概1ms;
• 广播间隔是1秒,算下来平均电流大概是 12mA × 1ms / 1000ms + 0.8uA = 12.8uA。
这个和理论值差不多,说明板子的低功耗设计基本到位了。
七、测功耗的几个常见坑
7.1 GPIO漏电
最常见的问题!MCU进入低功耗模式之后,GPIO引脚如果是浮空的,或者外部电路有偏置,就会有漏电。我之前第一次测的时候,Stop模式功耗比理论值大了好多,最后发现是几个GPIO引脚没配置好,每个引脚漏了1uA,加起来就好几uA了。
解决办法:所有不用的GPIO,要么设为模拟输入,要么上下拉到确定的电平,不要浮空。
7.2 外部器件漏电
不要只盯着MCU!板子上其他器件也会耗电。比如LDO的静态电流、传感器的休眠电流、分压电阻的漏电。我之前有个板子,测出来Standby模式还有10uA,最后发现是电源那里的一个分压电阻在耗电——两个100K电阻分压,电池电压3V,那就是15uA的电流白跑了。
解决办法:做功耗测试的时候,把不需要的外设电源用MOS管切掉,只给MCU供电。或者把外部器件一个一个焊掉,看电流降到多少,就能定位是哪个器件漏电。
7.3 测量仪器本身的功耗
这个很多人忽略了。比如你用万用表测电流,万用表本身也要耗电;你用调试器连着板子,调试器的IO口也会往板子灌电流。我之前有一次测出来Stop模式有50uA,折腾了半天,最后发现是ST-Link的SWDIO引脚在那里灌电流。把调试器拔了,电流马上就降到1uA了。
解决办法:测低功耗的时候,尽量把调试器、串口这些都拔掉,只留电源。
八、功耗优化技巧
8.1 硬件设计层面的优化
8.1.1 电源架构优化
① 能用电池直供就不用LDO。STM32WBA的工作电压是1.71V~3.6V,两节AAA电池(2.0V~3.3V)刚好覆盖,直接给MCU供电,省掉LDO的静态电流(一般几uA到十几uA)。
② 用SMPS代替LDO。STM32WBA内部有可选的SMPS开关电源,用SMPS模式比LDO模式效率高30%以上,同样的性能下功耗更低。虽然SMPS需要加电感和电容,多占一点PCB面积,但是对功耗要求高的产品值得做。
③ 不用的外设电源用MOS管切掉。比如传感器、Flash这些,平时不用的时候,用一个P-MOS管把电源断开,一点电都不耗。要用的时候MCU打个GPIO,打开MOS管供电。我之前做的一个温湿度节点,SHT30传感器休眠电流就有0.5uA,切掉之后一年下来能省不少电。
8.1.2 GPIO设计
GPIO漏电是低功耗的隐形杀手,每个引脚漏个0.1uA,20个引脚就是2uA,占比不小。
① 所有不用的GPIO,在软件里全部设为模拟输入模式,断开施密特触发器,漏电最小;
② 外部有上拉/下拉电阻的引脚,休眠的时候要把电平拉到确定值,不要浮空;
③ 按键引脚不要用外部大电阻上拉,用MCU内部的弱上拉就行,外部电阻在电池上持续耗电。
8.1.3 时钟设计
① 系统时钟频率不要跑满。100MHz跑满的时候电流是15mA,降到4MHz可能只有2mA。如果算法不复杂,没必要跑那么高的频率,够用就行。
② 不用的外设时钟全部关掉。每个开着的外设都要耗电,ADC、SPI、I2C这些,不用的时候在代码里把时钟关了。
③ 进入Stop模式之前,把不需要的外设都停了。不然睡下去了,外设还在那里耗电。
8.2 软件代码层面的优化
8.2.1 快速醒来,快速干活,快速睡回去
低功耗设计的核心思想就是:醒着的时间越短越好。比如:
• 要采集传感器数据 → 马上醒来,开传感器电源,等传感器稳定,读数据,算完,关传感器电源,马上睡回去;
• 不要在主循环里写延时!很多人习惯用HAL_Delay()延时,这期间MCU一直在全速跑,白耗电。
正确的做法是:要延时多久,就把低功耗定时器设多久,然后睡进去,时间到了硬件自动唤醒。这样延时期间MCU是睡着的,功耗差几百倍。
8.2.2 BLE参数优化
BLE设备的功耗主要来自三部分:广播、连接事件、数据收发。这几个参数都可以调:
① 广播间隔:广播间隔越大,平均功耗越低。但是广播间隔太大,手机搜索到设备的时间就长。一般做传感器节点,广播间隔设1秒~2秒就够了。
② 连接间隔:手机连上之后,连接间隔越大,功耗越低。但是连接间隔大了,数据传输就慢。根据应用场景调,比如温湿度传感器,1秒传一次数据就够了,连接间隔设500ms甚至1秒都行。
③ 发射功率:如果通信距离很近,把发射功率从+10dBm降到0dBm甚至-10dBm,每次广播的电流能降好几mA。一般室内用,0dBm的功率足够穿一堵墙了。
④ 广播信道:BLE有3个广播信道,不要同时开3个,只开1个最常用的(比如37信道),能省2/3的广播功耗。
8.2.3 用对低功耗模式
① 短时间等待(<1ms)→ Sleep模式,唤醒快;
② 中长时间等待(ms~s级)→ Stop2模式,功耗最低,而且RAM保留,唤醒后不用重新初始化;
③ 超长时间等待(分钟级以上)→ Standby模式,功耗最低,但是唤醒相当于复位,要重新初始化。
不要不管什么场景都用Standby,唤醒时间长,而且RAM丢了,还要做初始化,反而费电。
8.2.4 传感器功耗优化
传感器也是耗电大户,要好好设计:
① 传感器选型的时候就要看休眠电流。比如温湿度传感器,有的休眠电流0.1uA,有的要5uA,差50倍,一年下来差很多电;
② 传感器采样时间尽量短。比如SHT30,测量一次只需要15ms,测完马上关电源,不要一直开着;
③ 采样频率不要太高。比如温度传感器,1分钟测一次足够了,没必要1秒测一次,白白耗电。
十、优化的优先级建议
如果时间有限,按这个顺序优化,投入产出比最高:
1. 先把GPIO漏电解决了——这个最容易改,收益也大,一下子能降好几uA;
2. 把延时改成定时器唤醒,不要用死等——改几行代码,功耗降一个数量级;
3. 把不用的外设电源切掉——硬件改一下,传感器的休眠电流全省了;
4. 调BLE参数——广播间隔、连接间隔、发射功率,参数调一下,平均功耗降一半;
5. 最后再抠细节——SMPS、时钟频率这些,改起来麻烦,收益相对小。
十一、总结
STM32WBA的低功耗模式分得很细,从uA级的Stop到0.2uA级的Standby,覆盖了各种场景。做电池产品的时候,不要上来就用最深的睡眠模式,要根据唤醒时间要求、是否需要保留RAM数据来选最合适的。
低功耗设计是个系统工程,不是改一个地方就能搞定的,要从硬件、软件、算法各个方面一起优化。核心思路就是:能睡就睡,醒了就赶紧干活,干完马上睡回去。
STM32WBA本身的低功耗底子很好,Stop模式做到了1uA以下,配合合理的软件设计,做个能用好几年的电池产品完全没问题。
我要赚赏金
