本文来自S3C2440手册第17章:Real Time Clock
RTC可以在系统断电时由电池供电。RTC可以以Binary Coded Decimal (BCD)格式传输8位数据到CPU,使用STRB/LDRB指令。数据包括秒/分/时/日/星期/月和年。RTC使用外部32.768kHz晶振,还能执行闹钟功能。
Features:
BCD number
Leap year generator
闹钟功能:闹钟中断,或者关机唤醒。
year 2000 problem is removed.
独立电源引脚(RTCVDD)
支持millisecond tick time中断,用于RTOS内核time tick。
leap year generator
8位BCD只能表示2位数字,所以00年,不能确定是平年还是闰年,内部有一个hard-wired logic来支持,00表示2000年。
read / write registers
写BCD寄存器时,RTCCON的第0位必须设为1。CPU可以读BCDSEC, BCDMIN, BCDHOUR, BCDDAY, BCDDATE, BCDMON和BCDYEAR寄存器。读的顺序是从year开始读,读到sec的时候,如果sec为0,应该重新读,防止发生回绕。
backup battery operation
RTCVDD可以供电,但是在系统关机时,CPU接口和RTC逻辑应该是blocked的,backup电池只用来维持计时,来实现省电。
alarm function
在normal operation mode或者power-off mode,RTC可以在特定的时间产生一个alarm signal。在normal operation mode,闹钟中断(INT_RTC)激活。在关机模式,power management wakeup (PMWKUP) 信号激活,INT_RTC也激活。RTC alarm register (RTCALM)决定是否开启闹钟,以及闹钟时间设置的条件。
Tick time interrupt
RTC tick time用来做中断请求。TICNT寄存器有一个中断开启位,以及一个count value。当count value达到0时,出发中断。后期计算方法如下:
Period = (n + 1) /128 second, n: Tick time count value (1 ~127)
RTC tine tick可用来做RTOS内核的time tick。使用RTC的这个tick可以保证RTOS时间相关的函数始终同步到真实时间。
Real time clock control (RTCCON) register
| Register | address | R/W | Desc | Reset value | 
| RTCCON | 0x57000040(L) 0x57000043(B)  | R/W (by byte)  | RTC control register | 0x0 | 
[3] CLKRST
     RTC clock count reset. 0 = no reset, 1 = reset.
[2] CNTSEL
     BCD count select. 0 = Merge BCD counters, 1 = Reserved (Separate BCD counters)
[1] CLKSEL
BCD clock select. 0 = XTAL 1/215 divided clock, 1 = Reserved (XTAL clock only for test)
[0] RTCEN
     RTC control enable. 0 = disable, 1 = enable.
注意:
所有的RTC寄存器只能按字节访问,使用STRB和LDRB指令。大小端访问的地址不同,如上表格address,L表示小端,B表示大端。
Tick time count (TICNT) register
| Register | address | R/W | Desc | Reset value | 
| TICNT | 0x57000044(L) 0x57000047(B)  | R/W (by byte)  | Tick time count register | 0x0 | 
[7] TICK INT Enable
     Tick time interrupt enable. 0 = disable, 1 = enable
[6:0] Tick time count
    Tick time count value (1-127). 这个coutner内部不停的减少,工作时用户不能读这个寄存器。
RTC alarm control (RTCALM) register
决定是否开启闹钟,以及闹钟的时间。
| Register | address | R/W | Desc | Reset value | 
| RTCALM | 0x57000050(L) 0x57000053(B)  | R/W (by byte)  | RTC alarm control register | 0x0 | 
[7] reserved
[6] ALMEN
     alarm global enable 0 = disable, 1 = enable
[5:0] 分别是年,月,日,时,分,秒的闹钟开关,0 = disable, 1 = enable。
闹钟时间设置寄存器:
| Register | Address | R/W | Desc | Reset | 
| ALMSEC | 0x57000054(L) 0x57000057(B)  | R/W (by byte)  | [6:4] BCD值0-5 [3:0] 0-9  | 0x0 | 
| ALMMIN | 0x57000058(L) 0x5700005B(B)  | [6:4] 0-5 [3:0] 0-9  | ||
| ALMHOUR | 0x5700005C(L) 0x5700005F(B)  | [5:4] 0-2 [3:0] 0-9  | ||
| ALMDATE | 0x57000060(L) 0x57000063(B)  | [5:4] 0-3 [3:0] 0-9  | ||
| ALMMON | 0x57000064(L) 0x57000067(B)  | [4] 0-1 [3:0] 0-9  | ||
| ALMYEAR | 0x57000068(L) 0x5700006B(B)  | [7:0] 00-99 | 
BCD时间设置寄存器。
| Register | Address | R/W | Desc | Reset | 
| BCDSEC | 0x57000070(L) 0x57000073(B)  | R/W (by byte)  | [6:4] BCD值0-5 [3:0] 0-9  | 0x0 | 
| BCDMIN | 0x57000074(L) 0x57000077(B)  | [6:4] 0-5 [3:0] 0-9  | ||
| BCDHOUR | 0x57000078(L) 0x5700007B(B)  | [5:4] 0-2 [3:0] 0-9  | ||
| BCDDATE | 0x5700007C(L) 0x5700007F(B)  | [5:4] 0-3 [3:0] 0-9  | ||
| BCDDAY | 0x57000080(L) 0x57000083(B)  | [2:0] 0-7 | ||
| BCDMON | 0x57000084(L) 0x57000087(B)  | [4] 0-1 [3:0] 0-9  | ||
| BCDYEAR | 0x57000068(L) 0x5700006B(B)  | [7:0] 00-99 | 
后续再弄把,没有串口输出也不好判断对不对,学习UART之后,在反过来学习。