STM32 rtc唤醒 低功耗待机模式 避免iwdog看门狗方案
我们知道stm32f103有很好的低功耗模式,可以使用rtc的闹钟用于定时的唤醒。但很难在IWDOG的使用情况下,设置低功耗。我为了处理这个问题,我们需要设置掉电标志位,因为stm32复位重启后看门狗会失效,在配置看门狗前去检查低功耗标志是否使能,如果使能则直接进入低功耗。从而避免了看门狗的重启困扰。BKP区域用于掉电标志非常安全合适。
直接上代码(测试板子stm32f103)
首先是rtc.c文件,包含掉电备用数据读写(BKP区域用作设置掉电标志位最合适了,有20个16位寄存器),RTC时钟初始化函数,时间设置函数,开机检测是否闹钟唤醒函数,配置开启低功耗模式函数
rtc.c文件
#include "rtc.h"
#define PWR_BackupAccessCmd_ENABLE() {RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE); PWR_BackupAccessCmd(ENABLE);}//开启备份区域写入权限 和 配置时钟
#define PWR_BackupAccessCmd_DISABLE() {PWR_BackupAccessCmd(DISABLE);} //关闭备份区域写入权限/* 写BKP寄存器 */
void PWR_BackupAccessCmd_WRITE(uint16_t BKP_DR, uint16_t DataA){ PWR_BackupAccessCmd_ENABLE();//开启备份区域写入权限 BKP_WriteBackupRegister(BKP_DR, DataA);PWR_BackupAccessCmd_DISABLE();//关闭备份区域写入权限
}
/* RTC时钟初始化函数 */
void RCC_Config(void){//时间配置函数
PWR_BackupAccessCmd_ENABLE(); //开启备份区域写入权限 if(BKP_ReadBackupRegister(ADDR_RTC) != RTC_ENABLE){ //检查用户标志/* 配置晶振 */RCC_LSEConfig(RCC_LSE_ON); /* 使能LSE */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {} /* 等待启动完成 */RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* 将 RTC时钟设置为LSE这个32.768KHZ的晶振*/ /* 同步数据 */RCC_RTCCLKCmd(ENABLE); /* 使能RTC Clock */ RTC_WaitForSynchro(); /* 等待同步 */ RTC_WaitForLastTask(); /* 等待对RTC寄存器最后的写操作完成*/ /* 配置分频 */RTC_SetPrescaler(32767); //设置了预分频值: 设置RTC时钟周期为1s *//* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)RTC_WaitForLastTask(); /* 配置标识 */ BKP_WriteBackupRegister(ADDR_RTC, RTC_ENABLE);}else{/* 同步数据 */RTC_WaitForSynchro(); /* 等待同步 */ RTC_WaitForLastTask(); /* 等待对RTC寄存器最后的写操作完成*/ }
PWR_BackupAccessCmd_DISABLE(); //关闭备份区域写入权限
}/* 时间设置函数 */
void RTC_Set(uint32_t time){if(BKP_ReadBackupRegister(ADDR_RTC) == RTC_ENABLE){ //检查用户标志
PWR_BackupAccessCmd_ENABLE(); //开启备份区域写入权限RTC_SetCounter(time); //设置RTC初始值RTC_WaitForLastTask();
PWR_BackupAccessCmd_DISABLE(); //关闭备份区域写入权限}
}/* 开机检测是否闹钟唤醒 */
void STD_RESET_START(void){if(BKP_ReadBackupRegister(ADDR_RTC) == RTC_ENABLE&&BKP_ReadBackupRegister(ADDR_STD) == RTC_ENABLE){u32 STD_time = (BKP_ReadBackupRegister(ADDR_STD_TIME1)<<16)+BKP_ReadBackupRegister(ADDR_STD_TIME2);//获取STD时间if(STD_time > (RTC_GetCounter()+5) && GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0){PWR_BackupAccessCmd_ENABLE(); //开启备份区域写入权限 /* 中断配置 */RTC_ITConfig(RTC_IT_ALR, ENABLE); RTC_WaitForLastTask(); /* 闹钟时间配置 */RTC_SetAlarm(STD_time); RTC_WaitForLastTask();
PWR_BackupAccessCmd_DISABLE(); //关闭备份区域写入权限 /* 进入低功耗 */ PWR_WakeUpPinCmd(ENABLE);RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //复位IO口时钟,可选择RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟PWR_EnterSTANDBYMode(); }PWR_BackupAccessCmd_WRITE(ADDR_STD,RTC_DISABLE); //配置关闭低功耗模式}
}/* 配置开启低功耗模式 */
void RTC_ALARM_Set(uint32_t time){ if(BKP_ReadBackupRegister(ADDR_RTC) == RTC_ENABLE){ //检查用户标志PWR_BackupAccessCmd_WRITE(ADDR_STD_TIME1,time>>16); //PWR_BackupAccessCmd_WRITE(ADDR_STD_TIME2,time&0x0000FFFF); //PWR_BackupAccessCmd_WRITE(ADDR_STD,RTC_ENABLE); //}
}
头文件rtc.h
#ifndef __RTC_H
#define __RTC_H
#include "stm32f10x.h"
#define RTC_ENABLE (0X5679)
#define RTC_DISABLE (0X3265)#define ADDR_RTC BKP_DR1
#define ADDR_UPDATE BKP_DR2
#define ADDR_STD BKP_DR3
#define ADDR_STD_TIME1 BKP_DR4
#define ADDR_STD_TIME2 BKP_DR5
/* *** */#define RTC_Get(x) RTC_GetCounter(x) //时间获取函数
void RTC_Set(uint32_t time); //时间设置函数
void RTC_ALARM_Set(uint32_t time); //闹钟设置函数void RCC_Config(void); //时间初始化函数
void STD_RESET_START(void); //低功耗模式检测函数/* BKP区域 */
void PWR_BackupAccessCmd_WRITE(uint16_t BKP_DR, uint16_t Data);
#endif
下面是测试用main函数
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "rtc.h"
int main(void)
{ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组2delay_init(); //延时函数初始化 uart_init(9600); //串口初始化为9600RCC_Config(); //时钟初始化函数;STD_RESET_START(); //判断是否是低功耗状态while(1){u32 sss = RTC_Get();printf("rtc = 0x%x\r\n",sss);RTC_ALARM_Set(sss+20);delay_ms(1000); };
}
配合weak_up引脚测试唤醒,可以有很好的效果
注意:在每次(PWR_BackupAccessCmd_DISABLE();//关闭备份区域写入权限)后
都需要重新开启时钟,在这里写成宏定义
( PWR_BackupAccessCmd_ENABLE() ;//开启备份区域写入权限 和 配置时钟)。
STM32 rtc唤醒 低功耗待机模式 避免iwdog看门狗方案相关推荐
- 芯片低功耗睡眠模式下与看门狗的使用
芯片睡眠模式下与看门狗的使用 方法1:在低功耗模式下进行RTC定时唤醒CPU进行喂狗操作之后在进入低功耗睡眠模式,因为在睡眠模式下是无法进行正常喂狗的,所以需要进行RTC定时唤醒进行喂狗操作,保证看门 ...
- STM32/AMP32F407进入低功耗待机模式后立马被唤醒的解决办法
最近项目用到低功耗,但是调试发现进入待机就被唤醒的问题,清除WU.SB两个唤醒标志位,也依然被立马唤醒一次. /* 进入待机模式 */HAL_PWR_EnterSTANDBYMode(); 通过极海的 ...
- 【STM32学习笔记】(14)——独立看门狗(IWDG)详解
独立看门狗(IWDG)概述 STM32F10xxx系列内置两个看门狗(独立看门狗和窗口看门狗),提供了更高的安全性.时间的精确性和使用的灵活性.两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决 ...
- [STM32F1]STM32 低功耗待机模式与RTC周期唤醒
STM32等类似Cortex-M3的MCU在系统或电源复位以后,MCU就会处于程序运行状态.当用户不需继续运行程序时,可以利用进入低功耗模式来节省电池电量,当需要重新运行时,可以通过特定条件进行唤醒程 ...
- stm32 cubemx RCT 闹钟 待机模式唤醒
工程文件: https://download.csdn.net/download/qq_44179528/19142503 https://download.csdn.net/download/qq_ ...
- STM32超低功耗入门之待机模式
一. 认识待机模式 进入待机模式之后,唤醒 MCU 后程序不是从进入低功耗模式之后的下一行代码开始执行,而是重新启动了. 通过上图可以得出结论: 待机模式有 2 种电压调节器方案 待机模式下 CPU ...
- STM32L4单片机配置STOP模式下停止看门狗计数
STM32L4系列的单片机,在stop模式或是standby模式下可以停止看门狗计数器,唤醒后,看门狗继续计数.这样,在单片机休眠期间,就可以不用喂狗,避免单片机频繁唤醒,可以节约更多能耗. 配置需要 ...
- STM32CubeMX学习笔记(17)——电源管理(PWR)低功耗待机模式
一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗.由用户根据应用选择具体的低功耗模式,以在低功耗.短启动时间和可用唤醒源之间寻求最佳平衡. 睡眠模 ...
- 【STM32学习笔记】(15)——窗口看门狗(WWDG)详解
窗口看门狗(WWDG)概述 窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障.除非递减计数器的值在T6位变成0前被刷新,否则看门狗电路在达到预置 ...
- STM32开发(11)----CubeMX配置独立看门狗(IWDG)
CubeMX配置独立看门狗(IWDG) 前言 一.独立看门狗的介绍 二.实验过程 1.STM32CubeMX配置独立看门狗 2.代码实现 3.硬件连接 4.实验结果 总结 前言 本章介绍使用STM32 ...
最新文章
- python教学视频下载-Python机器学习入门教程全套视频下载【传智播客】
- 解决人际矛盾的英语口语10条
- 3.6 Git 分支 - 分支的衍合
- 启明云端分享| SSD201 / SSD202D 在IP广播的应用
- 【Redis】新浪微博与微信Redis架构实战 - 笔记
- zookeeper注册中心安装(单机版)
- 如何查找求职简历模板及pdf编辑器去水印
- rpi4b引导ubuntu分析------distro_bootcmd
- 分享10个可免费使用的网站CDN加速服务
- 【转】腾讯云PCDN:从P2P到万物互联服务框架
- 两款清爽全能的下载神器,还不跟迅雷说拜拜?
- php中怎么设计出生日期,php – 将出生日期添加到数据库
- 接口测试用例怎么写? 模板示例 2021
- CSS奇思妙想 -- 使用 background 创造各种美妙的背景
- 【PAT乙级】1002 写出这个数——柳神代码解析
- dev c++下载和安装
- [春秋云镜]CVE-2020-19960,CVE-2020-19961
- 李宏毅课程-人类语言处理2-[视频]NLP任务总览(上)
- protobuf JsonStringToMessage 遇到bytes字段报错
- 五款苹果M1 Mac,如何选购哪款更适合你?