STM32L系列具有比较显著的低功耗性能,在现代电子产品、工业仪器仪表、可穿戴设备应用等领域往往都需要设计低功耗应用,那么如何基于STM32L设计出一个好的低功耗应用,首先应比较准确的理解其核心的7大工作模式。
STM32L4低功耗性能
STM32L4具有高达7种低功耗工作模式:支持七种低功耗模式,以在低功耗,短启动时间,可用外围设备和可用唤醒源之间实现最佳折衷。上图中虽有超过7种模式,值不过将模式细化了,参照《STM32L4A6xG Datasheet》描述了7种工作模式。
这张图来自<STM32L4 -PWR power control V3.3>,从这张图可以概要的了解STM32L4系列在低功耗方面的性能指标,总体上来说还是不错的,提高了灵活的工作模式可选。合理的利用好这些工作模式可以设计出不错的低功耗产品。
七大工作模式
如何阅读及使用这张表呢?首先应相对准确理解一下每个模式代表的单片机工作状态的物理含义,才能较好的基于这些工作模式进行工程应用设计。
Run / Sleep 模式
这里提到几个概念MR/SMPS/Range0/Range1:
- 这里MR(Main Regulator)指的是内部的主LDO(Low-Dropout Regulator) 低压差稳压器
- SMPS(Switching Mode Power Supply)指的是外部开关电源供电,这里提一点SMPS方案从系统角度电源效率更高,热损会更小,当然会增加些器件成本。
- Range的概念是指运行等级, 比如在RUN模式下,Range 0 CPU可运行最高至80MHz,而Range 1时CPU及外设最高都只允许运行至26MHz。
- 睡眠模式 Sleep mode:
◆ 在睡眠模式下,仅CPU核在睡觉,因此程序处于睡觉前状态暂停。这是什么意思呢?程序的运行态主要由CPU核寄存器、RAM内的数据相关。所谓CPU睡眠指CPU不会再进行取指、译码、执行的动作,CPU睡眠后相关寄存器保持不变,RAM内数据保持不变。简单理解就是把程序运行状态拍个快照,并暂停在快照状态不变。
◆ 当发生唤醒事件(就是上表中列出的中断/事件,这里统称为唤醒事件)时,所有外设都可以继续运行,并且可以唤醒CPU。程序从执行对应的中断/事件处理代码,然后从睡眠前的状态继续执行。
再来对比下这两个相似模式的差异:
- 相同点:供电方案一样,FLASH、SRAM、时钟、DMA及外设支持情况都基本一样。
- 不同点:CPU在睡眠模式下没有运行执行指令。
低功耗运行/睡眠模式
- 低功耗运行模式Low-power run (LPRun): 这个模式下,CPU可以运行程序,但是跑的较慢。这个低功耗运行模式怎么得以实现呢?
◆ 其一:该模式可通过低功耗稳压器Low-Power Regulator为内核逻辑电路提供的电压工作来实现,显然降低工作电压可显著降低功耗。
◆ 其二:降低CPU的工作频率,CPU频率限制为2 MHz。独立时钟外设可以由HSI16提供时钟。
- 低功耗睡眠模式Low-power sleep (LPSleep):仅低功耗运行模式可进入该模式。仅CPU时钟停止,当被唤醒时,系统将恢复为低功耗运行模式LPRun。
停止模式
停止模式stop 0/1/2 mode: 停止模式可实现最低功耗,同时保留SRAM和寄存器的内容。由供电的所有时钟都停止运行,PLL,MSI RC,HSI16 RC和HSE晶体振荡器被禁用,但LSE或LSI时钟处于运行状态。
RTC可以保持运行状态(是通过软件配置可实现带RTC的停止模式,以及不带RTC的停止模式)。
另外某些具有唤醒功能的外设可以在停止模式下启用HSI16 RC振荡器,以检测其唤醒事件。
提供三种停止模式:停止0,停止1和停止2模式:
差异点:
- 三种模式的内部供电电源不一样,Stop0由MR(Main Regulator)提供,而Stop1/Stop2则由LPR(Low PowerRegulator提供)。
- 唤醒源Stop2支持的唤醒源相比Stop0/Stop1少一些
- 所需功耗则是Stop0>Stop1>Stop2,Stop0由MR供电,所以三种模式里功耗相对略大一些。
- 唤醒时间则是Stop0<Stop1<Stop2。
相同点:
- CPU、FLASH都处于停止运行状态,而SRAM仍然处于运行,这意味着内存里的内容会保持住。LSE(Low Speed External)/LSI(Low Speed Internal)时钟运行为唤醒源提供运行时钟。
待机/关机模式
- 待机模式Standby mode: 待机模式用于通过BOR实现低功耗。内部稳压器已关闭,因此由供电的所有电路都被关闭, PLL,MSI RC,HSI16 RC和HSE晶体振荡器等时钟电路也处于关闭状态。
RTC可以设置为运行状态(因此与Stop模式类似,可通过软件配置实现带RTC的待机模式,不带RTC的待机模式)。
可以通过软件选择待机模式下每个I/O的状态:内部上拉/内部下拉或浮动的I/O。这句话有什么应用含义呢?IO口的状态设置不对,对整个系统功耗会影响很大,应设置成最小电流消耗的模式。比如外部不需要的LED就应该置于关闭状态。
进入待机模式后,除了备份域和待机电路中的寄存器外,SRAM1和寄存器内容都会丢失。但SRAM2可配置为数据保持状态。
当发生外部复位(NRST引脚)、IWDG复位、WKUP唤醒引脚事件(上升沿/下降沿)或RTC事件(警报,定期唤醒,时间戳,篡改)或检测到故障时,设备退出待机模式。唤醒后的系统时钟由MSI提供,最高可为8 MHz。
- 关机模式 Shutdown mode:关机模式可实现最低功耗。内部稳压器已关闭,因此电源已关闭。PLL,HSI16,MSI,LSI和HSE振荡器也被关闭。
RTC可以保持活动状态(同样可以通过软件配置成带RTC的关机模式,不带RTC的关机模式)。BOR在关机模式下不可用。在此模式下无法监视电源电压,因此不支持切换到备份域。除了备份域中的寄存器外,SRAM1,SRAM2和寄存器内容都会丢失。
当发生外部复位也即NRST引脚检测到复位事件,WKUP引脚事件(可配置成上升或下降沿触发模式)或RTC事件(警报,定期唤醒,时间戳,篡改)时,设备退出关机模式。唤醒后的系统时钟为MSI,频率为4MHz。
- 待机模式可实现设备待机功能
- 关机模式则可实现软开机功能
应用开发思路
分析了这么多的工作模式,那么其应用价值在哪里呢?根据不同模式的切换可以在设备正常功能以及低功耗两者间寻求一个最好的平衡。那么实际利用STM32L4系列单片机(其他单片机从策略上是相通的)进行低功耗产品设计时具体应该怎么做呢?
从总体上,其实就是利用时间维度上对单片机工作模式进行切换:
- 选定工作模式,在一些需要快速处理或者计算量较大时间,可选择让单片机工作在RUN模式下,由于该模式功耗相对较高。因此时间片因尽量短,让CPU尽快完成紧要的处理后切换到休眠或者低功耗运行模式LPRUN。
- 合理规划好唤醒源。一般可从设备的功能需求出发进行考量:
◆ 设备在休眠时,有哪些外部交互需要将设备唤醒。比如设备带有外部通信接口,比如UART/I2C等。
◆ 设备可能需要周期性处理一定的任务,此时可以考虑利用定时器作为一个唤醒源,让设备定时唤醒执行一段程序后,在进入低功耗模式,这里的低功耗模式,具体可依据上表的参数并结合设备需求进行灵活选择。
◆ 设备可能有外部操控的需求,比如有人机交互接口,按键/触控等,也需要规划为唤醒源。
◆ ......
- 合理规划好,各模式切换处理代码,一般唤醒事件从编程角度以中断处理进行实现,这里内部实现需要管理好设备运行模式。可以利用状态机进行实现,在编码前可以利用状态图先梳理一遍。
- 实际的低功耗设计,为了将产品的功耗设计的尽量低,比如电池供电产品,电池能量有限。那么从硬件设计角度还有哪些角度可以进行规划的呢?
◆ 能不用的外设都应关闭
◆ 能不用的时钟都应关闭
◆ 能低频率运行尽量不要高频率运行。
◆ 外部功耗大硬件电路可以设计MOSFET进行开关控制,在运行态将对应模块电路打开,休眠态如果不影响功能时可以考虑关闭
◆ 外部电路也需全盘考虑低功耗设计,小到一个电阻的选取。
◆ 低功耗设计,电源本身的效率是一个至关重要的环节,不要把着眼点全放在如何编程上,如何是CPU消耗更少的能量。如前面说说,需要进行全盘考虑。比如一个系统使用LDO进行电源供电设计,输入输出压差很大,即便其他部分在怎么折腾,发现系统功耗依然很大,那么能量消耗在哪里了呢?其实很多能量都被LDO吃掉了,变成热损做无用功了。所以低功耗设计,能量是宝贵的,任何一个环节都不可漏过!
- ......
低功耗设计评估
完成产品的原型设计后,对于产品功耗的评估必不可少。那么怎么评估呢?总体上而言,对于产品供电电源拉出的电流将会呈现下面的形态:
可以设计一个较高速度的电源电流采集系统对电池供电电流进行采集,然后绘制出电流曲线进行不断优化,当然如果公司有比较好的电流探头则可以直接用示波器进行评估。如果设备是周期性唤醒则基本可以评估出常态下系统在满电电池的使用时长,在其他外部唤醒的情况,则需要已经统计规律进行大致评估了。图中阴影部分的面积如乘以供电电压就可以简单等效为总的能量了。当然对于电池供电系统还需要考虑实际电池的放电曲线。一般而言,随着电池的不断放电,其电压也会不断降低,这一点在实际应用时也需要综合考虑。
❖ 参考资料:
- STM32L4 -PWR power control V3.3推荐这份官方presentation资料,描述的比较清楚
- STM32L4A6xG Datasheet