一、RTC工作原理框图
二、RTC时钟源
三、 RTC相关寄存器
- RTC控制寄存器 (RTC_CRH, RTC_CRL)
- RTC预分频装载寄存器 (RTC_PRLH, RTC_PRLL)
- RTC预分频余数寄存器 (RTC_DIVH, RTC_DIVL)
- RTC计数器寄存器 (RTC_CNTH, RTC_CNTL)
- RTC闹钟寄存器 (RTC_ALRH ,RTC_ALRL)
必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器。
另外,对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是’1’时,才可以写入RTC寄存器。
配置过程:
- 查询RTOFF位,直到RTOFF的值变为’1’
- 置CNF值为1,进入配置模式
- 对一个或多个RTC寄存器进行写操作
- 清除CNF标志位,退出配置模式
- 查询RTOFF,直至RTOFF位变为’1’以确认写操作已经完成。
仅当CNF标志位被清除时,写操作才能进行,这个过程至少需要3个RTCCLK周期。
三、 RTC相关库函数讲解
1.RTC时钟源和时钟操作函数:
- void RCC_RTCCLKConfig(uint32_t CLKSource);//时钟源选择
- void RCC_RTCCLKCmd(FunctionalState NewState)//时钟使能
2.RTC配置函数(预分频,计数值):
- oid RTC_SetPrescaler(uint32_t PrescalerValue);//预分频配置:PRLH/PRLL
- void RTC_SetCounter(uint32_t CounterValue);//设置计数器值:CNTH/CNTL
- void RTC_SetAlarm(uint32_t AlarmValue);//闹钟设置:ALRH/ALRL
3.RTC中断设置函数:
- void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);//CRH
- RTC允许配置和退出配置函数:
- void RTC_EnterConfigMode(void);//允许RTC配置 :CRL位 CNF
- void RTC_ExitConfigMode(void);//退出配置模式:CRL位 CNF
4.同步函数:
- void RTC_WaitForLastTask(void);//等待上次操作完成:CRL位RTOFF
- void RTC_WaitForSynchro(void);//等待时钟同步:CRL位RSF
5.相关状态位获取清除函数:
- FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);
- void RTC_ClearFlag(uint16_t RTC_FLAG);
- ITStatus RTC_GetITStatus(uint16_t RTC_IT);
- void RTC_ClearITPendingBit(uint16_t RTC_IT);
6.其他相关函数(BKP等)
- PWR_BackupAccessCmd();//BKP后备区域访问使能
- RCC_APB1PeriphClockCmd();//使能PWR和BKP时钟
- RCC_LSEConfig();//开启LSE,RTC选择LSE作为时钟源
- PWR_BackupAccessCmd();//BKP后备区域访问使能
- uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);//读BKP寄存器
- void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);//写BKP
四、 RTC配置一般步骤
- 使能PWR和BKP时钟:RCC_APB1PeriphClockCmd(); ② 使能后备寄存器访问: PWR_BackupAccessCmd();
- 配置RTC时钟源,使能RTC时钟: RCC_RTCCLKConfig(); RCC_RTCCLKCmd(); 如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON);
- 设置RTC预分频系数:RTC_SetPrescaler();
- 设置时间:RTC_SetCounter();
- 开启相关中断(如果需要):RTC_ITConfig();
- 编写中断服务函数:RTC_IRQHandler();
- 部分操作要等待写操作完成和同步。 RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成 RTC_WaitForSynchro(); //等待RTC寄存器同步