嵌入式开发学习日志34——stm32之RTC实时时钟系统
虽然本章重点在RTC,但在正式开始介绍RTC前,让我们先把目光看向时间转换的概念。
Unix时间戳,从1970一月一日开始加算的总秒数,存储在秒计时器中,由于世界各地区只需要通过增加适量的偏移便可得到当地时间,所以受到广泛应用。
时间戳总共有两种规格,一种是GMT(格林尼治时间),这是以地球自转为基础设计的时钟计量系统,但是由于地球自转越来越快,所以用这种规格计算的时间会有所偏差;另一种是UTC(协调世界钟),这是以原子钟为基础设计出的时钟计量系统,当它计算的时间与地球自转时间相差超过0.9秒时,就会自动加入闰秒来进行修正,更加精确一些。
在C语言库中,也为我们提供了可以用时间戳进行时间转换的函数,下面就举几个最典型的。
函数time_t time(time_t*),用于获取系统时钟;函数struct tm* gmtime(const time_t*),用于将秒计数器转换为格林尼治时间;函数struct tm* localtime(const tim_t*),用于将秒计数器转换为本地时间。
了解完时间转换后,让我们正式步入RTC实时时钟系统。
所谓RTC实时时钟其实是个独立的定时器,在一定配置下,操作者可以通过改变RTC模块中的一连串计数器的数值来重新设置系统时间。
为什么要用这个模块来计算存储时间呢?
实际上,这正是因为RTC模块存储的数据十分保险,很难丢失。
RTC模块中,有一个寄存器叫做BKP备份寄存器,这就是用于存储用户数据的部分。BKP有一个极其重要的特点,它可以由两个电源进行供电,当外部提供的VDD被切断,BKP仍然可以使用后背电源VBAT继续供电,只有当两个电源都被切断时,BKP才会结束工作。
除此之外,BKP寄存器的TAMPER引脚还可以检测外部侵入事件,一旦有人试图从外部窃取BKP中的数据,那么BKP就会自动将数据清除,并且产生中断。
不过由于是在单片机上的应用,所以BKP能存储的数据量并不大,小一点的20字节,大一点的84字节。
RTC的时钟配置都存放于后备区域中,而数据也正是存储在RTC模块的备份域,结合BKP,RTC模块就可以做到安全有效地存储用户数据。
RTC作为独立定时器,并没有先前介绍的通用定时器有那么多计数方式,它只能向上计数,而且由于有两种电源,所以为了保证VDD被切断后定时器仍然能够正常运转,RTC的时钟来源外部低速时钟LSE(32.768khz)
下面是RTC模块的配置步骤:
(1)使能电源时钟以及后备域(BKP)时钟,开启RTC后备寄存器的写访问
(2)复位备份区域(由于每次复位都会导致先前的数据被清除,所以是否复位视情况而定),开启外部低速时钟。
(3)选择并使能RTC时钟。
(4)配置RTC分频,设置秒中断以及时间。
(5)设置RTC中断分组。
(6)编写中断服务函数。