一、前言
实时时钟RTC在嵌入式系统中是常用的功能,有的单片机有RTC功能,也有专用的RTC芯片,如DS1302、DS1307等。但RTC的“年寄存器”长度有限,一般不会包含所有年份,都是从0开始,到某个数字结束。这个开始的年份“0”到底是哪一年呢?很多人说是1970年1月1日开始,真是这样吗?
没有调查就没有发言权,本文笔者将测试多种单片机,使用内部RTC功能,以及专用的RTC芯片,考证单片机RTC及常用时钟芯片的时间到底从哪一年起始。
要讨论RTC等等时间从哪一年开始,需要用到历法知识,我们需要在特殊的时间点检验RTC的时间是如何变化的,比如闰年的闰月2月28日23:59:59秒之后,时间变成了哪一天。
二、实验测试
1.STM32F103系列内部RTC功能
在STM32F103单片机内部RTC实时时钟驱动程序中,我们讨论了STM32F103C8T6单片机内部RTC功能,该功能只有一个计数器,每1秒加1,没有年月日及时间寄存器,读取计数器的值后,需要使用软件计算出时间,才能实现日历、时钟功能,软件算法需要考虑历法中的闰年等特殊情况,因此,可得出结论:STM32F103系列内部RTC没有具体的起始时间,起始时间由软件算法确定;在前述的博文中,选择用UTC时间戳(以1970年1月1日00:00:00为开始时间),可以使程序通用性更强。
2.STM32F407系列内部RTC功能
该型号芯片是STM32具有完整RTC功能的代表,先看F407数据手册中关于RTC的描述:
这与F103不同,RTC具有完整的时间、日历寄存器,再看各寄存器的大小: