待机模式:唤醒后复位,从头开始执行主函数,所有时钟关闭,仅有RTC时钟开启
停止模式:除RTC时钟外,所有外设时钟关闭,但保存数据和运行到的位置(PC值),唤醒后需要等时钟同步
睡眠模式:外设时钟开启,CPU时钟关闭,保存数据和运行到的位置(PC值)

void RTC_Init(uint32_t count)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能BPK PWR时钟NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel =RTC_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);PWR_BackupAccessCmd(ENABLE); //系统复位后,会自动禁止访问后备寄存器和 RTC,以防止对后备区域(BKP)的意外写操作,使能 RTC 和后备寄存器以进行写入访问BKP_DeInit();//复位备份区域,(可选)//BKP_TamperPinCmd(DISABLE);RCC_LSICmd(ENABLE);while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);//检查指定的 RCC 标志位设置与否,等待低速晶振就绪RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //选择 LSE 作为 RTC 时钟  RCC_RTCCLKCmd(ENABLE); //使能 RTC 时钟RTC_WaitForLastTask(); //等待最近一次对 RTC 寄存器的写操作完成RTC_WaitForSynchro(); //等待 RTC 寄存器同步RTC_SetPrescaler(39999);//设置 RTC 时钟分频数 晶振32.768KHz RTC_WaitForLastTask(); //等待最近一次对 RTC 寄存器的写操作完成RTC_SetCounter(count);//最后在配置完成之后RTC_WaitForLastTask(); //等待最近一次对 RTC 寄存器的写操作完成RTC_ITConfig(RTC_IT_SEC,ENABLE); //使能 RTC 秒中断RTC_WaitForLastTask(); //等待最近一次对 RTC 寄存器的写操作完成RTC_ClearITPendingBit(RTC_IT_OW);RTC_ClearITPendingBit(RTC_IT_ALR);RTC_ClearITPendingBit(RTC_IT_SEC);}
void stanby_mode(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);PWR_ClearFlag(PWR_FLAG_WU);PWR_WakeUpPinCmd(ENABLE);RTC_ITConfig(RTC_IT_SEC, DISABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  GPIO_Init(GPIOA,&GPIO_InitStructure);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RTC_ClearFlag(RTC_FLAG_RSF);RTC_ClearFlag(RTC_FLAG_OW);RTC_ClearFlag(RTC_FLAG_ALR);RTC_ClearFlag(RTC_FLAG_SEC);PWR_EnterSTANDBYMode();
}void stop_mode(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);RTC_ITConfig(RTC_IT_SEC, DISABLE);     PWR_ClearFlag(PWR_FLAG_WU);PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);
}void sleep_mode(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);RTC_ITConfig(RTC_IT_SEC, DISABLE);         PWR_ClearFlag(PWR_FLAG_WU);__WFI(); //或__WFE
}
void EXTI0_Configuration(void)
{EXTI_InitTypeDef EXTI0_InitStruct;EXTI0_InitStruct.EXTI_Line = EXTI_Line0;             //选择哪一条外部中断线,可以选择EXTI_Line0~EXTI_Line19,其中EXTI_Line0~EXTI_Line15为IO口中断EXTI0_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;       //选择模式,可选择中断模式或事件模式EXTI0_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;    //选择跳变沿触发,可选择上升沿触发或下降沿触发,也可选择上升沿和下降沿共同触发EXTI0_InitStruct.EXTI_LineCmd = ENABLE;     //使能或使能EXTI_Init(&EXTI0_InitStruct);NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel =EXTI0_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);EXTI_ClearITPendingBit(EXTI_Line0);
}

RTC库函数

