【北京迅为】i.MX6ULL终结者SRTC实时时钟例程SRTC简介

RTC的全称是Real_Time Clock,即实时时钟。能够为我们提供实时时间,i.MX6 ULL内部也集成了这个模块叫做SRTC,我们可以参考《I.MX6ULL参考手册.pdf》文档的第48章Secure Non-Volatile Storage(SNVS)。SNVS是非易失性存储,主要包括一些低功耗的模块,比如实时时钟(SRTC),单调计数器(monotonic counter)以及一些通用的寄存器。SNVS里面的外设在外部电源断电的情况下,可以通过后备电池供电能够实现继续运行。I.MX6 ULL终结者开发板板载了一个纽扣电池,保证在系统电源断电的情况下给SNVS供电。如图 1所示:
【北京迅为】i.MX6ULL终结者SRTC实时时钟例程SRTC简介

图 1

这样就能保证SNVS一直有电源输入,这样SRTC就会一直运行,除非纽扣电池没有电了。SNVS分为两部分:SNVS_HP和SNVS_LP。系统电源断电的情况下SNVS_HP也会断电,如果有后备电池,SNVS_LP不会断电,这样SNVS_LP相关的寄存器的值不会丢失。

SNVS分为两个子模块:SNVS_HP和SNVS_LP,《I.MX6ULL参考手册.pdf》第48章给出了这两部分模块的供电图,如图 2所示:
【北京迅为】i.MX6ULL终结者SRTC实时时钟例程SRTC简介

图 2

从上图我们可以看到标识1处的电源是VDD_HIGH_IN,这个是给SNVS_HP供电的系统的主电源。标识2处的VDD_SNVS_IN是纽扣电池电源,这个电源只会提供给SNVS_LP,保证在系统电源VDD_HIGH_IN掉电以后,SNVS_LP还会继续运行。从上图我们看到SNVS_LP内部有一个SRTC(定时器),只要给它提供时钟,它就会工作。在我们的核心板上给他提供了32.768KHz的时钟。我们可以通过读取相应的寄存器,可以获取到秒数,然后可以换算成年月日(一般以1970年1月1日为起点)。

接下来我们来看下与SRTC相关的寄存器,关于SNVS部分的寄存器,我们发现《IMX6ULL参考手册.pdf》并没有列出全部的寄存器,所以我们参考了《IMX6UL参考手册.pdf》手册。首先是SNVS_HPCOMR寄存器,结构图如图 3所示:
【北京迅为】i.MX6ULL终结者SRTC实时时钟例程SRTC简介

图 3

该寄存器我们用到了NPSWA_EN(bit31),这个是非特权软件访问位,如果任何软件都可以访问特权寄存器,需要设置此位为1。
然后是SNVS_LP寄存器,结构图如图 4所示:
【北京迅为】i.MX6ULL终结者SRTC实时时钟例程SRTC简介

图 4

我们只用到了SRTC_ENV(bit0)位,此位为1使能SRTC。
然后是LPSRTCMR寄存器,结构图如图 5所示:
【北京迅为】i.MX6ULL终结者SRTC实时时钟例程SRTC简介

图 5

该寄存器有效位是bit15:bit0:表示SRTC计数的高15位。
然后是寄存器LPSRTCLR,结构图如图 6所示:
【北京迅为】i.MX6ULL终结者SRTC实时时钟例程SRTC简介

图 6

通过该图可以看到该寄存器的有效位是32位,代表着SRTC计数的低32位。
这样通过LPSRTCMR和LPSRTCLR合并起来,SRTC的计数是15bit+32bit=47bit。假设我们设定总计数为SUM,那么SUM=(LPSRTCMR<<32)|(LPSRTCLR),因为我们给SRTC的时钟是32.768KHz,相当于一秒钟SRTC的计数个数是32768(1000000000000000b=1<<15)个,所以总计数SUM换算成秒(Second)为:
Second= SUM/32768 = SUM>>15 = (LPSRTCMR<<32)>>15)|(LPSRTCLR>>15),最终
Second=(LPSRTCMR<<17)|(LPSRTCLR>>15),即我们程序中的:
seconds = (SNVS->LPSRTCMR << 17) | (SNVS->LPSRTCLR >> 15);

关于SNVS中和SRTC相关的寄存器我们就介绍到这里,大家可以参考《I.MX6UL 参考手册.pdf》手册查看更详细的介绍(该文件在光盘资料的“i.MX6UL终结者光盘资料\03_开发板硬件资料\02_芯片资料/1、I.MX6UL芯片资料.zip ”目录下)。

下面我们来看下使用SRTC的配置步骤:
1.初始化SRTC
2.设置SRTC的时候
3.开启SRTC
4.获取SRTC时间【北京迅为】i.MX6ULL终结者SRTC实时时钟例程SRTC简介