【自学嵌入式:stm32单片机】RTC实时时钟
RTC实时时钟
RTC实时时钟简介
- RTC(Real Time Clock)实时时钟
- RTC是一个独立的定时器,可为系统提供时钟和日历的功能
- RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0~3.6V)断电后可借助VBAT(1.8~3.6V)供电继续走时
- 32位的可编程计数器,可对应Unix时间戳的秒计数器
- 20位的可编程预分频器,可适配不同频率的输入时钟
- 可选择三种RTC时钟源:
- 
HSE时钟除以128(通常为8MHz/128) 
 ![image]() 
- 
LSE振荡器时钟(通常为32.768KHz)(只有这一路可以通过VBAT供电,上下两路时钟在主电源断电后停止运行) 
 ![image]() 
- 
LSI振荡器时钟(40KHz) 
 ![image]() 
 
- 
stm32内部就实现了之前51的DS1302的实时时钟功能
RTC框图

RTC_CNT是Unix时间戳的秒计数器,每次读取读写时间要用软件转换,RTCCLK通过分频得到1HZ的信号让RTC_CNT每秒自增

最下面是PWR相关联的部分,RTC闹钟可以换新设备,退出待机模式
寄存器相关
灰色填充部分都属于后备区域,这些电路在主电源掉电后,可以使用备用电池维持工作,这些模块在待机时都会继续维持供电,其他不是灰色填充的部分待机时不供电
RTC_PRL是重装载寄存器(写入6是7分频,写入9就是10分频,和下标从0开始差不多),RTC_DIV是余数寄存器,这一块和时基单元里的计数器CNT和重装值ARR是一样的作用

RTC_DIV是一个自减寄存器,每来一个输入时钟,DIV的值自减一次,自减到0时,再来一个输入时钟,DIV输出一个脉冲,产生溢出信号,同时DIN从PRL获取重装值,回到重装值继续自减
32位可编程计数器RTCCNT,就是计时最核心的部分,我们可以把这个计数器看作是Unix时间戳的秒计数器,这样借用time.h的函数,就可以很方便地得到年月日时分秒了

这个RTC还设计的有一个闹钟寄存器RTC_ALR,这个ALR也是一个32位的寄存器,和上面这个CNT是等宽的,它的作用,顾名思义,就是设置闹钟,我们可以在ALR写一个秒数,设定闹钟,当CNT的值跟ALR设定的闹钟值一样时,也就是这里画的等号,如果它俩值相等,就代表闹钟响了,这时就会产生RTC Alarm闹钟信号,通往右边的中断系统,在中断函数中可以设定执行相应的操作

同时,这个闹钟兼具一个功能,就是下面这里,闹钟信号可以让STM32退出待机模式
中断相关

在左边这里有三个信号可以产生中断:
- RTC_Second,秒中断,它的来源,就是CNT的输入时钟,如果开启这个中断,那么程序就会每秒进一次RTC中断
- RTC_Overflow,溢出中断,它的来源是CNT的右侧,意思就是CNT的32位计数器计满溢出了,会触发中断,这个中断一般不会触发,这个CNT定义是无符号数,到2106年才会溢出,如果到2106年,可以让芯片提示设备过旧等等
- RTC_Alarm,闹钟中断,当计数器和闹钟值相等时,触发中断, 同时,闹钟信号可以把设备从待机模式唤醒
 ![image]() 
右侧这一块是中断标志位和中断输出控制,这些F(Flag)结尾的是对应的中断标志位,IE(Interrupt Enable)结尾的是中断使能,最后3个信号通过一个或门,汇聚到NVIC中断控制器
APB1总线相关

APB1总线和APB1接口就是程序读写寄存器的地方,读写寄存器,可以通过APB1总线来完成,另外也可以看出,RTC是APB1总线上的设备
退出待机模式

WKUP引脚,闹钟信号,和WKUP(Weak Up)引脚,都可以唤醒设备

如上图,是WKUP引脚的复用关系(PA0)
RTC基本结构

硬件电路

在最小系统电路上,外部电路要加两部分,一个是备用供电电池,一个是外部低速晶振

RTC操作注意事项
- 执行以下操作将使能对BKP和RTC的访问:
- 设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟
- 设置PWR_CR的DBP,使能对BKP和RTC的访问
 
- 若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1(为了让RTC和APB1总线的时钟进行一个同步,个人理解)
- 必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器
- 对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器
RTC秒、闹钟和溢出时序图

第一行是PR,里面的值正在自减,重装值是时钟不变的,所以这个自减应该是余数寄存器DIV,当它计到0之后,下一个值变为重装值,同时触发一个秒脉冲,每个秒脉冲,下面的CNT计数器自增一次,可以看到,这个CNT自增的时刻是秒脉冲的下降沿,所以CNT自增,相比较分频器重装的时机,是慢了一个RTCCLK时钟的,之后CNT一直自增,直到CNT为4,这时CNT等于闹钟值

如上图,闹钟信号的触发时机是这个时刻(蓝色直线), 就是CNT=4期间的最末尾,和这个秒信号的上升沿是一起的,然后最后一个是闹钟标志位也会在此时刻置1挂起,如下图蓝框所示:

如果开启了闹钟中断,程序就会进入中断函数, 在中断函数里,由软件清除这个闹钟标志位,下面是溢出时序图:

在CNT计满后在下图蓝框里的红线这个时刻产生Overflow溢出信号:

最后溢出标志位置1,如果开启了溢出中断,就进入中断函数。
手册中有关寄存器的内容
RTC控制寄存器


32位寄存器被拆分为两个16位寄存器是为了简化电路设计,对于这些不是这么重要的外设,就没有必要上32位总线了
RTC预分频器重装载寄存器

RTC预分频器余数寄存器

RTC计数器寄存器


RTC闹钟寄存器


 
                     
                    
                 
                    
                



 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号