S3C2440A 第十七章——实时时钟
十七章:实时时钟
简介:
当系统断电后,实时时钟可以通过备用电源继续运转。实时时钟可以通过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 |