void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);
//RTC中断配置
/*可选中断
@arg RTC_IT_OW: Overflow interrupt  32位计时器溢出中断
@arg RTC_IT_ALR: Alarm interrupt    警告中断,超过警报值触发中断
@arg RTC_IT_SEC: Second interrupt   秒中断
*/void RTC_EnterConfigMode(void);
//进入RTC配置模式void RTC_ExitConfigMode(void);
//退出RTC配置模式uint32_t RTC_GetCounter(void);
//获取计数值,复位后必须先调用void RTC_WaitForSynchro(void)
//等待直到RTC寄存器(RTC_CNT、RTC_ALR和RTC_PRL)与RTC APB时钟同步,否则容易导致数据损坏
void RTC_WaitForSynchro(void);//等待RTC寄存器与RTC的APB时钟同步void RTC_SetCounter(uint32_t CounterValue); //设置初始计数值
void RTC_SetPrescaler(uint32_t PrescalerValue); //设置时钟分频
//调用以上两个函数前需要先调用void RTC_WaitForLastTask(void)
//以上两个函数包含了void RTC_EnterConfigMode(void);和void RTC_ExitConfigMode(void);
void RTC_WaitForLastTask(void);//等待RTC寄存器的最后一次写操作完成void RTC_SetAlarm(uint32_t AlarmValue);//设置报警值uint32_t RTC_GetDivider(void);//获取分频值FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);//获取标志状态值
void RTC_ClearFlag(uint16_t RTC_FLAG);          //清零标志位
/*
@arg RTC_FLAG_RTOFF: RTC Operation OFF flag     RTC操作关闭标志
@arg RTC_FLAG_RSF: Registers Synchronized flag  寄存器同步标志
@arg RTC_FLAG_OW: Overflow flag                 溢出标志
@arg RTC_FLAG_ALR: Alarm flag                   警报标志
@arg RTC_FLAG_SEC: Second flag                  秒标志
*/ITStatus RTC_GetITStatus(uint16_t RTC_IT); //获取中断状态
void RTC_ClearITPendingBit(uint16_t RTC_IT);//清零中断标志位
/**     @arg RTC_IT_OW: Overflow interrupt      溢出中断*     @arg RTC_IT_ALR: Alarm interrupt        警报中断*     @arg RTC_IT_SEC: Second interrupt       秒中断
*/

BKP库函数

void BKP_DeInit(void);//将BKP外设寄存器初始化为默认复位值void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel);//配置防篡改引脚的有效电平void BKP_TamperPinCmd(FunctionalState NewState);//使能或失能防篡改引脚void BKP_ITConfig(FunctionalState NewState);//使能或失能BKP中断void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource);//选择要在防篡改引脚上输出的RTC输出源
/**     @arg BKP_RTCOutputSource_None: 无RTC输出在防篡改引脚*     @arg BKP_RTCOutputSource_CalibClock: RTC输出64分频的频率在防篡改引脚*     @arg BKP_RTCOutputSource_Alarm: 输出报警脉冲信号在防篡改引脚*     @arg BKP_RTCOutputSource_Second: 输出秒脉冲信号在防篡改引脚
*/void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue);
//设置RTC时钟校准值,该值必须在0x00~0x7F之间void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);
//写后备寄存器,可选BKP_DR1~BKP_DR42uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);//读后备寄存器FlagStatus BKP_GetFlagStatus(void);//获取篡改引脚事件标志,设置了就返回1void BKP_ClearFlag(void);//清除篡改引脚时间标志ITStatus BKP_GetITStatus(void);//获取BKP中断状态void BKP_ClearITPendingBit(void);//清除中断标志位

PWR库函数

void PWR_DeInit(void);//将PWR外设寄存器初始化为默认复位值void PWR_BackupAccessCmd(FunctionalState NewState);//使能或失能对RTC和备份寄存器的访问void PWR_PVDCmd(FunctionalState NewState);//使能或失能电源电压检测器void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel);//配置电源电压检测器(PVD)检测到的电压阈值void PWR_WakeUpPinCmd(FunctionalState NewState);//使能或失能唤醒引脚功能void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry);//进入停止模式void PWR_EnterSTANDBYMode(void);//进入待命模式FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG);//获取标志位状态
/*@arg PWR_FLAG_WU: Wake Up flag  唤醒标志@arg PWR_FLAG_SB: StandBy flag  待命标志@arg PWR_FLAG_PVDO: PVD Output  电源电压检测器(PVD)输出标志
*/void PWR_ClearFlag(uint32_t PWR_FLAG);//清除标志

EXTI库函数

void EXTI_DeInit(void);//将EXTI外设寄存器初始化为默认值void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);//EXTI初始化void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);//指定初始化void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);//产生软件中断
/*
这个值可以为EXTI_Line0~EXTI_Line19
其中EXTI_Line16连接到PVD输出EXTI_Line17连接到RTC警报事件EXTI_Line18连接到USB设备/USB OTG 文件系统EXTI_Line19连接到以太网唤醒事件
*/FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
void EXTI_ClearFlag(uint32_t EXTI_Line);
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

