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

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

[复制链接]
STMCU小助手 发布时间:2022-2-9 20:36
STM32的低功耗模式有3种:
1、睡眠模式(CM3内核停止,外设仍然运行)
2、停机模式(所有时钟都停止)
3、待机模式(1.8v内核电源关闭)

848073-20170116142535474-1572345116.png

进入待机模式的方法,以及设置WK_UP引脚用于把STM32从待机模式唤醒的方法
一般步骤如下:
1、设置SLEEPDEEP位
SCB_SCR的第二位
2、使能电源时钟,设置WK_UP引脚作为唤醒源
因为要配置电源控制寄存器,所以必须先使能电源时钟。然后再设置PWR_CSR的EWUP位,使能WK_UP用于将CPU从待机模式唤醒。
3、设置 PDDS PDDS位,执行 WFI 指令,进入待机模式。
通过 PWR_CR 设置 PDDS 位,使得 CPU 进入深度睡眠时待机模式,最后执行 WFI指令开始进入待机模式,并等WK_UP中断的到来
4、最后编写WK_UP中断函数
下面是进入待机模式的代码
  1. //进入待机模式
  2. void STAND_By(void){
  3.     SCB->SCR |= 1<<2; //设置SLEEPDEEP位
  4.     RCC->APB1ENR |= 1<<28;//使能电源时钟
  5.     PWR->CSR |= 1<<8;    //设置WK_UP作为唤醒源
  6.     PWR->CR |= 1<<1;    //设置PDDS位,进入深睡眠模式
  7.     PWR->CR |= 1<<2; //清除唤醒位
  8.     __ASM volatile("wfi"); //执行WFI命令
  9. }
复制代码

最后实现的现象是,烧入程序,复位后,开始执行程序,进入待机模式,长按WK_UP键3秒,退出待机模式,重新执行代码(从待机模式唤醒后的代码执行 等同于复位后代码的执行),小灯开始闪烁。
之后如果再次长按WK_UP键3秒,就会再次进入待机模式。
  1. //WK_UP键初始化
  2. void WKUP_Init(void){
  3.     RCC->APB2ENR |= 1<< 2; //使能GPIOA时钟
  4.     //设置GPIOA为上拉输入
  5.     GPIOA->CRL &= 0xFFFFFFF0;
  6.     GPIOA->CRL |= 0x00000008;
  7.     GPIOA->IDR |= 1<<0;
  8.    
  9.     //中断配置
  10.     Ex_NVIC_Config(GPIO_A,0,RTIR);//上升沿有效   
  11.     if(CHECK_Wkup()==0) STAND_By();
  12.     MY_NVIC_Init(2,2,EXTI0_IRQn,2);//中断分组   
  13. }
复制代码

上诉代码中非常重要的一句话是:
  1. if(CHECK_Wkup()==0) STAND_By();
复制代码

只有加上这句话,才能实现长按唤醒,而不是一按就唤醒。

收藏 评论0 发布时间:2022-2-9 20:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

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