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

【经验分享】STM32L0低功耗待机模式与唤醒详解附代码

[复制链接]
STMCU小助手 发布时间:2021-11-19 22:00
项目开发需求,STM32L053R8T6待机模式- v& G* K9 |+ t9 p. G6 X& }
待机模式下功耗最低(配置步骤也最简单),所有功能都停止4 ?3 ]! z7 n, H# L5 D
(这里使用的LL库函数/HAL库函数)" |6 ?- V" i& m, [3 F
7 e( e# e6 J3 q" V# A
20210313114242230.jpg
( w" ^" W) S& H/ c) e( A
进入待机模式之前,为了正常退出待机模式需要配置唤醒源,这里是WAKEUP引脚上升沿唤醒
' f; A/ t9 `  D- ^6 O2 m
0 f* O4 m8 G6 _9 G  ~
20210313114828579.jpg

) W8 {) i. e1 a$ YSTM32L053R8T6唤醒引脚有PC13和PA0,硬件电路按下按键产生上升沿。我将其配置成了外部中断上升沿触发模式。
4 F; V. \. k# i$ J. \2 S9 ~5 `
/ g+ D' ]% {) }0 v" O
  1. <p>  /*Configure GPIO pin : PtPin */</p><p>  GPIO_InitStruct.Pin = KC13_Pin;</p><p>  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;</p><p>  GPIO_InitStruct.Pull = GPIO_PULLDOWN;</p><p>  HAL_GPIO_Init(KC13_GPIO_Port, &GPIO_InitStruct);</p><p>
    6 y6 w1 Z6 \8 K( @
  2. </p><p>  /*Configure GPIO pin : PtPin */</p><p>  GPIO_InitStruct.Pin = KA0_Pin;</p><p>  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;</p><p>  GPIO_InitStruct.Pull = GPIO_PULLDOWN;</p><p>  HAL_GPIO_Init(KA0_GPIO_Port, &GPIO_InitStruct);</p>
复制代码
: Y4 m7 n4 _+ d9 i
20210313115233309.png

" Z$ L4 R3 l5 m3 C6 z进入待机模式之前需要使能唤醒引脚2 b8 z# `1 a* J7 L" {5 G' w

7 H9 e  Y+ k; z- C9 S
  1. <p>LL_PWR_EnableWakeUpPin(LL_PWR_WAKEUP_PIN1|LL_PWR_WAKEUP_PIN2); //LL库函数 使能唤醒引脚</p><p>//等同寄存器操作 PWR->CSR|=PWR_CSR_EWUP1|PWR_CSR_EWUP2;</p>
复制代码

$ i+ P' s5 S+ P) s& }0 b, Y$ H; A# v5 @7 }1 X1 ~6 w" N
以下是进入待机模式& ?. _- Y# {& Q

! U6 [" `" b6 i9 d3 i% F
20210313115826181.jpg

' u7 C% q) T" R1 i代码
9 V6 K6 o# N( U# M% Q" R8 q4 G1 v2 v5 f! n! U* p  |& l
  1. <p>//库函数</p><p>void stop(void)</p><p>{</p><p>         //LL_PWR_DisablePVD();            //失能电压调节器</p><p>         //LL_PWR_EnterLowPowerRunMode();  //深度睡眠模式下调压器进入低功耗模式</p><p>         //LL_LPM_EnableSleepOnExit();     //SLEEPONEXIT = 1 <span style="white-space:pre">        </span></p><p><span style="white-space:pre">                </span> LL_LPM_EnableDeepSleep(); //SLEEPDEEP位=1:进入低功耗时为深度睡眠模式<span style="white-space:pre">                </span> <span style="white-space:pre">                </span> </p><p><span style="white-space:pre">                </span> LL_PWR_SetPowerMode(LL_PWR_MODE_STANDBY); //PDDS位=1:器件在CPU进入深度睡眠时进入待机模式</p><p><span style="white-space:pre">                </span> </p><p><span style="white-space:pre">                </span> //__set_PRIMASK(1);      //屏蔽所有可屏蔽中断</p><p><span style="white-space:pre">                </span> //__disable_irq();       //关闭总中断</p><p><span style="white-space:pre">                </span> LL_SYSTICK_DisableIT();  //失能(挂起)系统时钟中断</p><p><span style="white-space:pre">                </span> LL_PWR_ClearFlag_WU();   //WUF位=0:清除收到唤醒事件标志</p><p><span style="white-space:pre">                </span>__WFI();</p><p>//<span style="white-space:pre">                </span>SystemInit();</p><p>: w9 w/ `0 M: o( a  Q
  2. </p><p>}</p><p>
    # R' Y" h8 I) l$ D. O) l" [$ D! W6 s, D
  3. </p><p>//寄存器</p><p>//void enter_Standby(void)</p><p>//{</p><p>; S, n0 z) y! U) g7 i% B+ _" y# i( ]' d7 ]
  4. </p><p>//<span style="white-space:pre">                        </span>/*EnableClocks*/</p><p>
    # b3 p0 ]& O. N; Q6 |
  5. </p><p>//<span style="white-space:pre">                        </span>RCC->APB1ENR|=RCC_APB1ENR_PWREN;</p><p>
    - }6 {9 F9 d4 q2 y& v+ T
  6. </p><p>//<span style="white-space:pre">                        </span>/*PrepareforStandby*/</p><p>! j& N( u  v$ w7 H4 L; Q1 P
  7. </p><p>//<span style="white-space:pre">                                </span>//ifWKUPpinsarealreadyhigh,theWUFbitwillbeset</p><p>3 W, o2 H: z. s  H9 k1 e; @7 D: u
  8. </p><p>//<span style="white-space:pre">                        </span>PWR->CSR|=PWR_CSR_EWUP1|PWR_CSR_EWUP2;</p><p>
    - @* x# m+ i/ r3 x# P  }
  9. </p><p>//<span style="white-space:pre">                        </span>PWR->CR|=PWR_CR_CWUF;//cleartheWUFflagafter2clockcycles</p><p>
    2 v9 n3 H$ a4 d5 ~: a4 ~1 P
  10. </p><p>//<span style="white-space:pre">                        </span>PWR->CR|=PWR_CR_ULP;//V_{REFINT}isoffinlow-powermode</p><p>
    $ S. D* ^( F8 t. I8 w
  11. </p><p>//<span style="white-space:pre">                        </span>PWR->CR|=PWR_CR_PDDS;//EnterStandbymodewhentheCPUentersdeepsleep</p><p>1 @8 J0 j* ]8 `! V5 b  M
  12. </p><p>//<span style="white-space:pre">                        </span>SCB->SCR|=SCB_SCR_SLEEPDEEP_Msk;//low-powermode=stopmode</p><p>) x3 e2 x: W. P
  13. </p><p>//<span style="white-space:pre">                        </span>SCB->SCR|=SCB_SCR_SLEEPONEXIT_Msk;//reenterlow-powermodeafterISR</p><p>
    : o  m8 S* x  ~1 R* u
  14. </p><p>//<span style="white-space:pre">                        </span>__WFI();//enterlow-powermode</p><p>1 e, a/ n( @& ?% a5 B
  15. </p><p>//}</p>
复制代码
8 g% j( q( c0 B3 ?, R
项目:两节1.5V电池串联供电,外设主要包括蓝牙、OLED等,使用的内部晶振,实测工作状态电流13mA,待机模式电流65uA,差强人意。
9 {# c" Z" `. ]' W(单片机无程序状态下,电路电流为500mA左右,这电路就很离谱)2 q4 _# _5 i# ?, t+ ~5 Y& X' T, ^5 O
( h& |8 @. P  ?) D4 v" D: z# ~1 [
注意:; Q% P- a/ ?$ e' t/ S
3 Z% O3 a, u" t) z
20210404092757709.png

1 u, E; D3 q4 z" n高阻态并不代表外围电路没有电流,如果电路中有使用I/O口控制外设电源的,那么进入待机模式后一定要实测,要实测,实测。
' H, b0 J; I5 Z4 Q6 Q* h" H
1 s! Y9 V1 P+ N! W' K4 o' k# k* g
: W3 ]9 Q$ S$ d7 {6 N& H
赞 收藏 评论0 发布时间:2021-11-19 22:00

举报

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