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

news/2024/2/28 9:49:57

目录

学习目标

运行结果

待机唤醒

模式

待机模式

寄存器

配置

代码

总结 


学习目标

        本节我们讲解的是有关待机唤醒的知识,这部分知识在51中并未涉及到,我感觉还是有点意思的,有点类似与我们手机的锁屏功能和关机功能,只是选择了不同的低功耗模式。好了,接下来我们就来介绍一下待机唤醒的相关知识吧!

运行结果

待机唤醒1

待机唤醒2

待机唤醒

        在系统或电源复位以后,微控制器处于运行状态。运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码。当 CPU 不需继续运行 时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。

模式

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

    1、降低系统时钟。

    2、关闭APB和AHB总线上未被使用的外设时钟。

        这三种模式的功耗是逐渐降低的,特别是待机模式,功耗特别低,最低只需要 2.2uA 左右的电流。停机模式是次低功耗的,其典型的电流消耗在 350uA 左右。最后就是睡眠模式了。根据最低电源消耗,最快启动时间和可用的唤醒源等条件,选择一种最佳的低功耗模式。

待机模式

        F407的待机模式可实现 STM32F4 的最低功耗。该模式是在 CM4 深睡眠模式时关闭电压调节器。整个 1.2V 供电区域被断电。PLL、 HSI 和 HSE 振荡器也被断电。SRAM 和寄存器内容丢失。除备份域(RTC 寄存器、RTC 备份 寄存器和备份 SRAM)和待机电路中的寄存器外,SRAM 和寄存器内容都将丢失。而且有一个重要的点就是F407需要清零对应的RTC标志。

寄存器

        还是一样,不做详细介绍。 

配置

我们前面说了F407需要清除相应的标志位才能开启待机模式。

  1. 禁止 RTC 中断(ALRAIE、ALRBIE、WUTIE、TAMPIE 和 TSIE 等)。
  2. 清零对应中断标志位。
  3. 清除 PWR 唤醒(WUF)标志(通过设置 PWR_CR 的 CWUF 位实现)。
  4. 重新使能 RTC 对应中断。
  5. 进入低功耗模式。 

 1、使能电源时钟。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能 PWR 外设时钟

2、设置 WK_UP 引脚作为唤醒源。

PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能

3、设置 SLEEPDEEP 位,设置 PDDS 位,执行 WFI 指令,进入待机模式。

PWR_EnterSTANDBYMode(void);

4、最后编写 WK_UP 中断函数。

代码

实验一的代码。 

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"int main(void)
{ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168);    //初始化延时函数uart_init(115200);	//初始化串口波特率为115200LED_Init();				//初始化LED  KEY_Init();LED0 = 0;while(1){if(KEY_Scan(0) == KEY0_PRES){RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE );PWR_BackupAccessCmd(ENABLE);//后备区域访问使能//这里我们就直接关闭相关RTC中断RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//关闭RTC相关中断,可能在RTC实验打开了。RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清楚RTC相关中断标志位。PWR_WakeUpPinCmd(ENABLE );	PWR_ClearFlag(PWR_FLAG_WU);	PWR_EnterSTANDBYMode();}}
}

实验二的代码。

