你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L4系列单片机的低功耗问题

[复制链接]
STMCU小助手 发布时间:2021-8-10 14:21
基于STM32L4系列单片机的低功耗问题# T+ l2 @) p+ \) k
" P5 S& u! s" e6 w" k" p
1 I( N8 x' a8 b! |6 {) W: R/ L
首先看ST关于L4系列的官方文档官方给出了多个低功耗模式并且介绍了这几种模式
. D" U! J* Z9 {6 |* cSleep mode:CUP时钟关闭,IO口保持与运行状态相同的状态。可由wake事件,NVIC,SysTick,外部中断等,无唤醒时间,唤醒后执行唤醒源中断回调函数(和标准库中断服务函数功能一样,但意义不同),然后按原来代码执行
9 d' E) v# l- o$ h+ [# J! k0 x/ C2 G8 O* Q
! J' T. N+ A2 k# u5 c. _7 q

5 C1 ]5 M: U$ l0 K6 r/ b**Low-power run mode:**当系统时钟频率降低到2MHZ以下时,即可实现此模式。代码可从SRAM或闪存中执行。调整器处于低功耗模式,以最小化调整器的工作电流。IO口保持与运行状态相同的状态,退出此模式需按照三步1:清除PWR CR1寄存器中的LPR位,强制调整器进入主模式。2:等待直到PWR SR2寄存器中的REGLPF 位被清除3:增加时钟频率
' x& }' @; ^- \1 {& M% F; H8 A8 u
" u# ~& f6 [7 l8 r7 R7 `

+ S7 p4 w0 S- ZLow-power sleep mode: 此模式从Low-power run mode进入,IO口状态与运行模式相同,可由外部中断,wake事件唤醒,无唤醒时间,唤醒后执行中断回调函数,后按原来代码执行
: R/ k: j! Y7 M/ ^7 s6 _( ^0 z6 \0 ~
# b5 J0 r3 _- H/ i1 V
**Stop 0, Stop 1 and Stop 2 modes:**此模式中SRAM1,SRAM2和寄存器中的内容都将保留,所有时钟在VCORE 域停止,PLL,MSI,HSI16,HSE禁止。LSE和LSI保持运行,RTC可保持运行,一些具有唤醒功能的外设也可等待唤醒条件。在STOP2模式下,大多数的VCORE域处于低泄漏状态。SPOP1模式提供了最多数量的活动外设和唤醒源,唤醒时间较小,但电流比STOP2消耗更多,在STOP0模式主调节器仍然时开着的,这允许最快的唤醒时间,但消耗多。功耗大小SPOP2< STOP1<STOP0.可由wake事件,外部中断唤醒。当退出SPOP模式时时钟源可选MSI或HSI16这取决于软件配置。退出后执行唤醒源中断回调,后按主代码执行。
. z5 l* _5 Z8 D- K5 @" H1 e& V; y" E: V: `7 ^0 j

4 T5 o2 |) Y0 yStandby mode: VCORE域是关闭电源的。然而,它可以保留SRAM2的内容:待机模式与SRAM2保留当位RRS被设置在CR3寄存器,在这种情况下。SRAM2由低功率调节器提供。在PWR CR3寄存器中清除位RRS时的备用模式。在这种情况下,主调节器和低功率调节器电源关闭,所有的时钟在VCORE域停止,PLL,MSI,HSI16和HSE被禁止。LSI和LSE可以继续运行。IO口可配置位上拉或下拉或模拟。RTC可以保持。外部中断和wake时间唤醒等可退出Standby模式,唤醒后系统复位
  u7 H; x8 p; W) S
% k% l9 q6 n/ ]3 c) {9 e& c
, Y4 I" w" E# Z- k* ]2 _
**Shutdown:**VCORE域电源关闭,所有时钟在VCORE停止,PLL,MSI,HSI16,HSE禁止,LSE可以保持运行,系统时钟,当退出Shutdowm模式MSI在4MHZ在这种模式下电源监控是关闭的。IO口可配置成 上拉,下拉,模拟。可用wake事件唤醒,io口外部中断,唤醒后系统复位。
1 M5 ~, e. F" D# [几种模式的相互转换关系:) j. A8 B. _! J
1.png
7 r7 W2 s7 a. W5 X9 `9 C8 |% q! j2 C4 \! g6 x
/ X% s7 E- ^) ~8 S* l
由这几种模式转换且保持系统运行无异常,最初我选择了Run mode(运行)和Shutdown mode 和Standby mode 模式进行测试,手里的板子的MCU是STM32L31RCT6.对比官方库中的测试和自己的工程看电流,刚开始测试的时候电流差距很大,首先找硬件原因,因为我使用的不是ST官方的板,无引出的电流测试点,所以我测的是整体板子的电流,我所使用的板子比较简单,无任何外设,去除5转3.3芯片,直接使用3.3v供电,单片机的启动模式为模式0在FLASH中启动 BOOT0和B00T1设置为上拉电阻。(BOOT0和BOOT1一定要处理好影响电流很大)# ^$ E" [6 Q+ j, M# Q# z
2 n  V9 \( S  J  Y# @

, ?! l$ e0 D" X首先单独测试Shutdown模式,最初测试的时候电流还是很大,在经过硬件与软件的结合后最终电流最低可达到0.03uA 且可由外部中断唤醒。加上RTC周期唤醒后,电流最低到0.52uA" v  c& B& b# S3 c$ g' V% j
2.png
4 o3 l5 A8 }: t. X1 t' n/ A; M# B  C/ j/ g5 f
图为官方给出的标准参照
8 E2 h% W/ w2 |4 J
& l9 t+ Y6 M0 M- c2 z7 G7 t

+ Q0 T$ o! _6 y6 k; S具体的软件处理方法:0 m3 z+ W) Y) O7 b, A
1:底层初始化HAL_Init();重置所有外设,FLASH 和Systick,
& y# n1 A  v* Y- Y5 i
6 F1 y0 j# A  F6 J

