本文来自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之后,在反过来学习。