#include "wkup.h"
#include "led.h"
#include "delay.h"	
#include "usart.h"																	   //系统进入待机模式
void Sys_Enter_Standby(void)
{		while(WKUP_KD);			//等待WK_UP按键松开(在有RTC中断时,必须等WK_UP松开再进入待机)RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);//复位所有IO口RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟		 PWR_BackupAccessCmd(ENABLE);//后备区域访问使能//这里我们就直接关闭相关RTC中断RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//关闭RTC相关中断,可能在RTC实验打开了。RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清楚RTC相关中断标志位。PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 标志PWR_WakeUpPinCmd(ENABLE);//设置WKUP用于唤醒PWR_EnterSTANDBYMode();	//进入待机模式}
//检测WKUP脚的信号
//返回值1:连续按下3s以上
//      0:错误的触发	
u8 Check_WKUP(void) 
{u8 t=0;u8 tx=0;//记录松开的次数LED0=0; //亮灯DS0 while(1){if(WKUP_KD)//已经按下了{t++;tx=0;}else {tx++; if(tx>3)//超过90ms内没有WKUP信号{LED0=1;return 0;//错误的按键,按下次数不够}}delay_ms(30);if(t>=100)//按下超过3秒钟{LED0=0;	  //点亮DS0 return 1; //按下3s以上了}}
}  
//中断,检测到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_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化	//(检查是否是正常开)机    		 if(Check_WKUP()==0){Sys_Enter_Standby();	//不是开机,进入待机模式  }SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);//PA0 连接到中断线0EXTI_InitStructure.EXTI_Line = EXTI_Line0;//LINE0EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE0EXTI_Init(&EXTI_InitStructure);//配置NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道NVIC_Init(&NVIC_InitStructure);//配置NVIC}
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "wkup.h"int main(void)
{ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168);    //初始化延时函数uart_init(115200);	//初始化串口波特率为115200LED_Init();				//初始化LED  WKUP_Init();				//待机唤醒初始化	 while(1){LED0=!LED0;delay_ms(250);//延时250ms}
}

总结 

        本节介绍的是低功耗模式,主要介绍了待机模式,希望对大家有所帮助,谢谢大家了!


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

相关文章

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

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

1568_AURIX_TC275_电源管理_唤醒配置与状态

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 如果有待机RAM保持的功能激活了,那么唤醒以及复位都不会进行RAM的重新初始化。 PORST相关的滤波开了之后,可以抵抗500ns的尖峰脉冲干扰。 CPU不仅可以请求自我进入i…

Stm32 RTC周期唤醒待机模式