' ~1 R# W/ o; m  N% C2:系统时钟配置SystemClock_Config();STM32L4最高时钟可跑到80M,我在STM32Cube中时钟设置为72MHZ因为现在只是测试低功耗对系统的运行速度无太大要求+ p/ m: {  b. X0 Q  C% L
+ L9 U1 }( z2 u
5 {) L2 C2 H4 c& x* K7 B- _- c4 ?
3:开启所用时钟MX_GPIO_Init();在这我开启了所有时钟,并在此处将没
) U( U3 B# x7 R* N  O2 U用到的引脚全部设置为模拟输入,外设我只用了串口.并开启外部中断。
8 }7 Q3 ?1 ?* b5 j4 Y8 p6 C
2 D. D; u& S4 D; R% V8 z

6 Y6 t+ f: E2 R' M8 q- s4:串口的配置及初始化,按照常规配置即可
) w1 H0 G  a: {3 N) h9 \. s# j5 [* }) `; I) @. `) a+ t
6 p& G: _! }9 h. \
5:进入低功耗模式前的准备,首先在此函数中禁用Debug调试端口,关闭所有时钟。关闭串口,然后进入Shutdowm模式。' m! Z+ t, N, h/ P, p* s

2 S( U$ f9 R% X: F* }
: ^$ F  ^; O3 m0 w1 Q" T
进入Standy模式和Shutdowm模式软件配置相同只不过最后进入的是Standy模式,Standy模式测试电流为0.12uA 加入RTC后电流大约在0.63uA
% b9 P2 Z$ f% C- Y( ~在之后唤醒这一开始使用的RTC周期唤醒即HAL_RTCEx_SetWakeUpTimer_IT()函数,此函数使用的是一个16位可编程自动重载递减计数器(RTC_WUTR)生成,可用于周期性中断/唤醒。此唤醒定时器的时钟输入可以是:2,4,8或16分频的RTC时钟,也可以是ck_spre时钟(一般为1HZ)当使用RTC时钟时,可配置的唤醒中断介于122us和32s之间。8 k; k, X- n  r2 M8 D$ U
3 Q6 v4 \3 [+ m

% p# `" |' ^3 M- U" O( o# [/ M! m当使用ck_spre时钟的时候唤醒时间为1s到36h左右分辨率为1s,这个范围分为两个部分. L! f# U+ A5 J: Q# x7 e# f
当WUCKSEL[2:1]=10时为:1s到18h。
' {2 G# \' s4 F3 |. V' ]当WUCKSEL[2:1]=11时约为:18h到36h。: C3 U9 t, T9 w7 S) _5 k# F" l
在后一种情况下,会将2^16添加到16位计数器当前值(即扩展到17位,相当于最高位用WUCKSEL[1]代替) 如图! a4 b0 ^2 [- I* G

3 n1 n0 D0 v: m+ o

4 `$ o* P* G4 U9 z 3.png 6 f+ a) T% k8 u3 K. I: A/ A) Q
在使用RTC周期唤醒的时候 要清零WUTF标志,因为当计数器到0时,RTC_ISR寄存器的WUTF标志会置1,并且唤醒寄存器会使用其重载值重载,会出现进不去低功耗模式的情况。用此种方式退出低功耗模式,系统复位以及低功耗模式不会影响计数器的计数。- N2 G0 E4 z; Z
5 [* v$ W' S" K

! T, n. |& ~' e但是一开始的时候我并没有注意到唤醒Shutdown和Standy模式后会复位确实是周期性唤醒,但是每次都复位,这样不方便添加外部中断唤醒方式。(在软件的第五步进入低功耗模式前加入RTC唤醒函数,开启计数或者闹钟)闹钟的话根据所配置来唤醒,闹钟在唤醒Standy和Shutdown时也可以实现周期性唤醒。8 _8 H2 b0 j& I( ?' y

$ x; J$ x; g" U: t' K; E3 b  }

" T# U6 K5 ?0 a( L6 `  z因此换用第三功耗小的模式,STOP2模式。STOP2无RTC可跑电流1.1uA,加入RTC后1.4uA左右。STOP2模式具体软件处理方法与整体框架相同。
0 O5 {2 Z' q4 y" e4 h& J; ~9 C: \/ s6 G. X! z' V$ U  J

0 r' g9 C" k5 [; U3 e$ m现在来看一下加入RTC的处理方法& t6 j# e6 J" d2 {4 q
1:底层初始化HAL_Init();重置所有外设,FLASH 和Systick,
6 D# A) Y; M' f  }8 i1 W2:系统时钟配置SystemClock_Config();STM32L4最高时钟可跑到80M,我在STM32Cube中时钟设置为72MHZ因为现在只是测试低功耗对系统的运行速度无太大要求
8 Y; |6 H2 b$ U) C. I* W3:开启所用时钟MX_GPIO_Init();在这我开启了所有时钟,并在此处将没, T/ s. X2 Q0 P. X% _) M8 z& f6 ~
用到的引脚全部设置为模拟输入,外设我只用了串口.并开启外部中断。
  j4 Z6 p3 W( ]4:串口的配置及初始化,按照常规配置即可$ L& o0 F# d: B
