RTC实时时钟介绍和代码.doc_第1页
RTC实时时钟介绍和代码.doc_第2页
RTC实时时钟介绍和代码.doc_第3页
RTC实时时钟介绍和代码.doc_第4页
RTC实时时钟介绍和代码.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

RTC实时时钟什么是RTC实时时钟在一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等;而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的32.768KHz 晶体和电阻电容等。S3C2410实时时钟的基本特性实时时钟(RTC)单元可以通过备用电池供电,因此,即使系统电源关闭,它也可以继续工作。RTC 可以通过STRB/LDRB 指令将8 位BCD 码数据送至CPU。这些BCD 数据包括秒,分,时,日期,星期,月和年。RTC 单元通过一个外部的32.768KHz晶振提供时钟。RTC具有定时报警的功能。RTC 控制器功能说明:l 时钟数据采用BCD 编码l 能够对闰年的年月日进行自动处理l 具有告警功能,当系统处于关机状态时,能产生告警中断;l 具有独立的电源输入l 提供毫秒级时钟中断,该中断可用于作为嵌入式操作系统的内核时钟RTC实时时钟的结构框图RTC模块构成l 闰年产生器这个模块可以根据BCDDATA,BCDMON,以及BCDYEAR的数据决定每个月的最后日期是28,29,30 还是31。一个8位的计数器只能显示两个BCD码,因此它不能判断00 年究竟是不是闰年。例如它不能够判断1900 年和2000 的差别。为了解决这个问题,S3C2410内的RTC 模块中有一个固定的逻辑,用来支持2000 年为闰年。请注意虽然2000 年是闰年,但1900 年不是闰年。因此,S3C2410 中00 代表2000 年,而不是1900 年。l 读/写寄存器要求置高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 的值。l 备用电池RTC可被备用电池驱动,备用电池通过RTCVDD引脚向RTC提供电压。当系统掉电时,RTC与CPU之间的接口被阻塞,备用电池仅仅驱动振荡电路以及BCD计数器,这样可减少能量损耗。l 报警功能RTC工作在掉电模式或正常工作模式时会在一个特定的时间产生报警信号。在正常工作模式下,报警中断(ALMINT)是激活状态的。在掉电模式下,电源管理唤醒信号(PMWKUP)与报警中断(ALMINT)都是激活状态。RTC的报警寄存器(RTCALM)决定了报警的使能与不使能以及报警时间设定的条件。l 节拍中断RTC 节拍时间用于中断请求。TICNT 寄存器具有一个中断使能位,同时其中的计数值用于中断。当计数值到达0 时,节拍时间中断就会触发。中断的间隔时间计算如下:Period=(n+1)/128 秒备注n : 节拍时间计数值(1127)这个RTC 时间节拍中断功能可以作为RTOS(实时操作系统)内核的时间节拍。如果节拍从RTC 时间节拍产生,则RTOS 内部与时间相关的功能将一直与实时时钟同步。RTC相关寄存器l RTC控制寄存器寄存器地址读/写描述重置值RTCCON0x57000040(L) 0x57000043(B) 读/写(用字节)RTC控制寄存器0x0RTCCON位描述初始状态CLKRST3 RTC时钟计数重置。0 = 没重置,1 = 重置0CNTSEL2 BCD计数重置。0 = 合并BCD计数器1 = 保留(单独的BCD计数器)0CLKSEL1 BCD时钟选择。0 = XTAL 1/(2的15次方) 分开的时钟1 = 保留(XTAL时钟只用于测试)0RTCEN0 RTC控制使能。0 = 失能,1 = 使能注意:只有BCD时间计数和读取操作可以被执行。0l 实时时钟计数器(TICNT)寄存器地址读/写描述重置值TICNT0x57000044(L) 0x57000047(B) 读/写(用字节)实时时钟计数器0x0TICNT位描述初始状态TICK INT ENABLE7 实时时间中断使能。0 = 失能,1 = 使能0 TICK TIME COUNT6:0 实时时间计数值(1127)。这个计数器的值在内部减少,用户不能在工作时读取这个计数器的值。000000 l RTC报警控制寄存器(RTCALM)RTC报警控制寄存器决定了报警使能以及报警时间。注意,RTCALM寄存器在掉电模式下会通过ALMINT以及PMWKUP产生报警信号,但在正常模式下只在ALMINT产生报警信号。寄存器地址读/写描述重置值RTCALM0x57000050(L) 0x57000053(B) 读/写(用字节)RTC报警控制寄存器0x0RTCALM位描述初始状态保留7 0 ALMEN6 警报全球使能。0 = 失能,1 = 使能0 YEAREN5 年报警使能。0 = 失能,1 = 使能0 MONREN4 月报警使能。0 = 失能,1 = 使能0 DATEEN3 数据报警使能。0 = 失能,1 = 使能0 HOUREN2 小时报警使能。0 = 失能,1 = 使能0 MINEN1 分钟报警使能。0 = 失能,1 = 使能0 SECEN0 秒钟报警使能。0 = 失能,1 = 使能0 l 报警时间秒数寄存器(ALMSEC)寄存器地址读/写描述重置值ALMSEC0x57000054(L) 0x57000057(B) 读/写(用字节)报警时间秒数寄存器0x0ALMSEC位描述初始状态保留70 SECDATA6:4BCD值对于报警时间秒数。0 5 000 3:00 9 0000 l 报警时间分钟数寄存器(ALMMIN)寄存器地址读/写描述重置值ALMMIN0x57000058(L) 0x5700005B(B) 读/写(用字节) 报警时间分钟数寄存器0x00ALMMIN位描述初始状态保留70 MINDATA6:4BCD值对于报警时间分钟数。0 5 000 3:00 9 0000 l 报警时间小时数寄存器(ALMHOUR)寄存器地址读/写描述重置值ALMHOUR0x5700005C(L) 0x5700005F(B) 读/写(用字节)报警时间小时数寄存器0x0ALMHOUR位描述初始状态保留7:600 HOURDATA5:4BCD值对于报警时间小时数。0 2 00 3:00 9 0000 l 报警时间天数寄存器(ALMDATE)寄存器地址读/写描述重置值ALMDATE0x57000060(L) 0x57000063(B) 读/写(用字节)报警时间天数寄存器0x01ALMDAY位描述初始状态保留7:600 DATEDATA5:4BCD值对于报警时间天数,从0到28,29,30,31。 0 3 00 3:00 9 0001 l 报警时间月数寄存器(ALMMON)寄存器地址读/写描述重置值ALMMON0x57000064(L) 0x57000067(B) 读/写(用字节)报警时间月数寄存器0x01ALMMON位描述初始状态保留7:500 MONDATA4BCD值对于报警时间月数。0 1 0 3:00 9 0001 l 报警时间年数寄存器(ALMYEAR)寄存器地址读/写描述重置值ALMYEAR0x57000068(L) 0x5700006B(B) 读/写(用字节)报警时间年数寄存器0x0ALMYEAR位 描述初始状态YEARDATA7:0 BCD值对于报警时间年数。00 99 0x0l 秒,分,时,天,月,年寄存器(BCD 码格式)实验内容根据前面的原理介绍,写一个程序来测试实时时钟的基本功能。实验步骤1. 阅读相关原理介绍,了解RTC实时时钟的基本组成和基本功能以及实现原理。2. 阅读本实验的源代码,更深层次理解RTC的实现过程。3. 自己动手编写一个程序来测试RTC的基本功能。RTC实验代码l 主函数Main#include 2410header.h#include 2410rtc.hvoid Main(void) sysinit(); /系统初始化,库函数,主要完成串口等的初始化工作。 Uart_Printf(n 2410 Board RTC TESTn); /串口打印 / Rtc_TimeSet(); while(1) Uart_Printf(nPress any key to start testnn); while(!Uart_GetKey(); /按键Display_Rtc(); /该函数的定义见下面 l 实时时钟函数Display_Rtcvoid Display_Rtc(void) int year,tmp,key; int month,date,weekday,hour,min,sec; rRTCCON = 0x01; /No reset, Merge BCD counters, 1/32768, RTC Control enable,最低位必须使能才能读取BCD码。 Uart_Printf(Press any key to exit.nn); while(!Uart_GetKey() while(1) if(rBCDYEAR=0x99) year = 0x1999; else year = 0x2000 + rBCDYEAR; /读取年的BCD码 month = rBCDMON; /读取月的BCD码 weekday = rBCDDAY; /读取天的BCD码 date = rBCDDATE; /读取星期的BCD码 hour = rBCDHOUR; /读取小时的BCD码 min = rBCDMIN; /读取分钟的BCD码 sec = rBCDSEC; /读取秒的BCD码 if(sec!=tmp) /Same time is not display tmp = sec; break; Uart_Printf(%2x : %2x : %2x %10s, %2x/%2x/%4xn,hour,min,sec,dayweekday,month,date,year); rRTCCON = 0x0; /No reset, Merge BCD counters, 1/32768, RTC Control disable(for power consumption),禁止读取,这样可以节省电池能量,因为RTC是电池供电的。该实验成功后的结果可参看文件夹中的图片

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论