概述
- RTC(Real Time Clock)是实时时钟
- BKP区域由备份电源供电,所以实时时钟可以使用这一区域保证当断电的时候时钟不会中断
- 以下代码只需要看初始化代码和RTC设置代码的最后几行
- 注意有些操作需要先完成才能进行下一操作(这也是为什么会有等待写操作完成和同步)
- 对RTC和后备寄存器的访问需要先使能一些寄存器
日历结构体
typedef struct
{
vu8 hour;
vu8 min;
vu8 sec;
vu16 w_year;
vu8 w_month;
vu8 w_date;
vu8 week;
}_calendar_obj;
RTC初始化函数
- 判断CR寄存器的RSF位,确定寄存器是否同步,同步后才可以修改CR寄存器
- 配置CNF位1进入配置模式,0退出配置模式,之后才可以修改CNT,ALR,PRL
- 检查CNF的RTOFF位,判断上一次操作是否结束,才可以对RTC进行下一次操作
- 读取备份寄存器的时候
BKP_ReadBackupRegister(BKP_DR1) != 0x5050
是不是DR1无所谓,是不是5050也无所谓
u8 RTC_Init(void)
{
u8 temp=0;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050)
{
BKP_DeInit();
RCC_LSEConfig(RCC_LSE_ON);
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
{
temp++;
delay_ms(10);
}
if(temp>=250)return 1;
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForLastTask();
RTC_WaitForSynchro();
RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForLastTask();
RTC_EnterConfigMode();
RTC_SetPrescaler(32767);
RTC_WaitForLastTask();
RTC_Set(2022,1,1<