5:RTC初始化目的主要是为了开启RTC的时钟(如果需要RTC时钟需要另加时间配置函数,闹钟函数也可直接在此设置)7 r7 Y& W) p9 [/ p
5:进入低功耗模式前的准备,首先在此函数中禁用Debug调试端口,关闭所有时钟。关闭串口,然后进入低功耗模式。
. r6 y) u7 r2 V2 X+ |4 L* _5 r! L% P6:进入低功耗模式后,系统等待RTC计数减到0,发生中断,然后进入相应的中断服务函数。
3 l5 @. V% m. N9 M3 {/ j+ E- t9 D7:在服务函数中,重新初始化底层硬件并配置时钟,初始化所用外设,具体的函数功能在这添加,清除WKAEUP_pin标志,然后再次进入低功耗模式(除Shutdown和Standy)# V* o' X9 C0 D
加入外部中断唤醒,也只需开启对应引脚外设,开启中断,配置优先级,然后在低功耗模式只能上升沿触发中断,在中断服务函数中的处理与RTC唤醒中断服务函数一样。
+ i  q7 K, D; m5 ~2 h  V因为复位和中断都不会引起RTC计数器的异样,所以这两个中断只要不是同时发生是不会产生冲突的。4 `# ^) {" C+ R0 g9 ~
/ f9 R; j6 Y2 I1 l7 }6 F! h% |7 w) X- W
综合来看,依需求来选择,8 Y8 G( R- k4 w: E( Y: n
一:第一种方案可以使用RTC闹钟,实现按天唤醒,或按星期唤醒,当然RTC与Shutdown和Standy结合可以实现超低低功耗0.4uA左右,并加上这两种模式的唤醒复位的特性,也可实现周期唤醒,就是这样每唤醒一次都需要系统配置相应的RTC寄存器,时间长了可能对MCU有损坏
  `: n5 |1 Z- Y4 G9 o  A8 p4 G8 `/ t- R

( Q7 G4 D& V0 A$ o0 v7 x$ |二:在就是使用wake计数器周期唤醒,搭配STOP模式,唤醒周期方便调节,精确度为S,电流达到1.4uA。- E# f' m, K" N( s# L# U9 e- K) }
还有存在的一些问题就是:
4 O5 h" Z8 B' i2 ]% k1:串口和下载器对电流的测量很大,测量时要去掉。7 Y+ _" \& v! m2 W" T' H
2:然后下载完程序后需要重新上电,要不电流可能会有误。1 ~3 |) C" ]* G0 Q/ Z. u; c
3:然后就是外部中断我测试的时候硬件连接可能不规范,有些不稳定。; T9 |0 k. \1 s$ ^% w
4:然后就是功耗问题,与官方的这几种功耗模式多多少少的有点差距,软件部分对比官方测试代码,没有什么本质上的区别。猜测可能是硬件部分,也有可能官方说的是MCU的功耗。- C. o, \9 h4 d$ J) Z7 G9 M) c
. e- q9 a% x4 S* w
( V5 g0 W0 p6 ~7 v1 W7 H7 ^
赞 收藏 评论0 发布时间:2021-8-10 14:21

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版