S3C2440之RTC 寄存器
RTC(Real-Time Clock):实时时钟。它的主要作用就是提供稳定的实时时钟给后续电路用。主要功能有:时钟,日历,闹钟,周期性中断输出,32KHz时钟输出。系统掉电的情况下,利用后备电源使时钟继续运行,从而不会丢失时间信息。
下面简要介绍一下它的用法:
用到的寄存器:
RTCCON :控制寄存器
TICNT:节拍时间计数器
RTCALM:闹钟控制寄存器
ALMSEC:秒闹钟寄存器
ALMMIN:分闹钟寄存器
ALMHOUR:小时闹钟寄存器
ALMDATE:日闹钟寄存器
ALMMON:月闹钟寄存器
ALMYEAR:年闹钟寄存器
BCDSEC :秒寄存器
BCDMIN:分寄存器
BCDHOUR:时寄存器
BCDDAY:星期寄存器
BCDDATE:日寄存器
BCDMON:月寄存器
BCDYEAR:年寄存器
1,首先通过RTCCON的第一位使能RTC:
- rRTCCON = 1 ; //RTC read and write enable
2,设定初始时间,通过写相应寄存器完成:
- rBCDYEAR = 0x11 ; //年
- rBCDMON = 0x11 ; //月
- rBCDDATE = 0x26 ; //日
- rBCDDAY = 0x06 ; //星期
- rBCDHOUR = 0x11 ; //小时
- rBCDMIN = 0x09 ; //分
- rBCDSEC = 0x30 ; //秒
3.然后不断地从相应寄存器中读取RTC的值:
- year = 0x2000+rBCDYEAR ; //年
- month = rBCDMON ; //月
- day = rBCDDATE ; //日
- / week = rBCDDAY ; //星期
- hour = rBCDHOUR ; //小时
- minute = rBCDMIN ; //分
- second = rBCDSEC ; //秒
4,读取出来之后要关掉RTC读写功能,防止误写,如有需要可以对其格式进行转化:
- Uart_Printf( "RTC time : %04x-%02x-%02x %02x:%02x:%02x\n", year, month, day, hour, minute, second );
- //以16进制打印rtc time,因为存进去的是16进制
- Delay( 900 ) ;//延时约一秒
That's it!
下图可以看到RTC工作流程:

上图中Time Tick Generrator产生TIME TICK信号,Alarm Generrator 产生INT_RTC信号,分别是s3c2440实时时钟(RTC)中的两个中断源:报警中断和时间节拍中断。
下面介绍一下他们的原理(此段参考赵老师的讲解):
1,报警中断可以实现当实时时间达到预置的时间后,引起报警。RTC在掉电模式中或正常工作模式中的指定时间产生一个闹钟信号。在正常工作模式中,只激活闹钟中断(INT_RTC)信号。RTC闹钟寄存器(RTCALM)决定了闹钟使能/禁止状态和闹钟时间设置的条件。预置的时间是存储在报警时间数据寄存器中的,包括ALMYEAR(年)、ALMMON(月)、ALMDATE(日)、ALMHOUR(小时)、ALMMIN(分)和ALMSEC(秒)。而如何报警,是由报警控制寄存器RTCALM控制的。
- //报警中断
- void __irq Alarm_ISR(void)
- {
- rSRCPND |= 0x1<<30;
- rINTPND |= 0x1<<30;
- rTICNT = 0xbf; //开启时间节拍中断,周期为500毫秒
- }
2,时间节拍中断类似于定时器中断。但时间节拍中断是毫秒级的,而定时器中断可以达到微秒,甚至更小级别。
RTC节拍时间是用于中断请求。TICNT寄存器有一个中断使能位和中断的计数值。当节拍时间中断发生时计数值到达‘0’。然后中断周期如下:
------周期=(n+1)/128秒
------n:节拍时间计数值(1至127)
- //时间节拍中断,用于LED闪烁15秒
- void __irq RTCTick_ISP(void)
- {
- static char count;
- rSRCPND |= 0x1<<8;
- rINTPND |= 0x1<<8;
- if(count%2==0) //LED亮0.5秒
- rGPBDAT = ~0x1e0;
- else //LED灭0.5秒
- rGPBDAT = 0x1e0;
- count++;
- if(count==30)
- {
- rTICNT = 0x0; //禁止时间节拍中断
- rGPBDAT = 0x1e0; //LED灭
- count=0;
- }
- }
RTC.c源码,实现在串口打印实时时间。
- //====================================================================
- // File Name : RTC.c
- // Function : S3C24X0 RTC Test
- // Program : Kang, Weon Tark
- // Date : May 22, 2002
- // Version : 0.0
- // History
- // 0.0 : Programming start (March 29,2002) -> KWT
- // RTC Test -> May 15, 2002 SOP
- //====================================================================
- #include "def.h"
- #include "option.h"
- #include "2440addr.h"
- #include "2440lib.h"
- #include "2440slib.h"
- //==================================================================================
- void RTC_Time_Set( void )//设置rtc初值
- {
- rRTCCON = 1 ; //RTC read and write enable
- //往相应BCD寄存器中写入初值
- rBCDYEAR = 0x11 ; //年
- rBCDMON = 0x11 ; //月
- rBCDDATE = 0x26 ; //日
- rBCDDAY = 0x06 ; //星期
- rBCDHOUR = 0x11 ; //小时
- rBCDMIN = 0x09 ; //分
- rBCDSEC = 0x30 ; //秒
- rRTCCON &= ~1 ; //RTC read and write disable
- }
- //==================================================================================
- void RTC_Display(void)
- {
- U16 year ;
- U8 month, day ; // week
- U8 hour, minute, second ;
- RTC_Time_Set() ;
- Uart_Printf( "RTC TIME Display, press ESC key to exit !\n" ) ;
- while( Uart_GetKey() != ESC_KEY )
- {
- rRTCCON = 1 ; //RTC read and write enable
- //不断读相应BCD寄存器中的值
- year = 0x2000+rBCDYEAR ; //年
- month = rBCDMON ; //月
- day = rBCDDATE ; //日
- // week = rBCDDAY ; //星期
- hour = rBCDHOUR ; //小时
- minute = rBCDMIN ; //分
- second = rBCDSEC ; //秒
- rRTCCON &= ~1 ; //RTC read and write disable
- Uart_Printf( "RTC time : %04x-%02x-%02x %02x:%02x:%02x\n", year, month, day, hour, minute, second );
- //以16进制打印rtc time,因为存进去的是16进制
- Delay( 900 ) ;//延时约一秒
效果图:

完整工程文件可在这里下载。

浙公网安备 33010602011771号