ILD

RTC
作者:Herbert Yuan 邮箱:yuanjp89@163.com
发布时间:2017-11-6 站点:Inside Linux Development

本文来自S3C2440手册第17章:Real Time Clock


1 Overview

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。


2 Real time clock operation

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时间相关的函数始终同步到真实时间。


3 Real time clock special registers

Real time clock control (RTCCON) register

RegisteraddressR/W
DescReset value
RTCCON

0x57000040(L)

0x57000043(B)

R/W

(by byte)

RTC control register0x0

[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

RegisteraddressR/W
DescReset value
TICNT

0x57000044(L)

0x57000047(B)

R/W

(by byte)

Tick time count register0x0

[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

决定是否开启闹钟,以及闹钟的时间。

RegisteraddressR/W
DescReset value
RTCALM

0x57000050(L)

0x57000053(B)

R/W

(by byte)

RTC alarm control register0x0

[7] reserved

[6] ALMEN

     alarm global enable 0 = disable, 1 = enable

[5:0] 分别是年,月,日,时,分,秒的闹钟开关,0 = disable, 1 = enable。


闹钟时间设置寄存器:

RegisterAddressR/WDescReset
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时间设置寄存器。

RegisterAddressR/WDescReset
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


4 实战

后续再弄把,没有串口输出也不好判断对不对,学习UART之后,在反过来学习。


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.