1. STM32的RTC寄存器介绍
1.1 控制寄存器 RTC_CR
1.1.1 RTC_CRH高位:启用或禁用指定的RTC中断
RTC_ITConfig(parameter, ENABLE); parameter可以是 RTC_IT_OW 溢出中断; RTC_IT_ALR 闹钟中断;RTC_IT_SEC 秒中断。
1.1.2 RTC_CRL低位:
RTOFF状态位 :对RTC任何寄存器的写操作前 判断RTC寄存器是否处于更新中,仅当RTOFF状态位是’1’ 时,才可以写入RTC寄存器;函数:RTC_WaitForLastTask() 可判断;
CNF 配置标志位:必须由软件置’1’以进入配置模式,从而允许向RTC_CNT、RTC_ALR或RTC_PRL寄存器 写入数据;
0:退出配置模式(开始更新RTC寄存器);函数 RTC_ExitConfigMode()
1:进入配置模式; 函数 RTC_ExitConfigMode()
就比如要给RTC_PLR预分频器写入预分频值
void RTC_SetPrescaler(uint32_t PrescalerValue)
{
/* Check the parameters */
assert_param(IS_RTC_PRESCALER(PrescalerValue));
RTC_EnterConfigMode(); // 进入配置模式
/* Set RTC PRESCALER MSB word */
RTC->PRLH = (PrescalerValue & PRLH_MSB_MASK) >> 16;
/* Set RTC PRESCALER LSB word */
RTC->PRLL = (PrescalerValue & RTC_LSB_MASK);
RTC_ExitConfigMode(); // 退出配置模式
}
RSF 寄存器同步标志位:要进行任何的读操作之前,用户程序必须等待 这位被硬件置’1’,以确保RTC_CNT、RTC_ALR或RTC_PRL已经被同步; 函数 RTC_WaitForSynchro() 可判断;
OWF溢出标志位、ALRF闹钟标志位、SECF秒标志位,标志位置位时都是硬件置1,但是需要软件清0,并且写’1’是无效的。函数 RTC_ClearFlag() 或者RTC_ClearITPendingBit() 。
1.2 预分频装载寄存器 RTC_PRL
LSE时钟:LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器
LSI时钟:LSI时钟频率大约40kHz(在30kHz和60kHz之间)
如果要产生TR_CLK为1s的信号,使用LSE时钟时,RTC_PRL预分频器写入32767,RTC_SetPrescaler(32767),使用LSI时钟,RTC_PRL写入39999,RTC_SetPrescaler(39999)。(使用LSE外部时钟可使用BKP备用寄存器,掉电下依旧能走时,而使用LSI内部时钟时掉电的情况下不能走时)
1.3 预分频器余数寄存器 RTC_DIV
用户可通过读取RTC_DIV寄存器,以获得预分频计数器的当前值,而不停止分频计数器的工作,从而获得精确的时间测量。(可用该值将秒细分到毫秒等更精确的时间)RTC_GetDivider()
1.4 计数器寄存器 RTC_CNT
计数器以预分频器产生的 TR_CLK时间基准为参考进行计数,RTC_CNT寄存器用来存放计数器的计数值,RTC_SetCounter() 设置RTC_CNT的值。
1.5 闹钟寄存器 RTC_ALR
当可编程计数器的值(RTC_CNT)与RTC_ALR中的32位值相等时,即触发一个闹钟事件,并且产生RTC闹钟 中断。RTC_SetAlarm() 设置RTC_ALR的值。
RTC框图: