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

【经验分享】stm32实现待机唤醒

[复制链接]
STMCU小助手 发布时间:2022-2-9 20:36
STM32的低功耗模式有3种:# e2 X2 S- y  V3 s- @2 V' B
1、睡眠模式(CM3内核停止,外设仍然运行)* @; P# X$ `! j! H! L& o& ?( O0 z$ T
2、停机模式(所有时钟都停止)7 G1 J9 Q' k# v6 i
3、待机模式(1.8v内核电源关闭)
2 T# }" G( f. ?6 q) y# X
848073-20170116142535474-1572345116.png
7 O/ K9 N5 {: q2 k; j/ O# J
进入待机模式的方法,以及设置WK_UP引脚用于把STM32从待机模式唤醒的方法1 Q3 k# K4 x* D) P' O) z( t( D
一般步骤如下:* Z% q( }% P7 ^9 l# P
1、设置SLEEPDEEP位
" ], d+ M0 t  LSCB_SCR的第二位
0 U/ s% h+ Y; l2、使能电源时钟,设置WK_UP引脚作为唤醒源
+ \$ j5 v. a. M' v( S* Q因为要配置电源控制寄存器,所以必须先使能电源时钟。然后再设置PWR_CSR的EWUP位,使能WK_UP用于将CPU从待机模式唤醒。
2 ^' ~8 {, s( K' v! y: g- e+ ?3、设置 PDDS PDDS位,执行 WFI 指令,进入待机模式。+ b" ^% X( d5 G: q& ]
通过 PWR_CR 设置 PDDS 位,使得 CPU 进入深度睡眠时待机模式,最后执行 WFI指令开始进入待机模式,并等WK_UP中断的到来' `' n- b8 ?) {, }  C
4、最后编写WK_UP中断函数
下面是进入待机模式的代码
  1. //进入待机模式3 T5 i& v/ S) @0 Y9 u' [
  2. void STAND_By(void){9 I/ u# e9 J: W2 P7 q& W( S
  3.     SCB->SCR |= 1<<2; //设置SLEEPDEEP位/ @0 ^, l% Q3 K4 H" L- e" D
  4.     RCC->APB1ENR |= 1<<28;//使能电源时钟, K: f6 S6 Y3 s3 D
  5.     PWR->CSR |= 1<<8;    //设置WK_UP作为唤醒源, ^! E# T* T: R$ U2 L& o
  6.     PWR->CR |= 1<<1;    //设置PDDS位,进入深睡眠模式$ u/ y' y0 p/ B
  7.     PWR->CR |= 1<<2; //清除唤醒位: y# b# C# f/ [5 [3 @
  8.     __ASM volatile("wfi"); //执行WFI命令- I: ?/ r* L. E8 V9 f' A: h
  9. }
复制代码

6 w. }5 [; v& V5 `6 Z
最后实现的现象是,烧入程序,复位后,开始执行程序,进入待机模式,长按WK_UP键3秒,退出待机模式,重新执行代码(从待机模式唤醒后的代码执行 等同于复位后代码的执行),小灯开始闪烁。
之后如果再次长按WK_UP键3秒,就会再次进入待机模式。
  1. //WK_UP键初始化2 U, `' _9 V7 F. {2 F: Y
  2. void WKUP_Init(void){
    2 h% {7 `1 e0 |" I1 p/ p
  3.     RCC->APB2ENR |= 1<< 2; //使能GPIOA时钟' b+ Q0 a5 Y5 _1 G
  4.     //设置GPIOA为上拉输入
    ) h% @3 R% G3 _2 B: u; O, G* @
  5.     GPIOA->CRL &= 0xFFFFFFF0;
    " }; q* R# ~( h' P7 C" Q
  6.     GPIOA->CRL |= 0x00000008;5 g% I1 F' m0 o6 c* u! e
  7.     GPIOA->IDR |= 1<<0; + i& Q' a# ?7 k  c4 U  z
  8.     8 a4 I0 R8 k* h/ S* y- y# m* t
  9.     //中断配置
    * C7 U# |7 m. w7 _; A+ |( {0 e
  10.     Ex_NVIC_Config(GPIO_A,0,RTIR);//上升沿有效   
    : a0 l# }) O; x, d7 \
  11.     if(CHECK_Wkup()==0) STAND_By();
    ; P- A0 h9 W0 C. y# j
  12.     MY_NVIC_Init(2,2,EXTI0_IRQn,2);//中断分组   
    0 j3 |+ D% J2 d( A% _6 T* H
  13. }
复制代码

1 S1 N& U, o- G, F5 I
上诉代码中非常重要的一句话是:
  1. if(CHECK_Wkup()==0) STAND_By();
复制代码
) _+ w  b" |' t" p
只有加上这句话,才能实现长按唤醒,而不是一按就唤醒。

' b4 R% u2 a6 R6 k7 `" K
收藏 评论0 发布时间:2022-2-9 20:36

举报

0个回答

所属标签

相似分享

官网相关资源

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