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:

  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.        rSRCPND |= 0x1<<30;  
  5.        rINTPND |= 0x1<<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.        rSRCPND |= 0x1<<8;  
  6.        rINTPND |= 0x1<<8;  
  7.         
  8.        if(count%2==0)            //LED亮0.5秒  
  9.               rGPBDAT = ~0x1e0;  
  10.        else                //LED灭0.5秒  
  11.               rGPBDAT = 0x1e0;  
  12.        count++;  
  13.        if(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 ) ;//延时约一秒  
  62.       
  1.   

效果图:


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

posted @ 2013-03-14 22:52  顶顶顶顶  阅读(556)  评论(0)    收藏  举报