【STM32】RTC休眠唤醒(停机模式)、独立看门狗开启状态下
本文章基于STM32F103RC;
在开启独立看门狗的状态下,进入停机模式,由RTC定时闹钟唤醒系统。
直接上代码:
#include "main.h" static void RTC_NVIC_Config(void)
{ EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn; //RTC闹钟中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级1位NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //先占优先级0位NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能该通道中断NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
// //闹钟中断接到第17线外部中断EXTI_ClearITPendingBit(EXTI_Line17);EXTI_InitStructure.EXTI_Line = EXTI_Line17;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); }//实时时钟配置
//初始化RTC时钟,同时检测时钟是否工作正常
//BKP->DR1用于保存是否第一次配置的设置
//返回1:正常
//其他:错误代码
u8 RTC_Init(void)
{//检查是不是第一次配置时钟u8 temp=0;RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟 PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问 if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎{BKP_DeInit(); //复位备份区域 //RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振RCC_LSICmd(ENABLE);//开启内部低速晶振LSI//while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待外部低速晶振就绪while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) //检查指定的RCC标志位设置与否,等待内部低速晶振就绪{temp++;delay_ms(10);}if(temp>=250)return 0;//初始化时钟失败,晶振有问题 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //设置RTC时钟(RTCCLK),选择LSI作为RTC时钟//RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟 RCC_RTCCLKCmd(ENABLE); //使能RTC时钟 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成RTC_WaitForSynchro(); //等待RTC寄存器同步 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成RTC_EnterConfigMode();/// 允许配置 RTC_SetPrescaler(32767); //设置RTC预分频的值RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成RTC_SetCounter(0); //初始值设定为0sRTC_WaitForLastTask();RTC_ExitConfigMode(); //退出配置模式 BKP_WriteBackupRegister(BKP_DR1, 0X5050); //向指定的后备寄存器中写入用户程序数据}else//系统继续计时{PWR_BackupAccessCmd(DISABLE);RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成}RTC_NVIC_Config();//RCT中断分组设置 return 1; //ok
} //RTC定时闹钟时间设置以及开启
void RTC_Set_Alarm_Time(uint32_t AlarmValue)
{if(AlarmValue == 0){return;}EXTI_ClearITPendingBit(EXTI_Line17);RTC_ClearFlag(RTC_FLAG_ALR);PWR_BackupAccessCmd(ENABLE);RTC_EnterConfigMode(); RTC_SetAlarm(AlarmValue+RTC_GetCounter()); //闹钟值设定为AlarmValue秒RTC_WaitForLastTask();RTC_ExitConfigMode(); PWR_BackupAccessCmd(DISABLE);RTC_NVIC_Config();RTC_ITConfig(RTC_IT_ALR, ENABLE); //使能RTC闹钟中断
}//RTC闹钟中断
void RTCAlarm_IRQHandler(void)
{EXTI_ClearITPendingBit(EXTI_Line17);RTC_ClearFlag(RTC_FLAG_ALR);SystemInit();//重要,由于停机下对所有时钟关闭,所以唤醒需要重新配置时钟!!if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET){PWR_ClearFlag(PWR_FLAG_WU);// 清除唤醒标志}RTC_ITConfig(RTC_IT_ALR, DISABLE); //失能RTC闹钟中断
}//系统进入停机模式
void Sys_Enter_STOPMode(void)
{ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR外设时钟PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);//进入停机模式
}/***************************************************************************
名 称:MCU_STOP
功 能:MCU进入停机模式,且期间会唤醒进行喂狗,避免看门狗复位
入口参数:
uint32_t Stop_Time :停机时间长度(单位:秒);
uint32_t Wdg_Time :休眠期间唤醒喂狗间隔(单位:秒),要小于看门狗复位时间,否则会来不及喂狗导致MCU复位
出口参数:无
说 明:
调用方法:MCU_STOP(300,15);即MCU休眠300S,期间每隔15S喂狗一次
***************************************************************************/
void MCU_STOP(uint32_t Stop_Time,uint32_t Wdg_Time)
{if((Stop_Time == 0) || (Wdg_Time == 0))//参数检测{return;}if(RTC_Init()) //RTC初始化成功{uint32_t i = 0;uint32_t cycle_times = 0; //循环次数uint32_t last_time = 0; //最后一次定时时间cycle_times = Stop_Time/Wdg_Time; //取商last_time = Stop_Time%Wdg_Time; //取余for(i = 0;i < cycle_times;i++){IWDG_Feed(); //看门狗喂狗RTC_Set_Alarm_Time(Wdg_Time); //设置唤醒时间Sys_Enter_STOPMode(); //系统进入停机模式}if(last_time != 0){IWDG_Feed(); //看门狗喂狗RTC_Set_Alarm_Time(last_time); //设置唤醒时间Sys_Enter_STOPMode(); //系统进入停机模式}IWDG_Feed(); //看门狗喂狗}
}
应用中直接使用MCU_STOP函数进入休眠即可。
整个工程文件下载:
关注公众号:逸趣汇
微信号:yiquhui666
发送:010301 或 RTC 获取下载链接。
【STM32】RTC休眠唤醒(停机模式)、独立看门狗开启状态下相关推荐
- stm32专题三十四:独立看门狗 IWDG
独立看门狗简介 IWDG结构框图 (1)独立看门狗时钟 独立看门狗的时钟由独立的 RC 振荡器 LSI 提供, 即使主时钟发生故障它仍然有效,非常独立. LSI 的频率一般在 30~60KHZ 之间, ...
- STM32CubeMX(stm32F030C8T6) 之RTC闹钟唤醒停机模式-STM32开发实战 (2)
一.概述 本例程是用STOP休眠模式,用RTC的周期性自动唤醒功能来唤醒芯片. 根据手册的说明:这里有个可编程的可自动重装的向下计数器,按照相应的时钟频率赋予适当的值,每当向下计数到0时便产生一个唤醒 ...
- MCU独立看门狗 vs 窗口看门狗
关注+星标公众号,不错过精彩内容 素材来源 | STM32 微信公众号 | 嵌入式专栏 早期的MCU没有看门狗,就容易引起有些产品死机了不能重启工作.为了避免这个问题,后期的MCU在内部集成了看门狗的 ...
- 从零实现 独立看门狗IWDG STM32的待机与唤醒,在待机过程中如何喂狗
欢迎大家留言交流~ 前言: 最近在学习原子的阿波罗,进行到待机实验,实验目的是摁下KEY_UP的时候就可以让MCU从待机模式唤醒了.而KEY1在按下的时候进入休眠.(验证过程比较繁琐,只看结论的小伙伴 ...
- stm32独立看门狗和rtc闹钟
独立看门狗 1.独立看门狗概述 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会 ...
- stm32 定时器_如何计算STM32定时器、独立看门狗和窗口看门狗
点击上方蓝色字体,关注我们 本博文简要阐述STM32L011微控制器定时器的参数配置(其他型号大同小异,本文侧重讲解配置,至于各类定时器的特点后续再述),STM32定时器种类繁多有通用定时器.基本定时 ...
- 【STM32】HAL库 STM32CubeMX教程五----看门狗(独立看门狗,窗口看门狗)
前言: 今天我们来学习看门狗的配置与函数,看门狗可以有效解决程序的跑飞,在使用过程中比较常见,是防止芯片故障的有效外设,我们一起来学习下HAL库 STM32CubeMX的独立看门狗,窗口看门狗的使 ...
- STM32系列 STM32F4xx 独立看门狗(IWDG)
2019独角兽企业重金招聘Python工程师标准>>> 0 前言 由于单片机的工作常常会受到来自外界电磁场的干扰,造成各种寄存器和内存数据混乱,会导致程序指针错误,不在程序区 ...
- cubeIDE开发, stm32独立看门狗IWDG的CubeMX配置及HAL库底层实现分析
一.STM32 的IWDG简介 2.1 看门狗原理 看门狗本质上就是一种计数器,和我们现实生活中一炷香现象.沙漏现象等是同理的,计数器一般有两种做法,一种是递增,超过固定阀值报警:一种是递减,通常值降 ...
最新文章
- 游戏基础体验研究:玩家想要什么样的美术品质?
- 从OpenFOAM的源码中查找信息
- 解决配置Ubuntu中vnc远程显示灰屏
- 程序员面试金典 - 面试题 16.19. 水域大小(BFS/DFS)
- 美国世态什么样,看这条“K”线就够了
- 高考计算机模拟系统,高考工厂模拟
- 简述一下索引的匹配原则_Mysql联合索引最左匹配原则
- 人造肉公司大受追捧!美国公司Beyond Meat在IPO首日暴涨163%
- Spring mvc 中文乱码
- zip安装mysql没有软件,windows10系统安装mysql-8.0.13(zip安装) 的教程详解
- ireport5.6+jasperreport6.3开发(四)--以javabean为基准的报表开发(ireport)
- 第3章 FOR命令中的变量
- python opencv 检测圆
- java jpa 教程 查询_Spring Boot JPA 使用教程
- 网络协议 终章 - GTP 协议:复杂的移动网络
- python公历转农历_Python 农历公历相互转换
- Python模拟登陆强智教务以及使用(持续更新中)
- 【C语言编程练习】华氏转换为摄氏
- 华三模拟器:实现路由器接口使用dhcp获取地址
- 老牌安全公司CYBER ARK眼中的RPA部署安全问题