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

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

[复制链接]
STMCU小助手 发布时间:2021-11-19 22:00
项目开发需求,STM32L053R8T6待机模式
1 I/ i  ~7 B; v/ V* Q待机模式下功耗最低(配置步骤也最简单),所有功能都停止/ V2 l9 D2 H8 o0 j
(这里使用的LL库函数/HAL库函数)# K4 \- H: H3 D
& \5 l' ^2 ?3 M, P! h% E
20210313114242230.jpg

& \; H% h6 A, m" ~进入待机模式之前,为了正常退出待机模式需要配置唤醒源,这里是WAKEUP引脚上升沿唤醒. Z& T/ ~1 _. r
1 h0 e$ M  Y* B7 u5 G/ Q
20210313114828579.jpg
% W6 G7 l! o2 F3 Q
STM32L053R8T6唤醒引脚有PC13和PA0,硬件电路按下按键产生上升沿。我将其配置成了外部中断上升沿触发模式。; B  ?9 Z5 Z3 K6 e: e. C
2 a& c7 S2 l2 l5 _' R0 k
  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>! }. ]: Q  ?" t& F
  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>
复制代码

% J- T+ ^- [0 z. k
20210313115233309.png
+ _3 M5 `  A9 H1 |1 P0 R
进入待机模式之前需要使能唤醒引脚# N) W* `' ^* c/ u2 Y

/ E& O* _+ L9 _* |* y
  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>
复制代码

) T9 }2 Q# t/ x7 K2 O* d3 X. J. {9 ]2 F- n5 ^, H/ T9 [# m
以下是进入待机模式
1 J1 j1 C* N1 Y+ s$ z
: ~1 a/ F' ^( [) f! y4 i" k) B
20210313115826181.jpg

# {& S; h1 ~' v2 a! J. @代码
+ q! X, U, }# E; v. C0 Z. u4 ]- S5 _
  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>
    7 K4 q  Y+ c( ^' O
  2. </p><p>}</p><p>
    3 M8 g; W$ W; A/ y7 q
  3. </p><p>//寄存器</p><p>//void enter_Standby(void)</p><p>//{</p><p>
    ' {) }9 W& t% E- B- B# L
  4. </p><p>//<span style="white-space:pre">                        </span>/*EnableClocks*/</p><p>+ Y' u1 T: x4 U/ h9 t6 c3 L
  5. </p><p>//<span style="white-space:pre">                        </span>RCC->APB1ENR|=RCC_APB1ENR_PWREN;</p><p>8 j& u- U$ H: U) N9 d4 ~
  6. </p><p>//<span style="white-space:pre">                        </span>/*PrepareforStandby*/</p><p>
    4 u1 W9 o' {4 O
  7. </p><p>//<span style="white-space:pre">                                </span>//ifWKUPpinsarealreadyhigh,theWUFbitwillbeset</p><p>3 e% i! P* `, W2 c6 Q6 o
  8. </p><p>//<span style="white-space:pre">                        </span>PWR->CSR|=PWR_CSR_EWUP1|PWR_CSR_EWUP2;</p><p>+ u) f/ t# t' E6 Y
  9. </p><p>//<span style="white-space:pre">                        </span>PWR->CR|=PWR_CR_CWUF;//cleartheWUFflagafter2clockcycles</p><p>0 V) ?! C$ x: G; `* ?4 h. z
  10. </p><p>//<span style="white-space:pre">                        </span>PWR->CR|=PWR_CR_ULP;//V_{REFINT}isoffinlow-powermode</p><p>
    2 l' d$ \2 V$ ^1 z4 K/ B# L
  11. </p><p>//<span style="white-space:pre">                        </span>PWR->CR|=PWR_CR_PDDS;//EnterStandbymodewhentheCPUentersdeepsleep</p><p>% |& y! c  a0 Q. n3 Q
  12. </p><p>//<span style="white-space:pre">                        </span>SCB->SCR|=SCB_SCR_SLEEPDEEP_Msk;//low-powermode=stopmode</p><p>
    # H3 j  m! V% V" E8 P
  13. </p><p>//<span style="white-space:pre">                        </span>SCB->SCR|=SCB_SCR_SLEEPONEXIT_Msk;//reenterlow-powermodeafterISR</p><p>4 H+ O0 m% [) V. H4 P; ~0 T9 u8 ?
  14. </p><p>//<span style="white-space:pre">                        </span>__WFI();//enterlow-powermode</p><p>& a  c0 R) A2 T$ O6 v0 |. [5 ]
  15. </p><p>//}</p>
复制代码

* w. j# [! p6 W: h( G# F7 y( w项目:两节1.5V电池串联供电,外设主要包括蓝牙、OLED等,使用的内部晶振,实测工作状态电流13mA,待机模式电流65uA,差强人意。
3 U# _" S/ x1 L7 }' k4 ?7 l(单片机无程序状态下,电路电流为500mA左右,这电路就很离谱)+ ~& H; c2 _7 [/ ~( a$ _9 k. |

/ G; E3 G3 b) t2 ~: P注意:7 g& f! p- O# Q: X* }( {) R
5 A# r9 i5 _/ \8 O
20210404092757709.png

5 P9 q- n6 n; h( }& S* A高阻态并不代表外围电路没有电流,如果电路中有使用I/O口控制外设电源的,那么进入待机模式后一定要实测,要实测,实测。
3 y9 z* b) P. H$ S
3 [6 ^8 i, Y; `) J% ^$ s7 g- ]5 k9 P4 h1 q$ w; w- _" {& G  T
赞 收藏 评论0 发布时间:2021-11-19 22:00

举报

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