本文章基于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休眠唤醒(停机模式)、独立看门狗开启状态下相关推荐

  1. stm32专题三十四:独立看门狗 IWDG

    独立看门狗简介 IWDG结构框图 (1)独立看门狗时钟 独立看门狗的时钟由独立的 RC 振荡器 LSI 提供, 即使主时钟发生故障它仍然有效,非常独立. LSI 的频率一般在 30~60KHZ 之间, ...

  2. STM32CubeMX(stm32F030C8T6) 之RTC闹钟唤醒停机模式-STM32开发实战 (2)

    一.概述 本例程是用STOP休眠模式,用RTC的周期性自动唤醒功能来唤醒芯片. 根据手册的说明:这里有个可编程的可自动重装的向下计数器,按照相应的时钟频率赋予适当的值,每当向下计数到0时便产生一个唤醒 ...

  3. MCU独立看门狗 vs 窗口看门狗

    关注+星标公众号,不错过精彩内容 素材来源 | STM32 微信公众号 | 嵌入式专栏 早期的MCU没有看门狗,就容易引起有些产品死机了不能重启工作.为了避免这个问题,后期的MCU在内部集成了看门狗的 ...

  4. 从零实现 独立看门狗IWDG STM32的待机与唤醒,在待机过程中如何喂狗

    欢迎大家留言交流~ 前言: 最近在学习原子的阿波罗,进行到待机实验,实验目的是摁下KEY_UP的时候就可以让MCU从待机模式唤醒了.而KEY1在按下的时候进入休眠.(验证过程比较繁琐,只看结论的小伙伴 ...

  5. stm32独立看门狗和rtc闹钟

    独立看门狗 1.独立看门狗概述 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会 ...

  6. stm32 定时器_如何计算STM32定时器、独立看门狗和窗口看门狗

    点击上方蓝色字体,关注我们 本博文简要阐述STM32L011微控制器定时器的参数配置(其他型号大同小异,本文侧重讲解配置,至于各类定时器的特点后续再述),STM32定时器种类繁多有通用定时器.基本定时 ...

  7. 【STM32】HAL库 STM32CubeMX教程五----看门狗(独立看门狗,窗口看门狗)

    前言:   今天我们来学习看门狗的配置与函数,看门狗可以有效解决程序的跑飞,在使用过程中比较常见,是防止芯片故障的有效外设,我们一起来学习下HAL库 STM32CubeMX的独立看门狗,窗口看门狗的使 ...

  8. STM32系列 STM32F4xx 独立看门狗(IWDG)

    2019独角兽企业重金招聘Python工程师标准>>> 0 前言     由于单片机的工作常常会受到来自外界电磁场的干扰,造成各种寄存器和内存数据混乱,会导致程序指针错误,不在程序区 ...

  9. cubeIDE开发, stm32独立看门狗IWDG的CubeMX配置及HAL库底层实现分析

    一.STM32 的IWDG简介 2.1 看门狗原理 看门狗本质上就是一种计数器,和我们现实生活中一炷香现象.沙漏现象等是同理的,计数器一般有两种做法,一种是递增,超过固定阀值报警:一种是递减,通常值降 ...

最新文章

  1. 游戏基础体验研究:玩家想要什么样的美术品质?
  2. 从OpenFOAM的源码中查找信息
  3. 解决配置Ubuntu中vnc远程显示灰屏
  4. 程序员面试金典 - 面试题 16.19. 水域大小(BFS/DFS)
  5. 美国世态什么样,看这条“K”线就够了
  6. 高考计算机模拟系统,高考工厂模拟
  7. 简述一下索引的匹配原则_Mysql联合索引最左匹配原则
  8. 人造肉公司大受追捧!美国公司Beyond Meat在IPO首日暴涨163%
  9. Spring mvc 中文乱码
  10. zip安装mysql没有软件,windows10系统安装mysql-8.0.13(zip安装) 的教程详解
  11. ireport5.6+jasperreport6.3开发(四)--以javabean为基准的报表开发(ireport)
  12. 第3章 FOR命令中的变量
  13. python opencv 检测圆
  14. java jpa 教程 查询_Spring Boot JPA 使用教程
  15. 网络协议 终章 - GTP 协议:复杂的移动网络
  16. python公历转农历_Python 农历公历相互转换
  17. Python模拟登陆强智教务以及使用(持续更新中)
  18. 【C语言编程练习】华氏转换为摄氏
  19. 华三模拟器:实现路由器接口使用dhcp获取地址
  20. 老牌安全公司CYBER ARK眼中的RPA部署安全问题

热门文章

  1. 微信公众号发送中奖模板消息
  2. windows编译opencv opencv-contrib
  3. cfg文件Linux怎么打开,cfg文件扩展名,cfg文件怎么打开?
  4. ESXI如何封装网卡驱动
  5. python----four
  6. RGB、多光谱、高光谱、全色图介绍
  7. 如何解决nas无公网问题,实现kodbox可道云内网映射外网访问
  8. 互联网远程办公 关于公司执行线上办公管理办法
  9. GB2312汉字大全
  10. 十六进制(二进制)编辑器