【STM32】BKP备份寄存器&RTC实时时钟&PWR电源控制
文章目录
BKP备份寄存器
对应 STM32F10xxx参考手册 中的第五章
BKP简介
BKP(Backup Registers)备份寄存器
BKP处于后备区域,可用于存储用户应用程序数据,当VDD(2.03.6V)电源被切断,他们仍然由VBAT(板子上的纽扣电池,1.83.6V)维持供电,当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位
TAMPER引脚产生的侵入事件将所有备份寄存器内容清除
BKP内保存的数据可以被毁灭(如果有人希望恶意得到这些数据的话,令其丢失比保护数据更重要),TAMPER机制就可以实现备份寄存器内容清除,中文译为“侵入检测”,这需要占用一个外部引脚(PC13)
如果不用侵入检测功能,那么这个外部引脚可以用作RTC引脚,用于输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲
BKP中用户数据存储容量: 20字节(中容量和小容量)/ 84字节(大容量和互联型)
BKP的基本结构
BKP库函数
void BKP_DeInit(void);
// //恢复缺省配置手动清空BKP所有的数据寄存器
void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel);
//配置tamper引脚的有效电平是高电平触发还是低电平触发
void BKP_TamperPinCmd(FunctionalState NewState);
//是否需要开启侵入检测功能
void BKP_ITConfig(FunctionalState NewState);
//是否开启中断
void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource);
//时钟输出功能的配置,可以选择在RTC引脚上输出时钟信号,输出RTC校准时钟,RTC闹钟脉冲或者秒脉冲
void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue);
//设置RTC校准值,就是写入RTC校准寄存器
⭐ void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);
//写备份寄存器,第一个参数指定要写入那个寄存器,第二个参数就是要写入的数据
⭐ uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);
//读取指定的备用数据寄存器的值,备用寄存器通常用于保存一些需要在设备断电后保持的持久数据(如日期、时间等),这些数据在断电重启后仍然有效
FlagStatus BKP_GetFlagStatus(void);
//检查与备用寄存器相关的标志位状态,通常是一个指示某种事件(如备用寄存器值的变化)的标志
//返回值为 SET(表示标志被设置,可能指示某个事件或条件已经发生)或者 RESET(表示标志未被设置,条件未发生)
void BKP_ClearFlag(void);
//清除备用寄存器相关的标志位。通常在某个事件发生后,用户需要清除标志位,以便下一次事件能够正常检测到
ITStatus BKP_GetITStatus(void);
//获取备用寄存器的中断状态,判断是否有中断事件发生
void BKP_ClearITPendingBit(void);
//清除备用寄存器相关的中断挂起标志。这通常用于处理中断事件,在中断处理完成后清除挂起的标志,防止中断再次触发
RTC实时时钟
RTC简介
RTC框图
【分析】
- HSE时钟除以128(通常为8MHz/128)
- LSE振荡器时钟(通常为32.768KHz)
- LSI振荡器时钟(40KHz)
RTC基本结构
RTC操作注意事项
RTC库函数
void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);
/** 配置 RTC 中断的启用或禁用
参数说明:
RTC_IT:指定要配置的 RTC 中断类型
NewState:指定中断的启用状态,可以是 ENABLE 或 DISABLE
*/
void RTC_EnterConfigMode(void);
/** 进入 RTC 配置模式
说明:RTC 在进行一些配置更改时,需要进入配置模式。进入配置模式后,RTC 的时钟源、分频器、计数器等参数可以被修改
注意:进入配置模式时,RTC 会停止计时,因此需要确保在修改配置前不影响正在进行的时间计数
*/
void RTC_ExitConfigMode(void);
//退出 RTC 配置模式
uint32_t RTC_GetCounter(void);
//获取 RTC 的当前计数器值(即当前的时间戳)
void RTC_SetCounter(uint32_t CounterValue);
//设置 RTC 计数器的值(即设置当前时间戳)
void RTC_SetPrescaler(uint32_t PrescalerValue);
//设置 RTC 的预分频器值
void RTC_SetAlarm(uint32_t AlarmValue);
//设置 RTC 的闹钟值(即触发报警闹钟的时间)
uint32_t RTC_GetDivider(void);
//获取 RTC 的分频器的当前设置值
void RTC_WaitForLastTask(void);
//等待 RTC 的最后一项任务完成
void RTC_WaitForSynchro(void);
//等待 RTC 时钟同步
FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);
//获取 RTC 的标志状态
void RTC_ClearFlag(uint16_t RTC_FLAG);
//清除 RTC 的指定标志
ITStatus RTC_GetITStatus(uint16_t RTC_IT);
//获取 RTC 中断状态
void RTC_ClearITPendingBit(uint16_t RTC_IT);
//清除 RTC 中断挂起标志
PWR电源控制
PWR简介
STM32内部供电方案
低功耗模式
模式选择
执行 WFI(Wait For Interrupt)或者 WFE(Wait For Event)指令后,STM32进入低功耗模式
睡眠模式
执行完 WFI/WFE 指令后,STM32 进入睡眠模式,程序暂停运行,唤醒后程序从暂停的地方继续运行
SLEEPONEXIT 位决定 STM32 执行完 WFI 或 WFE 后,是立刻进入睡眠,还是等 STM32 从最低优先级的中断处理程序中退出时进入睡眠
在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态
WFI指令进入睡眠模式,可被任意一个NVIC响应的中断唤醒
WFE指令进入睡眠模式,可被唤醒事件唤醒
停机模式
待机模式
STM32 专栏文章均参考 《STM32入门教程-2023版 细致讲解 中文字幕》教程视频
作者:YuCaiH