RTC(Real-Time Clock):实时时钟。它的主要作用就是提供稳定的实时时钟给后续电路用。主要功能有:时钟,日历,闹钟,周期性中断输出,32KHz时钟输出。系统掉电的情况下,利用后备电源使时钟继续运行,从而不会丢失时间信息。

下面简要介绍一下它的用法:

用到的寄存器:

                            RTCCON       :控制寄存器

                            TICNT:节拍时间计数器

                            RTCALM:闹钟控制寄存器

                            ALMSEC:秒闹钟寄存器

                            ALMMIN:分闹钟寄存器

                            ALMHOUR:小时闹钟寄存器

                            ALMDATE:日闹钟寄存器

                            ALMMON:月闹钟寄存器

                            ALMYEAR:年闹钟寄存器

                            BCDSEC :秒寄存器

                            BCDMIN:分寄存器

                            BCDHOUR:时寄存器

                            BCDDAY:星期寄存器

                            BCDDATE:日寄存器

                            BCDMON:月寄存器

                            BCDYEAR:年寄存器

1,首先通过RTCCON的第一位使能RTC:

[html] view plaincopy

  1. rRTCCON = 1 ;       //RTC read and write enable  


2,设定初始时间,通过写相应寄存器完成:

1. rBCDYEAR = 0x11 ;       //年  
2. rBCDMON  = 0x11 ;        //月  
3. rBCDDATE = 0x26 ;        //日   
4. rBCDDAY  = 0x06 ;       //星期  
5. rBCDHOUR = 0x11 ;       //小时  
6. rBCDMIN  = 0x09 ;        //分  
7. rBCDSEC  = 0x30 ;        //秒

3.然后不断地从相应寄存器中读取RTC的值:

1. year = 0x2000+rBCDYEAR  ;   //年  
2. month = rBCDMON  ;      //月  
3. day = rBCDDATE  ;       //日   
4. /   week = rBCDDAY  ;       //星期  
5. hour = rBCDHOUR  ;      //小时  
6. minute = rBCDMIN  ;     //分  
7. second = rBCDSEC  ;     //秒


4,读取出来之后要关掉RTC读写功能,防止误写,如有需要可以对其格式进行转化:

1.    Uart_Printf( "RTC time : %04x-%02x-%02x %02x:%02x:%02x\n", year, month, day, hour, minute, second );  
2.    //以16进制打印rtc time,因为存进去的是16进制  
3. 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控制的。

1. //报警中断  
2. void __irq Alarm_ISR(void)  
3. {  
4. <<30;  
5. <<30;  
6. 
7. rTICNT = 0xbf;     //开启时间节拍中断,周期为500毫秒  
8. }

2,时间节拍中断类似于定时器中断。但时间节拍中断是毫秒级的,而定时器中断可以达到微秒,甚至更小级别。

 RTC节拍时间是用于中断请求。TICNT寄存器有一个中断使能位和中断的计数值。当节拍时间中断发生时计数值到达‘0’。然后中断周期如下:

------周期=(n+1)/128秒

------n:节拍时间计数值(1至127)

1. //时间节拍中断,用于LED闪烁15秒  
2. void __irq RTCTick_ISP(void)  
3. {  
4.        static char count;  
5. <<8;  
6. <<8;  
7. 
8. 2==0)            //LED亮0.5秒  
9. rGPBDAT = ~0x1e0;  
10.        else                //LED灭0.5秒  
11. rGPBDAT = 0x1e0;  
12.        count++;  
13. count==30)  
14.        {  
15. rTICNT = 0x0;              //禁止时间节拍中断  
16. rGPBDAT = 0x1e0;              //LED灭  
17. count=0;  
18.        }  
19. }

RTC.c源码,实现在串口打印实时时间。

1. //====================================================================  
2. // File Name : RTC.c  
3. // Function  : S3C24X0 RTC Test   
4. // Program   : Kang, Weon Tark   
5. // Date      : May 22, 2002  
6. // Version   : 0.0  
7. // History  
8. //   0.0 : Programming start (March 29,2002) -> KWT  
9. //         RTC Test                          -> May 15, 2002 SOP  
10. //====================================================================  
11. 
12. #include "def.h"  
13. #include "option.h"  
14. #include "2440addr.h"  
15. #include "2440lib.h"  
16. #include "2440slib.h"   
17. 
18. //==================================================================================          
19. void RTC_Time_Set( void )//设置rtc初值  
20. {  
21. rRTCCON = 1 ;       //RTC read and write enable  
22.                             //往相应BCD寄存器中写入初值  
23. rBCDYEAR = 0x11 ;       //年  
24. rBCDMON  = 0x11 ;       //月  
25. rBCDDATE = 0x26 ;       //日   
26. rBCDDAY  = 0x06 ;       //星期  
27. rBCDHOUR = 0x11 ;       //小时  
28. rBCDMIN  = 0x09 ;       //分  
29. rBCDSEC  = 0x30 ;       //秒  
30. 
31.     rRTCCON &= ~1 ;     //RTC read and write disable  
32. }  
33. 
34. //==================================================================================  
35. void RTC_Display(void)   
36. {  
37.     U16 year ;  
38.     U8 month, day ;     // week  
39.     U8 hour, minute, second ;  
40. 
41.     RTC_Time_Set() ;  
42. 
43.     Uart_Printf( "RTC TIME Display, press ESC key to exit !\n" ) ;  
44. 
45.     while( Uart_GetKey() != ESC_KEY )  
46.     {  
47. rRTCCON = 1 ;       //RTC read and write enable  
48.                                         //不断读相应BCD寄存器中的值  
49. year = 0x2000+rBCDYEAR  ;       //年  
50. month = rBCDMON  ;      //月  
51. day = rBCDDATE  ;       //日   
52. //      week = rBCDDAY  ;       //星期  
53. hour = rBCDHOUR  ;      //小时  
54. minute = rBCDMIN  ;     //分  
55. second = rBCDSEC  ;     //秒  
56. 
57.         rRTCCON &= ~1 ;     //RTC read and write disable  
58. 
59.         Uart_Printf( "RTC time : %04x-%02x-%02x %02x:%02x:%02x\n", year, month, day, hour, minute, second );  
60.         //以16进制打印rtc time,因为存进去的是16进制  
61.         Delay( 900 ) ;//延时约一秒

效果图:

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