十七章:实时时钟
简介:
当系统断电后,实时时钟可以通过备用电源继续运转。实时时钟可以通过STRB/LDRB ARM操作来传输8位数据作为二-十进制(BCD)。这个数据包括年月日时分秒。实时时钟单元外接一个32.768KHz的晶振,同时他操作时钟函数。
特性:
二-十进制(BCD)数:年月日时分秒
闰年产生器
时钟函数:时钟中断和从断电模式醒来
解决2000年问题
独立电源引脚(RTCVDD)
支持RTOS内核滴答时钟的微秒滴答时钟中断
实时时钟时钟操作

闰年产生器:
闰年产生器通过从BCDDATE寄存器, BCDMON寄存器, 以及BCDYEAR寄存器获得的数据可以决定每个月最后是28天,29天,30天还是31天。而这部分就是通过考虑是否是闰年来决定当月又多少天。而一个8位的计数器只能表示两个BCD数字,因此当年份后面两个数字为00时,他不能决定这年是不是闰年。例如,他不能判断1900和2000是不是闰年。而为了解决这个问题,S3C2440A中的RTC模块有一个硬件线性逻辑来确定2000年是闰年。需要注意1900年不是闰年而2000年是。因此在S3C2440A中数字00表示的是2000年而不是1900年。
读/写寄存器
RTCCON寄存器的bit[0]必须被设置为高电平来写RTC模块中的BCD寄存器。而CPU要分别读取寄存器:BCDSEC, BCDMIN, BCDHOUR,BCDDAY,BCDDATE, BCDMON, 以及BCDYEAR来获得秒分时日月年数据。然而要读多个寄存器,这其中可能存在一个1秒钟的偏差。例如当用户从BCDYEAR 到 BCDMIN读寄存器,而读到的结果假设为2059 (年), 12 (月), 31 (日),23 (时) 和59 (分)。而当用户读BCDSEC寄存器时,如果这个值为1到59都没有问题。可是如果这个值为0,那么年月日时分就变为了2060 (年), 1 (月), 1 (日), 0(时) 和0 (分)。而这就是我们所说的1秒钟的偏差。而在这种情况下,用户应该重读BCDYEAR 到 BCDSEC寄存器。
备用电源操作:
RTC逻辑可以通过备用电源驱动,而该备用电源通过RTCVDD引脚进入RTC模块为其提供电源。当系统电源关闭后,CPU与RTC逻辑的接口就被堵塞了,而此时备用电源仅可以驱动晶振电路和BCD计数器电路以获得最小的电量损耗。
时钟函数:
在断电模式和正常模式,RTC会在特定的时刻产生时钟信号。在正常操作模式下,时钟中断被激活。而在断电模式下,电源管理唤醒信号被激活同时时钟中断被激活。而RTC时钟寄存器(RTCALM))决定了时钟使能/失能状态以及时钟时间设置条件。
滴答时钟中断:
RTC滴答时钟用作中断请求。TICNT寄存器有一个中断使能位和中断计数。当滴答时钟中断发生时,计数值清0。然后中断的周期可以通过以下计算:
周期 = (n+1)/128秒,n:滴答时钟计数值(1~127)
这个RTC滴答时钟也许可以用于实时操作系统(RTOS)的内核时钟。如果通过RTC滴答时钟产生时钟,那么与实时操作系统相关的函数将总是与实时时钟同步。
32.768KHZ X-TAL 连接实例

