STM32低功耗研究报告

发布时间:20-03-3023:49

低功耗设计分成三个部分:

1. 减少设备工作时间

和应用场景紧密相关,具体问题具体分析,讲究的是分析问题和建模的能力。

2. 降低设备工作功耗

降低设备工作功耗。主要考虑硬件设计,软件编码,芯片理解。

3. 降低设备休眠功耗

降低设备休眠功耗。主要是睡眠模式,停止模式,待机模式的理解和应用。

本文针对第2点进行研究和分析。

一、实现环境和原理说明

我使用了一个USB电压电流表,能够为电路板供电,电压可调,可测量电流(1mA分辨率),可测量功率和功耗。

USB电压电流表

一个STM32F429IGT6的开发板。板子上有各种外设资源,屏幕被我取下来了。

STM32F429开发板

板子上不仅有STM32芯片,还有LED灯,蜂鸣器,USB接口等外设,这些外设都不会启用,但它们仍然会有功耗,需要从总功耗中减去外设的功耗才能得到STM32功耗。测量外设功耗的方法是,通过MDK调试功能让STM32时钟停止,此时读取到的总功耗就是外设功耗,简称基础功耗。基础功耗只和电路板的供电电压有关。

STM32功耗 = 总功耗 - 基础功耗

在电压不变的情况下,电流决定了功耗,对应名称是 总电流,基础电流,STM32电流

STM32电流 = 总电流 - 基础电流

本文数据单位统一规定如下

频率单位是MHz,电压单位是V,电流单位是mA,功率单位是mW

二、频率和功耗的关系

开发板供电5V,分压后STM32电压是3.3V,VOS参数固定为[1:1],此时外设基础电流是59mA。我们通过修改RCC寄存器,产生不同的系统时钟频率(SYSCLK),并测量每种频率下的总电流,然后计算出对应的STM32电流。不同的代码消耗的电流不同,我们选用两段代码分别测试。

测试代码1 循环读写内部SRAM:

HSI 16表示直接使用内部16M高速时钟作为SYSCLK

HSE 25表示直接使用外部25M高速时钟作为SYSCLK

测试代码2单指令无限循环 B {PC}:

分析上面的数据可知,STM32功耗和系统时钟频率成正比

同一段指令,频率越快,相同时间内执行次数也就越多,执行次数和频率成正比。这就说明,同一段代码,在不同频率下执行1次(电压等其他因素不变),所消耗的功耗相同,这就是功耗和频率成正比的根本原因。上述的测试只测量了CORTEX-M3核,FLASH,SRAM的功耗,并没有涉及到ADC,GPIO等外设的功耗,官方数据手册中记录了打开所有外设情况下,频率和功耗的关系,也是成正比的关系。

降低频率能够非常有效的降低功耗,我们应该使用尽可能低的频率。算法越高效,代码越精简,指令越少,频率就能降得越低。

三、VOS和功耗的关系

VOS (Regulator voltage scaling output selection)调压器输出电压级别。调压器负责产生1.2V的电压,为STM32F429核心区域供电。修改VOS会调整该电压值,上电复位值是 级别1[1:1],对应关系如下:

从这个表来看,VOS应该对功率应该有所影响,我们来实测一下。开发板供电5V,分压后STM32电压是3.3V,固定SYSCLK为100M。测试代码和上面频率-功耗的代码相同。

可以看到,VOS对功耗有一定的影响,核心电压越低,功耗越低。但是VOS对频率有影响,功耗越低,最大频率越低,不过120M也能满足绝大多数单片机应用场景了。如果对功耗要求非常高,可以将VOS调到级别3。VOS最主要影响的是芯片的寿命和工作温度:

VOS级别1下,工作温度小于102℃,芯片预估寿命是10年。

VOS级别2下,工作温度小于110℃,芯片预估寿命是30年。

VOS级别3下,工作温度小于90℃,芯片预估寿命是30年。

建议使用VOS级别2,在恶劣环境下芯片也能长时间工作。如果对功耗要求很高,则使用级别3。

四、电压和功耗的关系

STM32F429的电压范围是1.7V到3.6V之间。临界电压如下:

低于1.7V,芯片无法工作。

低于1.8V,芯片内部电源监控器不工作,不能产生上电复位,芯片无法自行启动。必须有外部电源监控器来启动芯片。

低于2.1V,FLASH预取指无法工作,FLASH代码的执行时间会显著增加。不能开启超载功能,最大时钟168M,无法到达180M。

低于2.4V,ADC的最大时钟频率减半,从36M降到18M。ADC最大转换速度减半。

低于2.7V,FLASH只支持16位编程和擦除操作,不支持32位操作。

高于2.7V,典型值3.3V,此时FLASH支持32位编程和擦除操作。

1.7~1.8之间的电压没有测试,因为电压降到2.0以下芯片就不工作了,应该和电路板电源设计有关。最终选取了如下几个电压做测试:

