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

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

[复制链接]
STMCU小助手 发布时间:2021-11-19 22:00
项目开发需求,STM32L053R8T6待机模式
: O3 n* t, j8 h$ w5 I待机模式下功耗最低(配置步骤也最简单),所有功能都停止9 w! W6 ^+ r* i7 X" `
(这里使用的LL库函数/HAL库函数)% t& j' J, p+ r& A" B) v

1 z+ y( M) }/ b! H. u; ]3 R
20210313114242230.jpg

+ Y# ~( q( F% h9 y4 w进入待机模式之前,为了正常退出待机模式需要配置唤醒源,这里是WAKEUP引脚上升沿唤醒3 ~$ @8 ^1 {" y0 b4 n+ j1 d" H

8 h4 p' l; G/ F* ~$ Q
20210313114828579.jpg

1 P& a4 {* l/ t5 V: b  ~  j: D  qSTM32L053R8T6唤醒引脚有PC13和PA0,硬件电路按下按键产生上升沿。我将其配置成了外部中断上升沿触发模式。3 c2 |7 h2 Z8 p3 `* }$ ~

! m- v2 b- t) [' P% }' L
  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>
    # J5 c8 n. G6 `& ^% h+ o% P7 z
  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>
复制代码
. ?$ x# I: B9 v8 l, _  ?6 E! K0 w
20210313115233309.png
0 G( o: s& u8 h# J# j) O7 i5 S
进入待机模式之前需要使能唤醒引脚
; P2 ]8 h. Z/ W0 Q- T, u" x& x+ j6 Z6 ~8 \
  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>
复制代码

; {4 l" P3 ]" W  c( k
+ J) z2 U- j1 {9 q以下是进入待机模式' U* h' ]3 }4 `; |4 J
: F3 V6 K5 n( s& K$ _! q; B
20210313115826181.jpg
) F; p; U- E0 J9 m* K. r+ A3 q4 _
代码
+ S* g4 W) x4 g+ E6 W" F! e0 x! H( X* @& r, {2 k8 k  M
  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>
    : B9 v) F% l: m5 t
  2. </p><p>}</p><p>) \8 ]) `, t1 O( D" B2 x) r
  3. </p><p>//寄存器</p><p>//void enter_Standby(void)</p><p>//{</p><p>: x: {5 N0 ~0 ]* L. C! w
  4. </p><p>//<span style="white-space:pre">                        </span>/*EnableClocks*/</p><p>
    $ ?( a4 ^8 z* ~" P7 |
  5. </p><p>//<span style="white-space:pre">                        </span>RCC->APB1ENR|=RCC_APB1ENR_PWREN;</p><p>
    + l1 D$ Y" @' o0 q+ Z
  6. </p><p>//<span style="white-space:pre">                        </span>/*PrepareforStandby*/</p><p>
    * g9 Z% g: ^. j  b$ C% ?( }
  7. </p><p>//<span style="white-space:pre">                                </span>//ifWKUPpinsarealreadyhigh,theWUFbitwillbeset</p><p>; l, B* {* Y4 t4 F* o# x
  8. </p><p>//<span style="white-space:pre">                        </span>PWR->CSR|=PWR_CSR_EWUP1|PWR_CSR_EWUP2;</p><p>
    ' V2 w/ d' ~; f* Q+ x
  9. </p><p>//<span style="white-space:pre">                        </span>PWR->CR|=PWR_CR_CWUF;//cleartheWUFflagafter2clockcycles</p><p>
    6 }/ a' y: r0 y, D5 h+ g' |
  10. </p><p>//<span style="white-space:pre">                        </span>PWR->CR|=PWR_CR_ULP;//V_{REFINT}isoffinlow-powermode</p><p># ~/ R- P& d  x: R
  11. </p><p>//<span style="white-space:pre">                        </span>PWR->CR|=PWR_CR_PDDS;//EnterStandbymodewhentheCPUentersdeepsleep</p><p>/ j& y) B! N8 A: k  W* e
  12. </p><p>//<span style="white-space:pre">                        </span>SCB->SCR|=SCB_SCR_SLEEPDEEP_Msk;//low-powermode=stopmode</p><p>2 k6 {  }: d9 D) h
  13. </p><p>//<span style="white-space:pre">                        </span>SCB->SCR|=SCB_SCR_SLEEPONEXIT_Msk;//reenterlow-powermodeafterISR</p><p>0 }5 L! x# y) F2 L/ i1 _% Z# q  h
  14. </p><p>//<span style="white-space:pre">                        </span>__WFI();//enterlow-powermode</p><p>' i% L5 T) j4 a$ {% s0 |
  15. </p><p>//}</p>
复制代码

8 W% v5 E5 S& e! q0 G) b项目:两节1.5V电池串联供电,外设主要包括蓝牙、OLED等,使用的内部晶振,实测工作状态电流13mA,待机模式电流65uA,差强人意。  a" g- {6 R3 G2 d
(单片机无程序状态下,电路电流为500mA左右,这电路就很离谱). |$ J* Q' {8 H, ?. o- U/ Y
7 n2 V2 o3 X; V" i
注意:0 p9 m3 ~1 e6 {

4 Y0 M1 J6 o% a) Q: B2 C
20210404092757709.png

# ^8 e+ g* s, V2 V  n, a% x高阻态并不代表外围电路没有电流,如果电路中有使用I/O口控制外设电源的,那么进入待机模式后一定要实测,要实测,实测。0 x+ W" k. d5 d, ~+ R

# f/ c* r; r! Y# Z0 P& z8 I/ `! g. T7 ~$ s% u: Z. ?6 e# R9 X, H
收藏 评论0 发布时间:2021-11-19 22:00

举报

0个回答

所属标签

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