STM32 待机唤醒

news/2024/10/28 18:33:37/

STM32的3种低功耗模式

  1. 睡眠模式:内核停止,外设如NVIC,系统时钟Systick仍运行。
  2. 停止模式:所有时钟都已停止;1.8V内核电源工作;PLL,HIS和HSERC振荡器功能禁止;寄存器和SRAM内容保留。
  3. 待机模式:1.8V内核电源关闭;只有备份寄存器和待机电路维持供电;寄存器和SRAM内容全部丢失;实现最低功耗。

STM32的3种低功耗唤醒方式
这里写图片描述
STM32待机模式
在待机模式下,所有的I/O引脚均处于高阻态,除了复位引脚、被使能的唤醒引脚和TAMPER引脚。待机模式下只有2uA的电流,停机模式下20uA的电流。
库函数进入待机模式
1. 使能电源时钟。
2. 设置WK_UP引脚作为唤醒源。
3. 设置SLEEPDEEP位,设置PDDS位,执行WFI指令,进入待机模式。

CODE

#include "wkup.h"
#include "led.h"
#include "delay.h"void Sys_Standby(void)
{  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能电源时钟PWR_WakeUpPinCmd(ENABLE);  //使能唤醒管脚功能PWR_EnterSTANDBYMode();    //进入待命(STANDBY)模式         
}//系统进入待机模式
void Sys_Enter_Standby(void)
{            RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //复位所有IO口Sys_Standby();
}//检测WKUP脚的信号
//返回值1:连续按下3s以上
//     0:错误的触发  
u8 Check_WKUP(void) 
{u8 t=0; //记录按下的时间LED0=0; //亮灯LED0 while(1){if(WKUP_KD){t++;            //已经按下了 delay_ms(30);if(t>=100)      //按下超过3秒钟{LED0=0;     //点亮DS0 return 1;   //按下3s以上了}}else { LED0=1;return 0; //按下不足3秒}}
} //中断,检测到PA0脚的一个上升沿.   
//中断线0线上的中断检测
void EXTI0_IRQHandler(void)
{                                                       EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中断标志位        if(Check_WKUP())//关机?{         Sys_Enter_Standby();  } 
} 
//PA0 WKUP唤醒初始化
void WKUP_Init(void)
{   GPIO_InitTypeDef  GPIO_InitStructure;         NVIC_InitTypeDef NVIC_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//使能GPIOA和复用功能时钟GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;     //PA.0GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;//上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化IO//使用外部中断方式GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //中断线0连接GPIOA.0EXTI_InitStructure.EXTI_Line = EXTI_Line0;  //设置按键所有的外部线路EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;         //设外外部中断模式:EXTI线路为中断请求EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  //上升沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); // 初始化外部中断NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级2级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器if(Check_WKUP()==0) Sys_Standby();    //没有按三秒,不是开机,进入待机模式  
}

http://www.ppmy.cn/news/503415.html

相关文章

STM32——待机唤醒实验-低功耗-M4

一、低功耗模式介绍 低功耗模式:在系统或者电源复位后,微控制器出于运行状态之下,HCLK为CPU提供时钟,内核执行代码。当CPU不需要继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个事件触发。 ST…

RTC唤醒低功耗(standby)模式

这段时间在公司最一个低功耗的项目,采用的的STM32F103的最低功耗standby模式,进入最低功耗模式后,电流降到了3uA,和芯片手册上的大致相同。对进入低功耗模式,网上有很多程序,我在这里把我的粘贴上来,仅供参…

安卓Alarm闹钟唤醒耗电问题的排查

一、故事背景 当我们的安卓APP进行厂商预装时,对方往往对APP后台耗电有严格的要求。因此、他们对Alarm唤醒频率有严格要求。 当厂商反馈我们APP的Alarm唤醒频率太高而没有给出详细信息时,我们往往只有硬着头皮去排查自己代码中Alarm的使用。 不幸的是…

stm32的低功耗模式和RTC闹钟唤醒

一 、STM32待机模式简介 很多单片机都有低功耗模式,STM32也不例外。在系统或电源复位以后,微控制器处于运行状态。运行状态下的HCLK为CPU提供时钟,内核执行程序代码。当CPU不需继续运行时,可以利用多个低功耗模式来节省功耗&#…

RK3588 EVB1蓝牙休眠唤醒调试

RK3588 EVB1蓝牙休眠唤醒调试 rk平台支持二级休眠,即SOC大部分电都关了,只留下唤醒源需要的电. rk3588 evb1因为蓝牙相关的部分大部分IO没有接到PMU电源域,所以调试起来需要另外配置,以方便快速验证. 下面,我们以博通AP6275p芯片为例, 分析下快速验证蓝牙休眠唤醒需要的设定…

JTA1145 休眠唤醒调试总结

最近因为项目,选择了这颗芯片,花了2天多时间,总算是把这个芯片的休眠唤醒功能基本调了,在这里做一个技术总结,希望可以帮到有需要的人! TJA1145芯片简介 TJA1145是一款高速CAN收发器,可在控制…

(24)STM32——待机唤醒(低功耗)笔记

目录 学习目标 运行结果 待机唤醒 模式 待机模式 寄存器 配置 代码 总结 学习目标 本节我们讲解的是有关待机唤醒的知识,这部分知识在51中并未涉及到,我感觉还是有点意思的,有点类似与我们手机的锁屏功能和关机功能,只是…

STM32L031低功耗深度睡眠RTC唤醒注意事项

0. 第一可以进入休眠,第二次无法进入休眠,折腾了好久。后来想想应该是进入休眠后立刻被唤醒了,应该是上次的唤醒中断没清除。在启动唤醒前加入以下语句,问题解决。 __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); //清除标志&#xf…