待机唤醒实验

news/2024/12/21 20:43:27/

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

STM32的3种低功耗模式:

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

在运行模式下,可以通过下面方式降低功耗:

① 降低系统时钟。

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

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

STM32F4的待机模式

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

从待机模式唤醒后的代码执行等同于复位后的执行(采样启动模式引脚,读取复位向量等)。 电源控制/状态寄存器(PWR_CSR)将会指示内核由待机状态退出。

进入待机模式涉及到 2 个寄存器,电源控制寄存器(PWR_CR)和电源控制/状态寄存器(PWR_CSR)。

PWR_CR电源控制寄存器

①设置PDDS位进入深度睡眠时进入待机模式。

②设置CWUF位,清除之前的WUF唤醒位。

PWR_CSR电源控制/状态寄存器

① 设置EWUP,使能WKUP 引脚用于待机唤醒。

② WUF唤醒标志,用来判断是否发生唤醒事件。

对于使能了 RTC 闹钟中断或 RTC 周期性唤醒等中断的时候,进入待机模式前,必须按如 下操作处理:

1, 禁止 RTC 中断(ALRAIE、ALRBIE、WUTIE、TAMPIE 和 TSIE 等)。

2, 清零对应中断标志位。

3, 清除 PWR 唤醒(WUF)标志(通过设置 PWR_CR 的 CWUF 位实现)。

4, 重新使能 RTC 对应中断。

5, 进入低功耗模式。

在有用到 RTC 相关中断的时候,必须按以上步骤执行之后,才可以进入待机模式,否则可能无法唤醒。

固件库中低功耗操作函数

文件:stm32f4xx_pwr.c  / stm32f4xx_pwr.h

void PWR_EnterSTOPMode();//进入停机模式

void PWR_EnterSTANDBYMode(void);//进入待机模式

void PWR_WakeUpPinCmd(FunctionalState NewState);//使能Wakeup引脚唤醒

FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG);

void PWR_ClearFlag(uint32_t PWR_FLAG);

文件: core_cm4.h

__WFI() ;

__WFE() ;

待机唤醒配置步骤:

①使能电源时钟。因为要配置电源控制寄存器,所以必须先使能电源时钟。RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

② RTC相关处理:关闭RTC相关中断。

③设置WK_UP引脚作为唤醒源。设置PWR_CSR的EWUP位,使能WK_UP用于将CPU从待机模式唤醒。

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

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

void PWR_EnterSTANDBYMode(void);

配置以及主函数

通过串口在屏幕上打印时间,我们在13:50:00前通过KEY0按键来开启待机模式,通过闹钟在13:50:00唤醒。

int main(void)
{ u32 x=0;RTC_TimeTypeDef RTC_TimeStruct;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168);  //初始化延时函数LED_Init();				//初始化LED端口 BEEP_Init();      //初始化蜂鸣器端口KEY_Init();       //初始化与按键连接的硬件接口My_RTC_Init();uart_init(115200);		//初始化串口波特率为115200LED0=0;				  	//先点亮红灯delay_ms(1000);while(1){if(x%100==0){RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);printf("Time:%02d:%02d:%02d\r\n",RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds);}if(KEY_Scan(0)==KEY0_PRES){RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);	//使能PWR外设时钟PWR_BackupAccessCmd(ENABLE);//后备区域访问使能RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//关闭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);  //使能唤醒管脚功能		RTC_Set_AlarmA(5,13,50,0); PWR_EnterSTANDBYMode();	  //进入待命(STANDBY)模式}delay_ms(10);x++;}}

运行视频

待机唤醒实验

 


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

相关文章

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型号较少,相关资料也不多,所以这里出一期开发…

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

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