RTC
2.阅读本实验的源代码,更深层次理解RTC的实现过程。
3.自己动手编写一个程序来测试RTC的基本功能。
RTC
主函数Main
#include "2410header.h"
#include "2410rtc.h"
void Main(void)
{
sysinit();//系统初始化,库函数,主要完成串口等的初始化工作。
0
CLKSEL
[1]
BCD时钟选择。
0 = XTAL 1/(2的15次方)分开的时钟
1 =保留(XTAL时钟只用于测试)
0
RTCEN
[0]
RTC控制使能。
0 =失能,1 =使能
注意:只有BCD时间计数和读取操作可以被执行。
0
实时时钟计数器(TICNT)
寄存器
地址
读/写
描述
重置值
TICNT
0x57000044(L)
时钟数据采用BCD编码
能够对闰年的年月日进行自动处理
具有告警功能,当系统处于关机状态时,能产生告警中断;
具有独立的电源输入
提供毫秒级时钟中断,该中断可用于作为嵌入式操作系统的内核时钟
RTC
RTC
闰年产生器
这个模块可以根据BCDDATA,BCDMON,以及BCDYEAR的数据决定每个月的最后日期是28,29,30还是31。一个8位的计数器只能显示两个BCD码,因此它不能判断00年究竟是不是闰年。例如它不能够判断1900年和2000的差别。。为了解决这个问题,S3C2410内的RTC模块中有一个固定的逻辑,用来支持2000年为闰年。请注意虽然2000年是闰年,但1900年不是闰年。因此,S3C2410中00代表2000年,而不是1900年。
备用电池
RTC可被备用电池驱动,备用电池通过RTCVDD引脚向RTC提供电压。当系统掉电时,RTC与CPU之间的接口被阻塞,备用电池仅仅驱动振荡电路以及BCD计数器,这样可减少能量损耗。
报警功能
RTC工作在掉电模式或正常工作模式时会在一个特定的时间产生报警信号。在正常工作模式下,报警中断(ALMINT)是激活状态的。在掉电模式下,电源管理唤醒信号(PMWKUP)与报警中断(ALMINT)都是激活状态。RTC的报警寄存器(RTCALM)决定了报警的使能与不使能以及报警时间设定的条件。
读/写
(用字节)
RTC报警控制寄存器
0x0
RTCALM
位
描述
初始状态
保留
[7]
0
ALMEN
[6]
警报全球使能。
0 =失能,1 =使能
0
YEAREN
[5]
年报警使能。
0 =失能,1 =使能
0
MONREN
[4]
月报警使能。
0 =失能,1 =使能
0
DATEEN
[3]
数据报警使能。
0 =失能,1 =使能
0
HOUREN
}
}
实时时钟函数Display_Rtc
void Display_Rtc(void)
{
int year,tmp,key;
int month,date,weekdN = 0x01; //No reset, Merge BCD counters, 1/32768, RTC Control enable,最低位必须使能才能读取BCD码。
RTC
RTC控制寄存器
寄存器
地址
读/写
描述
重置值
RTCCON
0x57000040(L)
0x57000043(B)
读/写
(用字节)
RTC控制寄存器
0x0
RTCCON
位
描述
初始状态
CLKRST
[3]
RTC时钟计数重置。
0 =没重置,1 =重置
0
CNTSEL
[2]
BCD计数重置。
0 =合并BCD计数器
1 =保留(单独的BCD计数器)
读/写
(用字节)
报警时间月数寄存器
0x01
ALMMON
位
描述
初始状态
保留
[7:5]
00
MONDATA
[4]
BCD值对于报警时间月数。
0 ~ 1
0
[3:0]
0 ~ 9
0001
报警时间年数寄存器(ALMYEAR)
寄存器
地址
读/写
描述
重置值
ALMYEAR
0x57000068(L)
0x5700006B(B)
0x0
ALMSEC
位
描述
初始状态
保留
[7]
0
SECDATA
[6:4]
BCD值对于报警时间秒数。
0 ~ 5
000
[3:0]
0 ~ 9
0000
报警时间分钟数寄存器(ALMMIN)
寄存器
地址
读/写
描述
重置值
ALMMIN
0x57000058(L)
0x5700005B(B)
读/写
(用字节)
报警时间分钟数寄存器
}
该实验成功后的结果可参看文件夹中的图片。
本实验只使用实时时钟显示了系统当前时间的显示,实时时钟还有很多的功能可以实现,例如报警,设定当前时间的值等等。在我们的源文件中也有这些函数的实现,读者可以自己尝试阅读并运行这些程序。有兴趣的读者可以查看该实验中所调用的库函数的具体实现,可以帮助读者理解更多的实时时钟实现的具体细节。查看方法:用ADS打开该实验的工程文件,在主函数中找到标准库函数的调用处,鼠标右键点击,选择Go to function definition of XXX,即可到达指定的库函数定义处。
[2]
小时报警使能。
0 =失能,1 =使能
0
MINEN
[1]
分钟报警使能。
0 =失能,1 =使能
0
SECEN
[0]
秒钟报警使能。
0 =失能,1 =使能
0
报警时间秒数寄存器(ALMSEC)
寄存器
地址
读/写
描述
重置值
ALMSEC
0x57000054(L)
0x57000057(B)
读/写
(用字节)
报警时间秒数寄存器
读/写寄存器
要求置高RTCON寄存器的0位来表示读和写RTC模块中的寄存器。。为了显示秒,分,小时,日期,月和年,CPU会从BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON,和BCDYEAR寄存器读取数据。但是由于多个寄存器的读取,可能产生1秒钟的偏离。例如,如果用户读取寄存器BCDYEAR到BCDMIN,假设结果为1959年,12月,31日,23点,59分。在用户读取BCDSEC寄存器时,但如果结果是0,那么很有可能年,月,日,时,分已经变成了1960年1月1日0时0分了。解决的方法是,当读取到的BCDSEC等于0时,用户应该在读取一次BCDYEAR到BCDSEC的值。
0x57000047(B)
读/写
(用字节)
实时时钟计数器
0x0
TICNT
位
描述
初始状态
TICK INT ENABLE
[7]
实时时间中断使能。
0 =失能,1 =使能
0
TICK TIME COUNT
[6:0]
实时时间计数值(1~127)。
这个计数器的值在内部减少,用户不能在工作时读取这个计数器的值。
000000
Uart_Printf("Press any key to exit.\n\n");
while(!Uart_GetKey())
{
while(1)
{
if(rBCDYEAR==0x99)
year = 0x1999;
else
year = 0x2000 + rBCDYEAR;//读取年的BCD码
month = rBCDMON;//读取月的BCD码
RTC
什么是
在一个嵌入式系统中,通常采用RTC来提供可靠的系统时间,包括时分秒和年月日等;而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的32.768KHz晶体和电阻电容等。
S3C2410
实时时钟(RTC)单元可以通过备用电池供电,因此,即使系统电源关闭,它也可以继续工作。RTC可以通过STRB/LDRB指令将8位BCD码数据送至CPU。这些BCD数据包括秒,分,时,日期,星期,月和年。RTC单元通过一个外部的32.768KHz晶振提供时钟。RTC具有定时报警的功能。RTC控制器功能说明:
weekday = rBCDDAY;//读取天的BCD码
date = rBCDDATE;//读取星期的BCD码
hour = rBCDHOUR;//读取小时的BCD码
min = rBCDMIN;//读取分钟的BCD码
sec = rBCDSEC;//读取秒的BCD码
if(sec!=tmp) //Same time is not display
0x0
ALMHOUR
位
描述
初始状态
保留
[7:6]
00
HOURDATA
[5:4]
BCD值对于报警时间小时数。
0 ~ 2
00
[3:0]
0 ~ 9
0000
报警时间天数寄存器(ALMDATE)
寄存器
地址
读/写
描述
重置值
ALMDATE
0x57000060(L)
0x57000063(B)