RTC(Real Time Clock)实时时钟,是一个独立的定时器,为系统提供时钟和日历。RTC和时钟配置系统是属于后备区域的,跟BKP寄存器一样,复位不清零,VDD断电由VBAT供电,若两者都没有,数据将会丢失。
下面看一个图
这是32时钟树截取下来的一部分,从图中可以看到RTCCLK(RTC Clock) 有三个来源,分别为
1、HSE(Hight Speed External)高速外部时钟,经过128分频提供给RTC当作时钟,而HSE的输入是4-16MHZ的OSC(Oscillator[振荡器])。
2、LSE(Low Speed External)低速外部时钟,LSE的输入是32.768kHZ的OSC,那么为什么是32.768k,那是因为2^15=32768,分频的话将会更加简便,被广泛应用。
3、LSI(Low Speed Internal)低速内部时钟,固定为40KHZ。
HSE、LSI只是RTC的备选方案,HSE是专门用来提供32的系统时钟的,而LSI则是专门给IWDG(Independent Watch Dog)提供时钟的,剩下的LSE就是专门给RTC提供时钟的。
好了,讲完了RTC的三个时钟来源,现在讲讲RTC的内部结构图,还是看图说话
灰色部分是后备区域,VDD断开,VBAT会接着供电。剩下的就是正常的断电停止工作的区域了。
首先来看看图中的第①部分,RTC是挂载在APB1(Advance Peripheral Bus 1[高级外设总线1])上的,PCLK1就是外设时钟1,是36MHZ的,速度很快。
第二部分是后备区域,先了解一下这里面的寄存器,RTC_PRL(RTC_Prescaler)预分频器,RTC_DIV(RTC_Divider)分频器,DIV是一个递减的寄存器,RTCCLK给DIV提供时钟,每一个上升沿,DIV就会减一,当递减到0时,会输出一个脉冲且预分频器的值会重装载到DIV里,让他再次递减,以此循环。
举个例子,RTCCLK为32.768KHZ,我们想要让他输出1HZ,就要将PRL设置成32768-1,让DIV从32768-1开始计数,RTCCLK每来一个上升沿就减一,那么32768个脉冲DIV才会递减到0,到了这DIV才输出了一个脉冲。如果要实现2分频要怎么搞?直接设置PRL为2-1,让DIV从2-1开始递减,要让DIV输出一个脉冲只需RTCCLK给DIV两个脉冲即可,这就实现了二分频。
继续来看,分频后的时钟提供给了RTC_CNT(RTC_Count),是一个32位的可编程的计数器,没错,这就是时间戳,这里所说的32位是无符号的32位,最大是2^32-1,到了2106年才会溢出,而想要一秒计数一次只需要给他一个1HZ的时钟即可,也就是将PRL设置成32768-1。而RTC_ALR(RTC_Alarm)是用来设置闹钟的,设置一个值,当CNT的值与ARL的值相等时将会产生一个信号给中断,执行你想要做的事情。
第三部分,我们可以看到这是RTC_CR(控制寄存器),里面最后一个字母是F的就是Flag标志位,E就是用来使能,然后我们看标志位的来源
1、RTC_Second,每秒来一个信号
2、RTC_Overflow,寄存器溢出信号
3、RTC_Alarm,闹钟信号
然后这几个信号流向了第四部分的NVIC,流向NVIC的还有WKUP(Wake up),唤醒单片机让它退出待机模式且进入中断。
到了这里,算是简单了解了RTC了。