STM32使用RTC+BKP+PWR+EXTI相关推荐

  1. STM32之RTC实时时钟

    RTC实时时钟简介: STM32的RTC外设,实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断).但是从掉电还能继续运 ...

  2. Stm32之RTC时钟(2021-07-26)

    Stm32之RTC时钟 1.时钟框图: 先将之前没做笔记的时候的时间框架图补上: 同样源自正点原子的PPT,图中红框的部分为RTC的时钟源,有三种: HSE的128分频: LSI(大概40kHz) L ...

  3. 【STM32】RTC的初始化与基本使用(CT117E电路)

    目录 RTC的初始化与基本使用 RTC的初始化 RTC的基本使用 参考文献 RTC的初始化与基本使用 STM32 的实时时钟(RTC)是一个独立的定时器.STM32 的 RTC 模块拥有一组连续计数 ...

  4. 关于STM32使用RTC时复位后程序死在 RTC

    在软件仿真时如果不需要配置,则程序会死在 RTC_WaitForSynchro() 函数中.而下载到硬件上时,有时候可以跑,有时候也会在该函数中死循环. 可能的原因: 首先,一定要确认是否使能了对后备 ...

  5. STM32开发 -- RTC详解

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/81409693 RTC实时时钟部分,之前也是有讲到过的. Hi3516A开发– ...

  6. STM32读取RTC时钟

    STM32读取RTC时钟 一.RTC 1. 简介 2. 特征 3. 组成 二.项目创建 三.代码修改 四.总结 参考 一.RTC 1. 简介 RTC-real time clock,实时时钟,主要包含 ...

  7. STM32:RTC实时时钟原理

    RTC (Real Time Clock):实时时钟 RTC是个独立的BCD定时器/计数器.RTC 提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志.RTC还包含用于管 ...

  8. STM32的RTC闹钟中断 总算整明白了

    转载:http://www.openedv.com/posts/list/22055.htm STM32的RTC闹钟中断 总算整明白了 现在用到了STM32的闹钟中断 去唤醒停机模式下的系统 看STM ...

  9. STM32 HAL RTC配置及优化

    STM32 HAL RTC配置及优化 STM32内部的RTC实时时钟模块,可以配置实现日历和时间的运转,并在外部备用电池的辅助下,可以在主电源关闭的情况下保持运行,且RTC备份寄存器也可以在电池供电状 ...

最新文章

  1. php函数在哪个文件夹下,php删除文件夹及其文件夹下所有文件的函数代码
  2. Python filter() 函数
  3. Notepad++ 搜索功能学习总结
  4. 应用DOM操作文档的一个实用例子
  5. 推荐一个实用的 .gitignore 文件
  6. dumpbin发现没有入口函数_JavaScript基础之入口函数-2020版
  7. 分布式事务解决方案 Seata 的原理个人理解以及 demo 配置
  8. 各厂家服务器存储默认登录信息
  9. MT6763/P23处理器资料介绍
  10. mib节点 snmp trap_(转)浅谈 Linux 系统中的 SNMP Trap
  11. 原生拨号盘设置电信卡呼叫转移概率失败
  12. Oracle PLM,协同研发的产品生命周期管理平台
  13. 向下舍入是什么意思_舍入是什么意思
  14. 2018的趋势与展望(下)——记罗振宇“时间的朋友2017”跨年演讲
  15. 什么是hadoop?
  16. 运动目标检测(背景建模)
  17. 牛客:爬塔(STL)
  18. 新鲜事儿!只有AI作品的电影节;酷~AI纹身设计师;ChatGPT的接生婆RLHF;Wayve自动驾驶模型MILE… | ShowMeAI资讯日报
  19. 传说之下打开debug模式超超超超超超超超详细方法
  20. 电脑睡眠后启动 耳机没有声音 手动启动 -已解决

热门文章

  1. JavaScript 中的内存和性能、模拟事件(读书笔记思维导图)
  2. 可视化拖拽组件库一些技术要点原理分析(三)
  3. 【Visual C++】游戏开发笔记之九 游戏地图制作(一)平面地图贴图
  4. python下载哪一个安装包_python中正确安装对应版本的包
  5. 2.2.1 hadoop体系之离线计算-mapreduce分布式计算-mapreduce架构概念
  6. Vue3中如何进行页面局部刷新,组件刷新
  7. Linux系统和程序中的DEP和ASLR保护机制
  8. Window10 WiFi列表不显示解决方案
  9. 安卓3dtouch测试软件,不必羡慕iPhone!安卓手机可以这样实现“3D Touch”
  10. 在unik中,写一个Go HTTP服务器