[STM32F1]STM32 低功耗待机模式与RTC周期唤醒
STM32等类似Cortex-M3的MCU在系统或电源复位以后,MCU就会处于程序运行状态。当用户不需继续运行程序时,可以利用进入低功耗模式来节省电池电量,当需要重新运行时,可以通过特定条件进行唤醒程序继续或重新工作。特别是在电池供电的智能终端上有着比较广泛的应用。
STM32F103三种低功耗模式状态说明:
1、睡眠模式:内核停止运行,所有外设仍然处于工作状态。
2、停止模式:所有的时钟都已停止,调压器可以被置于普通模式或低功耗模式。
3、待机模式:所有的时钟都已停止,内部1.8V部分的供电被切断,电压调节器关闭。可以达到最低的电能消耗。
三种模式电流功耗大小排序为:
运行 > 睡眠 > 停止 > 待机。
其中运行模式与睡眠模式功耗为mA级,停止模式与待机模式为uA级,其中待机最小可以达到<5uA。
如何进入?
睡眠模式:
执行WFI或WFE指令可以使MCU进入睡眠状态。
停止模式:
在以下条件下执行WFI或WFE指令:
1、设置Cortex-M3系统控制寄存器中的SLEEPDEEP位;
2、清除电源控制寄存器(PWR_CR)中的PDDS位 进入;
3、通过设置PWR_CR中LPDS位选择电压调节器的模式;
待机模式:
在以下条件下执行WFI或WFE指令:
1、设置Cortex-M3系统控制寄存器中的SLEEPDEEP位;
2、设置电源控制寄存器(PWR_CR)中的PDDS位;
3、清除电源控制/状态寄存器(PWR_CSR)中的WUF位;
如何退出?
睡眠模式:
如果是执行WFI指令进入睡眠模式,任意一个外设中断都能将系统从睡眠模式唤醒。如果是执行WFE指令进入睡眠模式,一旦发生唤醒事件时,微处理器都将从睡眠模式退出。
停止模式:
如果是执行WFI进入停止模式,任一外部中断线为中断模式可以唤醒。如果是执行WFE进入停止模式。任一外部中断线为事件模式可以唤醒。
待机模式:
待机模式唤醒只有4种:外部复位、IWDG复位、WKUP引脚上的上升沿或RTC闹钟事件的上升沿。并且从待机唤醒后,除了电源控制/状态寄存器,所有寄存器被复位。唤醒后的代码执行等同于复位后的执行。
睡眠模式进入与退出:
停止模式进入与退出
待机模式进入与退出
待机模式是功耗最低的一种模式,外部复位、IWDG复位、WKUP引脚上的上升沿比较简单。主要实验RTC闹钟事件唤醒。RTC具有三个中断源:秒中断、闹钟中断与溢出中断。
首先配置开启中断分组与电源控制器时钟:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
void RTC_Init(void){u16 BKP_Value = 0x5A5A;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);if(BKP_ReadBackupRegister(BKP_DR1) != BKP_Value) {PWR_BackupAccessCmd(ENABLE);RCC_LSEConfig(RCC_LSE_ON);while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET)IWDG_ReloadCounter();RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);RCC_RTCCLKCmd(ENABLE);RTC_WaitForLastTask();RTC_WaitForSynchro();RTC_WaitForLastTask();RTC_SetPrescaler(32767);RTC_WaitForLastTask();RTC_SetCounter(0);RTC_WaitForLastTask();RTC_SetAlarm(RTC_GetCounter() + SLEEP_TIME);RTC_WaitForLastTask();RTC_ITConfig(RTC_IT_ALR, ENABLE);RTC_WaitForLastTask();BKP_WriteBackupRegister(BKP_DR1, BKP_Value);RTC_WaitForLastTask();PWR_BackupAccessCmd(DISABLE);} else {PWR_BackupAccessCmd(DISABLE);RTC_WaitForSynchro();RTC_ITConfig(RTC_IT_ALR, ENABLE);RTC_WaitForLastTask();}}
RTC中断代码:在中断中重新清除相关标志并重新配置参数。
void RTC_IRQHandler(void){IWDG_Feed();if (RTC_GetITStatus(RTC_IT_SEC) != RESET) {RTC_ClearITPendingBit(RTC_IT_SEC);}if(RTC_GetITStatus(RTC_IT_ALR)!= RESET) {RTC_ClearITPendingBit(RTC_IT_ALR);PWR_BackupAccessCmd(ENABLE);RTC_WaitForLastTask();RTC_SetAlarm(RTC_GetCounter() + SLEEP_TIME);RTC_WaitForLastTask();PWR_BackupAccessCmd(DISABLE);}RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET) {PWR_ClearFlag(PWR_FLAG_WU);}if(PWR_GetFlagStatus(PWR_FLAG_SB) != RESET) {PWR_ClearFlag(PWR_FLAG_SB);}}
这样就可以实现在任务代码中调用PWR_EnterSTANDBYMode();进入低功耗,MCU会在每隔SLEEP_TIME之后进行唤醒,
可以通过该办法周期性唤醒实现上电必要端口检测等条件来确定是否进入运行模式或者是继续进入低功耗模式来节约电池电量。
说明:RTC配置部分已经经过实验确定可以周期唤醒,有需要的可以直接使用。
---------------------
作者:forgot
链接:https://bbs.21ic.com/icview-3282280-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。
[STM32F1]STM32 低功耗待机模式与RTC周期唤醒相关推荐
- STM32/AMP32F407进入低功耗待机模式后立马被唤醒的解决办法
最近项目用到低功耗,但是调试发现进入待机就被唤醒的问题,清除WU.SB两个唤醒标志位,也依然被立马唤醒一次. /* 进入待机模式 */HAL_PWR_EnterSTANDBYMode(); 通过极海的 ...
- STM32 低功耗睡眠模式(SLEEP)事件(EVENT)唤醒实现及优化
STM32 低功耗睡眠模式(SLEEP)事件(EVENT)唤醒实现及优化 1. 介绍 STM32具有多种低功耗模式,当前以STM32L4系列的低功耗模式最为丰富,此处基于STM32L476和STM32 ...
- STM32CubeMX学习笔记(17)——电源管理(PWR)低功耗待机模式
一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗.由用户根据应用选择具体的低功耗模式,以在低功耗.短启动时间和可用唤醒源之间寻求最佳平衡. 睡眠模 ...
- STM32低功耗停止模式 以及简述判断中断的两种方式
#include "wkup.h" #include "led.h" #include "delay.h" // //本程序只供学习使用,未 ...
- 将STM32设置睡眠模式(使用中断唤醒)之小白学习笔记
#include "bsp_exti.h" #include "Led_Key.h" #include "bsp_SysTick.h" in ...
- STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例)
STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例) 目录 STM32CubeMX | STM32 F1系列HAL库低功耗 ...
- 【STM32】电源控制、低功耗模式(实例:待机模式)
STM32F1xx官方资料: <STM32中文参考手册V10>-第4章4.3小节 低功耗模式 STM32的电源控制 STM32的电源框图 STM32的工作电压(VDD)为2.0-3.6V. ...
- STM32——浅谈睡眠模式、停机模式、待机模式
若要理解低功耗,则先要说一下STM32的事件和中断 事件是中断的触发源,开放了对应的中断屏蔽位,则事件可以触发相应的中断.在STM32中,中断与事件不是等价的,一个中断肯定对应一个事件,但一个事件不一 ...
- STM32低功耗模式
STM32 的低功耗模式有 3种: 1)睡眠模式(CM3内核停止,外设仍然运行) 2)停止模式(所有时钟都停止) 3)待机(standby)模式(1.8V内核电源关闭) 从待机模式唤醒后的代码执行等同 ...
最新文章
- SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
- eclipse打开,莫名报一堆错(Syntax error on tokens, delete these tokens )
- 果断收藏!六大主流大数据采集平台架构分析
- SAP Spartacus outlet.directive.ts里this.templateRef的来源
- python采用编译型方式执行_Python程序的执行过程 解释型语言和编译型语言
- jsapi支付签名_微信支付小程序支付全流程
- Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)
- 《我也能做CTO之.程序员职业规划》 水准之上,期望以下
- C++动态绑定及返回类型协变
- CentOS7中使用systemctl列出启动失败的服务
- POJ1107 ZOJ1042 UVALive2291 W's Cipher【密码+模拟】
- Python模块受欢迎排行榜Top200
- 架构运维篇(四):Centos7/Linux中Tomcat安装SSL证书实践
- 变分模态分解(VMD)运算步骤及源码解读
- iOS 咻一咻,雷达,搜索动画,radarView
- 如何查看IP地址是否被占用
- 我们要不要和to B“霸王龙”企业交朋友?
- VRP系统——路由器配置之信息中心基础
- 互联网产品经理必读书籍
- java5至java17新特性总结(开发相关)