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

STM32的低功耗管理

[复制链接]
STMCU小助手 发布时间:2023-2-21 20:54

以STM系列手册为例,我们先来看看STM32的几种工作模式。

因为我最近用到STM32G0系列的MCU,所以就拿G0的手册来聊一聊吧,其他的都类似,功耗方面有些差别。

$ o7 U% b! w6 }! M& ?

STM32系列MCU的几种工作模式

正常运行模式就不聊了,刚开始学单片机时候,什么都不干,down个代码就能跑起来的大多是这种模式,不缺电,不需要省电...

从STM32G070手册来看,模式还是比较丰富的,下面来看看各个模式的意思:


# O& U2 k9 L" v5 F' k& L6 [6 ?2 C
. X5 b$ n, y, A7 _
微信图片_20230221205335.png & R/ g# w" f- V7 T
; n; {8 i( K1 w- S% q7 _2 q
0 f& {9 ~1 J- {+ w
1、睡眠模式(sleep mode)

仅仅是内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行。

2、低功耗运行模式(Low-power run mode)

该模式通过低功率调节器提供的VCORE来实现,以最小化 调节器的工作电流。代码可以从SRAM或Flash执行, CPU频率限制在2MHz。具有独立时钟的外围设备时钟可以来自HSI16。

3、低功耗睡眠模式(Low-power sleep mode)

从低功耗运行模式进入该模式。只有CPU时钟停止。当有事件或中断触发唤醒时,系统将恢复到低功耗状态运行模式。

4、停止模式(STOP)

停止模式又分为STOP0、STOP1模式。

在“停止0”和“停止1”模式下,设备的功耗最低,同时 保留SRAM和寄存器内容。VCORE域中的所有时钟都已停止。

PLL,以及HSI16 RC振荡器和HSE晶体振荡器 失能,LSE或LSI继续运行。RTC可以保持激活(停止模式 RTC,停止模式(无RTC)。

一些具有唤醒功能的外围设备可以在停止模式下启用HSI16 RC,以便获取用于处理唤醒事件的时钟。主调节器保持激活状态在停止0模式下,在停止1模式下关闭。

5、待机模式(Standby mode)

待机模式用于实现最低功耗,使用POR/PDR在此模式下始终处于活动状态。主调节器关闭,以关闭VCORE电源 领域低功率调节器关闭。PLL和HSI16 RC振荡器和HSE晶体振荡器也断电。RTC可以保留活动(带RTC的待机模式,不带RTC的待机模式)。

对于每个I/O,软件可以确定是上拉、下拉还是无电阻 应在待机模式下应用于该I/O。进入待机模式时,寄存器内容丢失,RTC中的寄存器除外 域和备用电路。

+ S9 ~4 K' O2 N, v. [- K" X

如何进入低功耗模式?

如何进入低功耗模式比较简单,HAL库为我们封装好了对应的函数,我们只需要调用即可。

简单来看下各种模式的函数接口,在stm32g0xx_hal_pwr.c文件中。

首先是几种低功耗模式的简单介绍,着重介绍stop模式,也是我设计产品遇到的,其他模式,用到时候再与小伙伴们分享...


( S! f* q8 h4 O2 q, n" X3 j

微信图片_20230221205322.png


/ F! A8 C8 @6 J6 t$ a

进入各个低功耗模式的函数原型如下,主要包括sleep mode,standby mode,stop mode

接下来,看看每个函数的入口参数及含义是怎样的。

. j" v9 l8 L! ?( J: z

1、sleep mode入口函数参数主要有两个,函数介绍里面写的很清楚:! B" j- p! |, s' J" G. W% I4 l. O1 R
/ x3 {& Q) i9 Q( O6 J
微信图片_20230221205311.png
9 h  m! U. u( Z9 a1 ^  G6 E9 o, M: g* J2 u

第一个参数regulator表示的是我们采用哪一种sleep模式,sleep和low-power sleep mode,通过选择对应的模式即可:


1 F8 N- H0 X" n 微信图片_20230221205305.png # s4 H& J- B' l8 ]( [1 Z

' d* n2 o3 w: t0 Q. Z# j, J 微信图片_20230221205251.png , i3 m8 O* c( q1 K$ j8 g& Q
" n" n) |4 }/ u7 W7 P
) S! M' E+ V8 n  @, F+ T9 f5 c
2、standy mode入口函数

& ~! r6 Q" L+ S7 z! X- a" W0 o* H3 p
微信图片_20230221205245.png
1 F& m5 f( L" }* R2 G% I 微信图片_20230221205242.png
4 D& G& L0 R. i1 {1 ~' K
& W% M8 e0 e$ n4 u4 f( h
! p1 ]  e+ x7 G) N
3、stop mode入口函数

第一个参数regulator表示的是我们采用哪一种stop模式,stop0和stop1模式,通过选择对应的模式即可,第二个参数表示唤醒的方式,通过指令或者等待唤醒事件唤醒MCU。

: e0 K& a; D) G6 R5 a# X, B
微信图片_20230221205239.png 4 ~( ^! x/ h: m7 ~0 B

1 g6 _$ W% B; X 微信图片_20230221205236.png , L. H! o0 ~% y
( W' C* {5 y" W1 g8 ~; W
低功耗唤醒

最近设计产品主要用到了stop1模式,接下来就着重来介绍下stop1模式的进入与唤醒。

就像人睡觉一般,MCU进入低功耗之后,以极低的功耗维持着系统“活着”,但是醒过来是需要一定条件的,比如定个“闹钟”,按键“按一下”等,目前常用的“正常的”唤醒方式有以下几种:

1、RTC定时唤醒;

2、外部中断唤醒(按键或者通讯唤醒);

3、特殊唤醒引脚唤醒(某些引脚具有专门的唤醒功能)。

下面,再来看一看如何通过RTC和外部中断唤醒MCU。

" P+ J; W5 D" t7 }0 v

1、RTC定时唤醒

依然是从手册中我们可以看到,所有的RTC时间都可以把MCU从低功耗模式中唤醒:


5 s2 o) P3 H3 X  b 微信图片_20230221205233.png
1 X) S8 p! n) \8 o; J/ N+ V5 ]' ~" ^  X9 a/ G

本文仅仅介绍使用RTC的定时功能实现,定时1S唤醒一次,使用cubemx进行对RTC进行配置:


  ~3 r# a$ \- A 微信图片_20230221205229.png
0 l6 S& A. w) ^0 O  r  I. l) W0 w- b1 m( _7 F* y- Q
微信图片_20230221205226.png 6 X4 ^2 r9 c' m

7 ~; [/ P+ H6 y: g" H 微信图片_20230221205221.png / ?$ G$ }, y2 ^

2 b' N: T3 T5 X* M  O% s% ^" S

生成代码的时候,勾选这个选项,可以把不用的引脚配置为模拟输入模式,降低功耗:

: x/ G2 M9 X' m- \* K. {6 o
微信图片_20230221205218.png 1 c) x% S( h$ D& y. d

) R: K" X. g- F

RTC的配置如图,使能RTC,1S中断唤醒一次:

* F( f9 k& d1 Y0 N4 o
微信图片_20230221205214.png % p3 [1 [) e5 Y: G+ L4 W

" M) D! x' M4 ]: ^" l( g9 c! ?% y

接着,我们在while(1)里面写下面的代码,通过串口打印出唤醒信息,实际上代码在执行的时候,遇到红框出的低功耗入口函数,代码会停止在这里,当遇到唤醒信号的时候,会继续往下执行,一般进入STOP模式之前我们会先配置好唤醒所需要的条件,相应的IO等进入低功耗状态,唤醒之后,把硬件相关的重新初始化,才可以正常使用。


* p* v' p: n. ] 微信图片_20230221205212.png
$ H" C/ x; M$ i/ L2 S
& J5 W% L: M3 @, V; H% S0 ]6 ^ 微信图片_20230221205208.png
/ a3 }9 p6 _" q& c) W
! z$ j( u% X: }; q3 G" _

6 k, ]9 C8 g5 v1 d2 i/ p2、外部中断唤醒

外部中断也可以用来唤醒MCU,需要提供一个下降沿用以把MCU从低功耗中唤醒。

我们就直接使用串口的RX作为外部中断引脚唤醒,使用串口3的RX也即是PB11引脚,关于外部中断这里不做具体介绍了,需要的小伙伴可以私信我,专门出一期介绍。

需要先配置IO口为外部中断模式:

7 V5 v2 |- N6 K
微信图片_20230221205205.png ' }. H# I$ W0 |$ D$ D
7 |: Z0 f" Z" u0 q" k4 X: X

在进入低功耗模式之前一定要先配置,这样才能够正常唤醒。


6 F! v& {# G. s. \, J# l! d& q 微信图片_20230221205203.png
* q& i0 G6 \/ }4 o) }* n# u: h: ^/ x$ d/ h& F

接下来,我们通过串口助手发送数据触发外部中断,然后打印唤醒信息,就是这样简单。

  {- t( ~4 y$ q+ i, k+ u. r
微信图片_20230221205159.png
7 N% T# N8 I' |7 D1 D: I% m6 B1 |$ o
' f% a) V) ?" E0 }5 ^8 ]$ S; L
" C  t2 l) z# }
作者:Embedded小飞哥

2 K# H7 t  ?6 i" {7 X
  r+ o1 k8 A/ I/ i: A  I
4 s: r  w. y7 q$ I  D; h
( m* D6 Y' J: {% Z- H
微信图片_20230221205315.png
赞 收藏 评论0 发布时间:2023-2-21 20:54

举报

0个回答

所属标签

相似技术帖

官网相关资源

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