实时时钟专用寄存器:
实时时钟控制寄存器(RTCCON)
RTCCON寄存器由4位组成,分别为RTCEN(他控制BCD寄存器的读写使能位), CLKSEL, CNTSEL, 和CLKRST。
RTCEN位可以控制CPU与RTC间所有的接口,因此在系统重启后他应该设为1在RTC控制程序中来使能数据读/写。同时在断电之前RTCEN位应该清为0以防止偶然写入RTC寄存器。
|
寄存器 |
地址 |
R/W |
描述 |
重启值 |
|
RTCCON |
0x57000040(L) 0x57000043(B) |
R/W (by byte) |
RTC控制寄存器 |
0x0 |
|
RTCCON |
Bit |
描述 |
初始化值 |
|
CLKRST |
[3] |
RTC时钟计数重启。 0=不重启 , 1=重启 |
0 |
|
CNTSEL |
[2] |
BCD计数选择。 0=合并BCD计数器 , 1=保留(离散BCD计数器) |
0 |
|
CLKSEL |
[1] |
BCD时钟选择。 0=XTAL 1/215 分频的时钟 1=保留(XTAL时钟只做测试) |
0 |
|
RTCEN |
[0] |
RTC控制器使能。 0=不使能 ,1=使能 注:只有BCD时间计数和读操作可以编程 |
0 |
注:
1. 所有的RTC寄存器都可以通过STRB和LDRB指令或者字符指针以字节单元的形式调用。
2. (L):小端。(B):大端。
滴答时间计数寄存器(TICNT)
|
寄存器 |
地址 |
R/W |
描述 |
重启值 |
|
TICNT |
0x57000044(L) 0x57000047(B) |
R/W (by byte) |
滴答时间计数寄存器 |
0x0 |
|
TICNT |
Bit |
描述 |
初始化值 |
|
TICK INT Enable |
[7] |
滴答时间中断使能。 0=不使能 ,1=使能 |
0 |
|
TICK Time Count |
[6:0] |
滴答时间计数值(1~127)。 这个计数值内部减少,在工作时,用户不能读这个计数器的值 |
000000 |
RTC时钟控制寄存器(RTCALM)
RTC时钟控制寄存器决定时钟使能和时钟时间,需要注意的是,当在断电模式时,只有通过INT_RTC和PMWKUP RTC时钟控制寄存器才能产生时钟信号,而在正常模式下,只要INT_RTC RTC时钟控制寄存器就可以了。
|
寄存器 |
地址 |
R/W |
描述 |
重启值 |
|
RTCALM |
0x57000050(L) 0x57000053(B) |
R/W (by byte) |
RTC时钟控制寄存器 |
0x0 |
|
RTCALM |
Bit |
描述 |
初始化值 |
|
Reserved |
[7] |
|
0 |
|
ALMEN |
[6] |
全球时钟使能。 0=不使能 ,1=使能 |
0 |
|
YEAREN |
[5] |
年时钟使能。 0=不使能 ,1=使能 |
0 |
|
MONREN |
[4] |
月时钟使能。 0=不使能 ,1=使能 |
0 |
|
DATEEN |
[3] |
日时钟使能。 0=不使能 ,1=使能 |
0 |
|
HOUREN |
[2] |
时时钟使能。 0=不使能 ,1=使能 |
0 |
|
MINEN |
[1] |
分时钟使能。 0=不使能 ,1=使能 |
0 |
|
SECEN |
[0] |
秒时钟使能。 0=不使能 ,1=使能 |
0 |
时钟秒数据寄存器(ALMSEC)
|
寄存器 |
地址 |
R/W |
描述 |
重启值 |
|
ALMSEC |
0x57000054(L) 0x57000057(B) |
R/W (by byte) |
时钟秒数据寄存器 |
0x0 |
|
ALMSEC |
Bit |
描述 |
初始化值 |
|
Reserved |
[7] |
|
0 |
|
SECDATA |
[6:4] |
时钟秒的BCD值 0~5 |
000 |
|
[3:0] |
0~9 |
0000 |
时钟分数据寄存器(ALMMIN)
|
寄存器 |
地址 |
R/W |
描述 |
重启值 |
|
ALMMIN |
0x57000058(L) 0x5700005B(B) |
R/W (by byte) |
时钟分数据寄存器 |
0x0 |
|
ALMMIN |
Bit |
描述 |
初始化值 |
|
Reserved |
[7] |
|
0 |
|
MINDATA |
[6:4] |
时钟分的BCD值 0~5 |
000 |
|
[3:0] |
0~9 |
0000 |
时钟时数据寄存器(ALMHOUR)
|
寄存器 |
地址 |
R/W |
描述 |
重启值 |
|
ALMHOUR |
0x5700005C(L) 0x5700005F(B) |
R/W (by byte) |
时钟时数据寄存器 |
0x0 |
|
ALMHOUR |
Bit |
描述 |
初始化值 |
|
Reserved |
[7:6] |
|
0 |
|
HOURDATA |
[5:4] |
时钟时的BCD值 0~2 |
00 |
|
[3:0] |
0~9 |
0000 |
时钟日数据寄存器(ALMDATE)
|
寄存器 |
地址 |
R/W |
描述 |
重启值 |
|
ALMDATE |
0x57000060(L) 0x57000063(B) |
R/W (by byte) |
时钟日数据寄存器 |
0x01 |
|
ALMDATE |
Bit |
描述 |
初始化值 |
|
Reserved |
[7:6] |
|
00 |
|
DATEDATA |
[5:4] |
时钟日的BCD值从0到28.29.30,31 0~3 |
00 |
|
[3:0] |
0~9 |
0001 |
时钟月数据寄存器(ALMMON)
|
寄存器 |
地址 |
R/W |
描述 |
重启值 |
|
ALMMON |
0x57000064(L) 0x57000067(B) |
R/W (by byte) |
时钟月数据寄存器 |
0x01 |
|
ALMMON |
Bit |
描述 |
初始化值 |
|
Reserved |
[7:5] |
|
00 |
|
MONDATA |
[4] |
时钟月的BCD值 0~1 |
0 |
|
[3:0] |
0~9 |
0001 |
时钟年数据寄存器(ALMYEAR)
|
寄存器 |
地址 |
R/W |
描述 |
重启值 |
|
ALMYEAR |
0x57000068(L) 0x5700006B(B) |
R/W (by byte) |
时钟年数据寄存器 |
0x0 |
|
ALMYEAR |
Bit |
描述 |
初始化值 |
|
YEARDATA |
[7:0] |
时钟年的BCD值 00~99 |
0x0 |
BCD秒数据寄存器(BCDSEC)
|
寄存器 |
地址 |
R/W |
描述 |
重启值 |
|
BCDSEC |
0x57000070(L) 0x57000073(B) |
R/W (by byte) |
BCD秒数据寄存器 |
未定义 |
|
BCDSEC |
Bit |
描述 |
初始化值 |
|
SECDATA |
[6:4] |
BCD秒的BCD值 0~5 |
000 |
|
[3:0] |
0~9 |
0000 |
BCD分数据寄存器(BCDMIN)
|
寄存器 |
地址 |
R/W |
描述 |
重启值 |
|
BCDMIN |
0x57000074(L) 0x57000077(B) |
R/W (by byte) |
BCD分数据寄存器 |
未定义 |
|
BCDMIN |
Bit |
描述 |
初始化值 |
|
MINDATA |
[6:4] |
BCD分的BCD值 0~5 |
000 |
|
[3:0] |
0~9 |
0000 |
BCD时数据寄存器(BCDHOUR)
|
寄存器 |
地址 |
R/W |
描述 |
重启值 |
|
BCDHOUR |
0x57000078(L) 0x5700007B(B) |
R/W (by byte) |
BCD时数据寄存器 |
未定义 |
|
BCDHOUR |
Bit |
描述 |
初始化值 |
|
Reserved |
[7:6] |
|
0 |
|
HOURDATA |
[5:4] |
BCD时的BCD值 0~2 |
00 |
|
[3:0] |
0~9 |
0000 |
BCD日期数据寄存器(BCDDATE)
|
寄存器 |
地址 |
R/W |
描述 |
重启值 |
|
BCDDATE |
0x5700007C(L) 0x5700007F(B) |
R/W (by byte) |
BCD日期数据寄存器 |
未定义 |
|
BCDDATE |
Bit |
描述 |
初始化值 |
|
Reserved |
[7:6] |
|
00 |
|
DATEDATA |
[5:4] |
BCD日的BCD值 0~3 |
00 |
|
[3:0] |
0~9 |
0001 |
BCD星期数据寄存器(BCDDAY)
|
寄存器 |
地址 |
R/W |
描述 |
重启值 |
|
BCDDAY |
0x57000080(L) 0x57000083(B) |
R/W (by byte) |
BCD星期数据寄存器 |
未定义 |
|
BCDYEAR |
Bit |
描述 |
初始化值 |
|
Reserved |
[7:3] |
|
|
|
DAYDATA |
[2:0] |
BCD的星期值 1~7 |
0x0 |
BCD月数据寄存器(BCDMON)
|
寄存器 |
地址 |
R/W |
描述 |
重启值 |
|
BCDMON |
0x57000084(L) 0x57000087(B) |
R/W (by byte) |
BCD月数据寄存器 |
未定义 |
|
BCDMON |
Bit |
描述 |
初始化值 |
|
Reserved |
[7:5] |
|
00 |
|
MONDATA |
[4] |
BCD月的BCD值 0~1 |
0 |
|
[3:0] |
0~9 |
0001 |
BCD年数据寄存器(BCDYEAR)
|
寄存器 |
地址 |
R/W |
描述 |
重启值 |
|
BCDYEAR |
0x57000088(L) 0x5700008B(B) |
R/W (by byte) |
BCD年数据寄存器 |
未定义 |
|
BCDYEAR |
Bit |
描述 |
初始化值 |
|
YEARDATA |
[7:0] |
BCD年的BCD值 00~99 |
0x0 |
本文介绍了实时时钟(RTC)的工作原理及其在系统断电后的持续运行能力。RTC能够通过备用电源保持时间信息,并支持二-十进制(BCD)计数。文中详细解释了RTC的特性,包括闰年产生器、时钟函数、滴答时钟中断等,并提供了RTC专用寄存器的说明。
274

被折叠的 条评论
为什么被折叠?