Stm32 RTC周期唤醒待机模式 一、前言 二、开发环境 1、软件:CubeMXMDK 2、硬件:超纬电子-NB开发板 三、参考资料 四、实现过程 1、配置CubeMX 2、程序修改 2.1、添加 wukeup函数,通过调用函数进入待机模式 void WKUP_EnterStandby(v…

怎样把LoRa模块功耗降到极致

怎样把LoRa模块功耗降到极致 一. 引言 能耗对于电池供电的产品来说是一个重大的问题,一旦电能耗尽设备将“罢工”,在某些场合电能意味着电子产品的生命。物联网时代将会有越来越多电池供电的设备通过无线通信连接,降低能耗再次摆在工程师…

安卓系统耗电太快?针对wakelock(唤醒锁)的设置优化教程

导读: android为了确保应用程序的正确执行,提供了wakelock(唤醒锁)的api,wakelock是一种锁的机制,只要有应用拿着这个锁,系统就无法进入休眠,手机耗电的问题,其实大部分是这个锁正不正常的问题。 手机上应…

root后待机耗电,手机root后耗电

手机获取了root对手机耗电有影响? 手机获取ROOT权限后一般情况下都不会对手机耗电有影响,甚至将ROOT权限授予安全软件后,还可以一定程度上减少耗电量,增加手机待机时间。 手机获取ROOT权限的主要危害: 1.第三方的恶意软件可以利用…

待机唤醒实验

在系统或电源复位以后,微控制器处于 运行状态。运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码。当 CPU 不需继续运行 时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。 STM32的3种低功耗模式: ①…

STM32L0系列单片机低功耗(STOP)使用+RTC唤醒+LPUART(DMA方式)唤醒+LPTIM唤醒

文章目录 STM32L0低功耗应用1.睡眠模式2.低功耗运行模式3.低功耗睡眠模式4.带RTC的停止模式5.不带RTC的停止模式6.带RTC待机模式7.不带RTC待机模式 进入STOP模式LPUART在DMA模式下唤醒STOP STM32L0低功耗应用 STM32L0支持7种低功耗模式,本文重点讨论停止(STOP)模式…

在 iPhone 上使用 “抬起唤醒”功能

今天给大家带来的是如何在 iPhone 上使用 “抬起唤醒”功能,还不知道如何操作的朋友,可以按照这个方法试试哦。 抬起激活 “提起激活”的优势在于,您只需拿起iPhone并查看屏幕即可。这很有用,例如,如果您想查看现在几…

[STM32F1]STM32 低功耗待机模式与RTC周期唤醒

STM32等类似Cortex-M3的MCU在系统或电源复位以后,MCU就会处于程序运行状态。当用户不需继续运行程序时,可以利用进入低功耗模式来节省电池电量,当需要重新运行时,可以通过特定条件进行唤醒程序继续或重新工作。特别是在电池供电的…

STM8L101+si4463低功耗和自动唤醒配置

刚开始接触RF通信,借助成都亿佰特的demo很快完成了数据互传,但是功耗一直降不下去,ST和SiliconLabs官方的datasheet里分别说STM8L101在halt模式功耗为1uA(开AWU的情况下)、SI4463在standby模式为50nA,但是即…

STM32CUBEMX 待机模式最简单的RTC定时唤醒(低功耗电池产品必备)

文章意义: 看到很多技术帖子讲述RTC定时唤醒功能的时候,老是需要去读取当前时间,再设定下一个闹钟唤醒时间,无形中多了很多变量和操作。所以我决定分享一种简单的RTC定时唤醒方法,适合于不需要实现具体时间获取的场合…

STM32F407待机唤醒

疑问 在做待机唤醒实验时,会有这样的疑问:只有进入待机模式的代码,那么唤醒是如何唤醒的? 原理 (此节主要针对待机唤醒原理进行简单介绍,可以根据自己情况自动略过) STM32F4待机模式 在系统…

智芯MCU软件开发环境搭建

智芯MCU软件开发环境搭建 目录 智芯MCU软件开发环境搭建前言1 软件安装2 编译环境3 烧录环境4 新建工程结束语 前言 智芯科技的MCU主要应用于汽车行业,属于车规级的MCU,目前上市的MCU型号较少,相关资料也不多,所以这里出一期开发…

笔记本设置蓝牙唤醒_苹果手机的抬起唤醒功能耗电多吗?如何尽量延长电池续航时间...

事实上曾几何时,我们知道双击亮屏包括抬手亮屏,在安卓里面是常受欢迎,但同时又非常耗电的原因就在于,借助第三方程序的长住肯定是会增加电量的消耗,这一点也让很多喜欢双击亮屏,包括抬手亮屏的用户非常的矛…

stm8低功耗 唤醒

一.MCU耗能因素 现代的MCU一般使用CMOS技术,耗能包括2种,静态消耗和动态消耗。 总电能消耗静态消耗动态消耗, 即:IDDfIDynamicRun[uA/MHz]IStatic[uA]. 静态消耗:主要是晶体管消耗能量; 因…

手机功耗之唤醒源详解

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、手机功耗问题浅析博文二、Sleep 、suspend三、SPM (System Power Manager)四、Deep idle五、SODI (screen on deep idle)六、systrace/ftrace七、w…

基于cycle of curves的Nova证明系统

1. 引言 主要见斯坦福大学Wilson Nguyen、Dan Boneh和微软研究中心Srinath Setty 2023年论文《Revisiting the Nova Proof System on a Cycle of Curves》。 前序博客有: Nova: Recursive Zero-Knowledge Arguments from Folding Schemes学习笔记 在2021年Nova …

【算法设计与分析】期末复习

文章目录 复习大纲第一章算法概述1.1算法与程序1.2 算法复杂性分析 第二章递归与分治策略分治法的基本思想递归与分治的关系:用分治法解决的问题的几个特征:例题: 第三章动态规划动态规划的基本思想:分治与动态规划算法的异同&…

C# 反射 (Reflection) 的常用功能

目录 一、概述 二、实例化类 三、反射赋值 四、获取字段值 五、获取字段名 六、获取字段类型 七、调用方法 结束 一、概述 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块,而模块包含类型,类型又包含成员。反射则…
最新文章