实时时钟(Real Time Clock,RTC),本质是一个计数器,计数频率常为秒,专门用来记录时间。
普通定时器无法掉电运行!但RTC可由VBAT备用电源供电,断电不断时
这里讲F1系列的RTC
可以产生三个中断信号,秒 闹钟 溢出信号
其中闹钟可以唤醒wwdg和iwdg
后备寄存器:
后备寄存器不仅有存数据的地方还有存状态,存配置rtc等后备外设的配置寄存器的存在,这些寄存器全部都复位不重置,所以可以在有备用电池的状态下做点文章
因为rcc内有状态位在不断电情况下可以知道上次复位是因为什么造成的
标准库还有用后备寄存器存数据的 temper引脚防破解 校准时钟输出等实验
,正点原子hal教学没有,得自己探索
你选时钟源的时候如果32.768khz坏了,也可以选择rc振荡器40khz和高速内部rc振荡器但不推荐,因为他俩很容易受外部影响
你可以获取分频器的分频计数值来更加精确的处理得出时间 
函数解析:
下面的函数是正点原子自己写的,专门用于处理时间戳的函数,你也可以自己用time.h跟标准库那时候一样
rtc.c
#include "./BSP/RTC/rtc.h"
#include "./BSP/LED/led.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
RTC_HandleTypeDef g_rtc_handle; /* RTC控制句柄 */
_calendar_obj calendar; /* 时间结构体 */
/**
* @brief RTC写入后备区域SRAM
* @param bkrx : 后备区寄存器编号,范围:0~41
对应 RTC_BKP_DR1~RTC_BKP_DR42
* @param data : 要写入的数据,16位长度
* @retval 无
*/
void rtc_write_bkr(uint32_t bkrx, uint16_t data)
{
HAL_PWR_EnableBkUpAccess(); /* 取消备份区写保护 */
HAL_RTCEx_BKUPWrite(&g_rtc_handle, bkrx + 1, data);
}
/**
* @brief RTC读取后备区域SRAM
* @param bkrx : 后备区寄存器编号,范围:0~41
对应 RTC_BKP_DR1~RTC_BKP_DR42
* @retval 读取到的值
*/
uint16_t rtc_read_bkr(uint32_t bkrx)
{
uint32_t temp = 0;
temp = HAL_RTCEx_BK