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

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

[复制链接]
STMCU小助手 发布时间:2021-11-19 22:00
项目开发需求,STM32L053R8T6待机模式
& }) o( Q* N+ b0 W  N, i. K  D待机模式下功耗最低(配置步骤也最简单),所有功能都停止
) u2 \$ T! g, x# X(这里使用的LL库函数/HAL库函数)
1 k% Q/ [- Q) m
! Q7 \0 m. t0 a. C# ?
20210313114242230.jpg
# c/ v' c6 I* T- D: M( A. K# D
进入待机模式之前,为了正常退出待机模式需要配置唤醒源,这里是WAKEUP引脚上升沿唤醒
" [2 u) r+ M  O* L# R; ?
4 V, ]; F+ k1 |7 j
20210313114828579.jpg

- W2 K5 ~- Z/ c" i! c( K9 VSTM32L053R8T6唤醒引脚有PC13和PA0,硬件电路按下按键产生上升沿。我将其配置成了外部中断上升沿触发模式。
9 B" w7 [7 d$ g1 I% u. z7 y4 h$ z  d2 X# l# q3 @
  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>
    / \- X9 V6 N5 h7 J- s
  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>
复制代码

' y$ M4 Q& N" F! |# J& q
20210313115233309.png
6 ^& m+ q2 Q$ Q4 i2 k
进入待机模式之前需要使能唤醒引脚, C$ f. r" l& y  g. h4 l) O! N
( U- ]2 g; W  L( h2 h6 g- Z9 @% [" j2 ]; g
  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>
复制代码
$ y* O# N* Z$ k( d# L( ^4 E
$ _5 M: w0 t0 h+ n( ?1 j4 A) f/ @
以下是进入待机模式
, z" Y/ n/ Z! s2 |( e' F. {% n3 r& h/ U- k5 A' ?9 T4 |
20210313115826181.jpg
; J# F2 S' y; v* Q5 P7 m
代码
' [0 s1 O& c5 U0 v1 u7 e, D* R8 o1 ?7 ~( j
  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>2 \; ~7 H! w1 O, J2 O4 S
  2. </p><p>}</p><p>+ k/ t' D' R4 W% J  Q* {
  3. </p><p>//寄存器</p><p>//void enter_Standby(void)</p><p>//{</p><p>
    , D5 j, r  l2 Z  P
  4. </p><p>//<span style="white-space:pre">                        </span>/*EnableClocks*/</p><p>
    6 j* P1 i! }' x! y' C0 l6 K2 I+ S
  5. </p><p>//<span style="white-space:pre">                        </span>RCC->APB1ENR|=RCC_APB1ENR_PWREN;</p><p>9 u8 }: r, l% I) q' j
  6. </p><p>//<span style="white-space:pre">                        </span>/*PrepareforStandby*/</p><p>
    1 ^$ F. L5 y: V' r. c. Q
  7. </p><p>//<span style="white-space:pre">                                </span>//ifWKUPpinsarealreadyhigh,theWUFbitwillbeset</p><p>
    1 V9 r. ^+ e) ]
  8. </p><p>//<span style="white-space:pre">                        </span>PWR->CSR|=PWR_CSR_EWUP1|PWR_CSR_EWUP2;</p><p>
    + g0 W- G; A+ \  p2 b
  9. </p><p>//<span style="white-space:pre">                        </span>PWR->CR|=PWR_CR_CWUF;//cleartheWUFflagafter2clockcycles</p><p>
    3 C0 M/ W5 M$ Y; s& ]" J
  10. </p><p>//<span style="white-space:pre">                        </span>PWR->CR|=PWR_CR_ULP;//V_{REFINT}isoffinlow-powermode</p><p>
    5 f9 E5 k% ^" B8 |' F
  11. </p><p>//<span style="white-space:pre">                        </span>PWR->CR|=PWR_CR_PDDS;//EnterStandbymodewhentheCPUentersdeepsleep</p><p>. ^# n& J- @6 Y, b7 y. P
  12. </p><p>//<span style="white-space:pre">                        </span>SCB->SCR|=SCB_SCR_SLEEPDEEP_Msk;//low-powermode=stopmode</p><p>
    , N' t' y# ~0 f
  13. </p><p>//<span style="white-space:pre">                        </span>SCB->SCR|=SCB_SCR_SLEEPONEXIT_Msk;//reenterlow-powermodeafterISR</p><p>
    0 W- V6 k) F$ |5 T7 D
  14. </p><p>//<span style="white-space:pre">                        </span>__WFI();//enterlow-powermode</p><p>
      X% }( _& a5 S6 {. \* {+ y
  15. </p><p>//}</p>
复制代码
& ?, s+ M* H4 f
项目:两节1.5V电池串联供电,外设主要包括蓝牙、OLED等,使用的内部晶振,实测工作状态电流13mA,待机模式电流65uA,差强人意。
2 P1 b; X6 l% n  R  d6 P0 [6 B(单片机无程序状态下,电路电流为500mA左右,这电路就很离谱)" T. F  j* d; R# p6 g7 o3 q) A
+ ?' h  E. o; {4 b4 S4 y* \' q
注意:
# P" E# R4 K' w! _  Z' z7 m8 X- i; u8 D
20210404092757709.png
; |# m- G4 ~9 [9 v0 {2 x0 a1 W
高阻态并不代表外围电路没有电流,如果电路中有使用I/O口控制外设电源的,那么进入待机模式后一定要实测,要实测,实测。
$ \; L# N2 G! Z0 C$ ^
- ]' c" D1 \: j- N! g9 T! {! \+ H" X. q7 s3 r
收藏 评论0 发布时间:2021-11-19 22:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版