时钟周期固定在100M。FLASH延时5周期,开启预取指、缓存指令、缓存数据。VOS等级固定级别1。将一个悬空的GPIO-PB6管脚拉高,以测量STM32的电压。让相同的程序分别在FLASH中和内存中运行,比较功耗。

FLASH中执行程序:

SRAM中执行程序:

分析一下上面的数据。可以看到电压从2.2V降低到2.0V左右的时候,电流和功耗反而都升高了。因此针对STM32F429系列,不建议低于2.1V使用

电压在大于2.1V的范围变化时,执行同一段代码,电流基本不变,功率和电压成正比,说明STM32内部应该用恒流源来驱动的。降低电压可以切实降低功耗,但是FLASH和ADC的效率也会降低,需要综合考虑。

SRAM中执行程序比FLASH中执行功耗要低,如果SRAM空间够大可考虑将代码全部加载到SRAM中执行。代码在SRAM中的执行速度和开启了预取指的FLASH差不多,比没开预取指的快很多。

另外电压降低到3.3V以下时,外围接口器件可能需要重新选型,以适应较低的电压。ADC的电压测量范围也会减小,精度会变差。硬件设计时也要综合考虑。

五、指令功耗

主要测量跳转指令,寄存器赋值指令的功耗。因为这些指令可替代性比较大,比如B和BX,MOV和LDR。其他的比如运算,逻辑,判断等指令,基本只有单一实现方式。我们先定好要实现某个功能,然后找到几种不同的实现方式,比较他们的功耗。

开发板供电5V,分压后STM32电压是3.3V,VOS参数固定为[1:1],系统时钟168M,FLASH等待周期5,预取指,数据缓存开启,指令缓存开启。

电流值说明:测出的电流值包含了电路板上外设的电流,因此只能用来比较大小,其绝对值无意义。

测量跳转指令时,让其跳转到自己的地址,用无限循环来测量。

测量其他指令时,采用(376条测试指令 加 一条循环指令)的方式来测量,将循环指令对被测指令的影响降低到忽略不计。

如果表格中写了两条指令,则电流是执行者两条指令的平均电流。

B {PC}+2 指令的功耗最低,占用两个字节。NOP指令功耗最高,占用两个字节。MOV R0,R0功耗居中,占用两个字节。使用 B {PC}+2 指令替代 NOP。

单指令无限循环。使用BX R0的功耗最低,需要事先设置好R0的值。对于单指令无自限循环来说BX R0就是最好的选择。

线程的循环体。B Lable只用一条指令(简称B ),BX R0可能只用一条指令(简称BX),也可能需要两条指令(LDR+BX)。如果BX使用的寄存器(如R0)在循环体其他位置被修改过(不指向Lable了),那么就需要LDR为R0重新赋值。在实现相同的功能时,一条指令的BX功耗最低,B指令功耗居中,LDR+BX功耗最高速度也最慢。但在相同的时间内,和B指令相比,LDR+BX执行的次数更少,但是功耗也更少。比如IDLE任务就可以用LDR+BX来实现。中断触发的循环采集和计算的任务就应该用B来实现。另外,B的跳转范围有限,有时必须使用BX。如果要将功耗降低到极致,则可用一个专门的寄存器存放Lable的值,并在线程中不修改该寄存器的值。

给R0赋值32位常量的两种方式。MOV+MOVT,PC相对加载。PC相对加载(16位)的功耗最低,优先使用,但是其寻址范围有限(±1020)。MOV需要两条指令共8个字节实现,功耗和时间都更差。PC相对加载的偏移量越大,功耗越高。若要降低功耗到极致,则可在每个代码块最近的位置,自建文字池,定义相关常量。

PC相对加载。随着偏移量增加,功耗加大。16位的LDR最大偏移量是1020。超过1020小于4095的就需要用32位LDR。32位LDR功耗比16位增加很多,但是只有一条指令,仍然比MOV+MOVT功耗和时间更优。

LDR R0,{PC,#7}功耗显著增加,不对齐的内存访问,时间和功耗都非常差。

使用BX和B单指令无限循环测试,发现指令的地址和功耗有关。相同的指令,其地址16字节对齐时,功耗最小,一般在A,C,E地址时功耗达到最大。

使用5行指令块来测试。只要开头指令是16字节对齐,则指令块的功耗最低,说明指令地址不止影响跳转指令,而是影响所有指令。

因此使用频率很高的代码段,函数,都要保证其起始地址是16字节对齐。也可以强制所有函数的开头地址都是16字节对齐。

要降低功耗到极致,可根据指令功耗的特点,用汇编重构代码。

六、降低设备运行功耗总结

1. 功耗和频率成正比。优化算法,精简代码,降低频率。

2. VOS影响功耗和寿命。优先使用级别2,如果还需要降低功耗,可使用级别3。

3. 功耗和电压成正比。2.1V以上时,降低电压可有效降低功耗,但要注意各种副作用,以及硬件设计。

4. 把代码加载到内存中运行比FLASH中运行功耗更低。

5. 根据指令功耗,优化执行最多的代码段。

返回顶部