单片机 > 单片机程序设计 > 详情

mini2440硬件篇之RTC

发布时间:2025-07-03 发布时间:
|


  1.  硬件原理

实时时钟(RTC)的主要功能是在系统掉电的情况下,利用后备电源使时钟继续运行,从而不会丢失时间信息。


1.1. 时间的设置和获取

s3c2440内部集成了RTC模块,而且用起来也十分简单。其内部的寄存器BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON和BCDYEAR分别存储了当前的秒,分,小时,星期,日,月和年,表示时间的数值都是BCD码。这些寄存器的内容可读可写,并且只有在寄存器RTCCON的第0位为1时才能进行读写操作。为了防止误操作,当不进行读写时,要把该位清零。当读取这些寄存器时,能够获知当前的时间;当写入这些寄存器时,能够改变当前的时间。另外需要注意的是,因为有所谓的“一秒误差”,因此当读取到的秒为0时,需要重新再读取一遍这些寄存器的内容,才能保证时间的正确。


1.2. 报警和时间节拍

s3c2440实时时钟(RTC)中,定义了两个中断源:报警中断和时间节拍中断。

时间节拍中断,顾名思义,就像一个节拍器,可以等时性的控制节拍。因此它类似于定时器中断。但时间节拍中断是毫秒级的,而定时器中断可以达到微秒,甚至更小级别。时间节拍中断的周期公式为:(n+1)÷128,单位是秒,即每隔这么长时间,会中断一次。其中n的值为1~127,它存储在寄存器TICNT的低6位中,当寄存器TICNT的第7位被置1时,表示开启时间节拍中断,这时n递减,当减为0时,进入时间节拍中断。

报警中断可以实现当实时时间达到预置的时间后,引起报警。预置的时间是存储在报警时间数据寄存器中的,包括ALMYEAR(年)、ALMMON(月)、ALMDATE(日)、ALMHOUR(小时)、ALMMIN(分)和ALMSEC(秒)。而如何报警,是由报警控制寄存器RTCALM控制的。它的第6位置1表示全局报警,而第5位到第0位置1分别表示年、月、日、小时、分和秒报警。比如,我们想要在2010年4月5日22时30分0秒报警,那么把这个时间分别存储到相应的报警时间数据寄存器中,然后设置RTCALM为0x7F,这样当实时时钟到达这个时刻时,会引起报警中断;又比如我们想要系统具有闹钟的功能,让它每天早上6点提醒我们起床,那么我们可以设置ALMHOUR为6,RTCALM为0x44。如果我们只想让系统在4月份的时候提醒我们6点起床,那该怎么办呢?这个问题对于s3c2440来说就是小菜一碟,只要我们再在ALMMON里写入4,然后把RTCALM改为0x54即可。总之,就是系统根据RTCALM所置1的相应位来比较相对应的当前时间与报警时间数据寄存器中的值,如果相等就进入中断。

2. 芯片手册

3. mini2440电路图

4. S3C2440寄存器

RTCCON控制寄存器

选择时钟,使能RTC。BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON和BCDYEAR分别存储了当前的秒,分,小时,星期,日,月和年,表示时间的数值都是BCD码。

TICNT 计数寄存器

[7]使能中断,[6:0]计数值

RTCALM报警控制

分别使能年月日时分秒和总报警开关。预置的时间是存储在报警时间数据寄存器中的,包括ALMYEAR(年)、ALMMON(月)、ALMDATE(日)、ALMHOUR(小时)、ALMMIN(分)和ALMSEC(秒)。

rtc.h


  1. /******************************************************************* 

  2.  * Copyright (C),2011-2012, XXX. 

  3.  * FileName: rtc.h  

  4.  * Author:HuangYinqing 

  5.  * Version:1.0 

  6.  * Date::2012-04-22 

  7.  * Description:rtc驱动. 

  8.  * Function List: 

  9.  * History: 

  10.  ******************************************************************/  

  11. #ifndef __RTC_H__  

  12. #define __RTC_H__  

  13.   

  14. #define  DBG_RTC_LEVEL 1  

  15.   

  16. /*函数声明*/  

  17. void RTCInit(void );  

  18. void RTCTest(void);  

  19.   

  20.   

  21. #endif  

rtc.c


  1. /******************************************************************* 

  2.  * Copyright (C),2011-2012, XXX. 

  3.  * FileName: rtc.c  

  4.  * Author:HuangYinqing 

  5.  * Version:1.0 

  6.  * Date::2012-04-22 

  7.  * Description:rtc驱动. 

  8.  * Function List: 

  9.  * History: 

  10.  ******************************************************************/  

  11. #include "common.h"  

  12. #include "core.h"  

  13. #include "rtc.h"  

  14.   

  15. unsigned char pucAlarmBuffer[6];    //==报警缓存数组  

  16. unsigned char pucDateBuffer[7];     //==时间缓冲数组    

  17.   

  18.   

  19. /******************************************************************** 

  20. 函数功能:RTC报警中断。 

  21. 入口参数:无。 

  22. 返    回:无。 

  23. 备    注:无。 

  24. ********************************************************************/  

  25. static void __irq RTCAlarmHandler(void)  

  26. {  

  27.     rSRCPND |= BIT_RTC;  

  28.     rINTPND |= BIT_RTC;  

  29.   

  30.     rTICNT = 0xbf;      //开启时间节拍中断,周期为500毫秒  

  31.       

  32.     rGPBDAT |= 0x01;    //==蜂鸣器响  

  33. }  

  34.   

  35. /******************************************************************** 

  36. 函数功能:时钟节拍中断。 

  37. 入口参数:无。 

  38. 返    回:无。 

  39. 备    注:无。 

  40. ********************************************************************/  

  41. static void __irq RTCTickHandler(void)  

  42. {  

  43.     static char count;  

  44.       

  45.     rSRCPND |= BIT_TICK;  

  46.     rINTPND |= BIT_TICK;  

  47.       

  48.     if( count == 10 )   //==响5秒不再响  

  49.     {  

  50.         rGPBDAT &= ~(0x01);  

  51.         rTICNT = 0;  

  52.         count = 0;  

  53.     }  

  54.       

  55.     count++;  

  56. }  

  57.   

  58.   

  59. /******************************************************************** 

  60. 函数功能:RTC初始化。 

  61. 入口参数:无。 

  62. 返    回:无。 

  63. 备    注:无。 

  64. ********************************************************************/  

  65. void RTCInit(void)  

  66. {  

  67.     rGPBCON &= ~(0x3<<0);  

  68.     rGPBCON |= 0x1<<0;  

  69.     rGPBDAT &= ~(0x01); //==蜂鸣器不响  

  70.   

  71.     rRTCCON = 1;  

  72.     rRTCALM = (1<<6) | (1<<0);   //==开全局闹钟和秒闹钟  

  73.   

  74.     pISR_RTC = ( unsigned int )RTCAlarmHandler;  

  75.     pISR_TICK = ( unsigned int )RTCTickHandler;  

  76.     rINTMSK &= ~(BIT_RTC);  

  77.     rINTMSK &= ~(BIT_TICK);  

  78. }  

  79.   

  80.   

  81. /******************************************************************** 

  82. 函数功能:设置报警时间。 

  83. 入口参数:无 

  84. 返    回:无。 

  85. 备    注:无。 

  86. ********************************************************************/  

  87. void RTCSetAlarm(void)  

  88. {  

  89.     rALMYEAR = pucAlarmBuffer[0];           //年  

  90.     rALMMON  = pucAlarmBuffer[1];           //月  

  91.     rALMDATE = pucAlarmBuffer[2];           //日  

  92.     rALMHOUR = pucAlarmBuffer[3];           //小时  

  93.     rALMMIN  = pucAlarmBuffer[4];           //分  

  94.     rALMSEC  = pucAlarmBuffer[5];           //秒  

  95. }  

  96.   

  97.   

  98. /******************************************************************** 

  99. 函数功能:设置时间。 

  100. 入口参数:无 

  101. 返    回:无。 

  102. 备    注:无。 

  103. ********************************************************************/  

  104. void RTCSetDate(void)  

  105. {  

  106.     rRTCCON |= 1 ;  

  107.       

  108.     rBCDYEAR = pucDateBuffer[0] ;           //年  

  109.     rBCDMON  = pucDateBuffer[1] ;           //月  

  110.     rBCDDATE = pucDateBuffer[2] ;           //日    

  111.     rBCDHOUR = pucDateBuffer[3] ;           //小时  

  112.     rBCDMIN  = pucDateBuffer[4] ;           //分  

  113.     rBCDSEC  = pucDateBuffer[5] ;           //秒  

  114.     rBCDDAY  = pucDateBuffer[6] ;           //星期  

  115.           

  116.     rRTCCON &= ~(0x1) ;  

  117. }  

  118.   

  119.   

  120. /******************************************************************** 

  121. 函数功能:获取时间。 

  122. 入口参数:无 

  123. 返    回:无。 

  124. 备    注:无。 

  125. ********************************************************************/  

  126. void RTCGetDate(void)  

  127. {  

  128.     rRTCCON |= 1;  

  129.       

  130.     pucDateBuffer[0] = rBCDYEAR;            //年  

  131.     pucDateBuffer[1] = rBCDMON;             //月  

  132.     pucDateBuffer[2] = rBCDDATE;            //日    

  133.     pucDateBuffer[3] = rBCDHOUR;            //小时  

  134.     pucDateBuffer[4] = rBCDMIN;             //分  

  135.     pucDateBuffer[5] = rBCDSEC;             //秒  

  136.     pucDateBuffer[6] = rBCDDAY;             //星期  

  137.       

  138.     //当秒为0时,重新读取  

  139.     if(pucDateBuffer[5]==0)  

  140.     {  

  141.        pucDateBuffer[0] = rBCDYEAR;         //年  

  142.        pucDateBuffer[1] = rBCDMON;          //月  

  143.        pucDateBuffer[2] = rBCDDATE;         //日    

  144.        pucDateBuffer[3] = rBCDHOUR;         //小时  

  145.        pucDateBuffer[4] = rBCDMIN;          //分  

  146.        pucDateBuffer[5] = rBCDSEC;          //秒  

  147.        pucDateBuffer[6] = rBCDDAY;          //星期  

  148.     }  

  149.       

  150.     rRTCCON &= ~(0x1) ;  

  151. }  

  152.   

  153.   

  154. /******************************************************************** 

  155. 函数功能:RTC测试。 

  156. 入口参数:无 

  157. 返    回:无。 

  158. 备    注:无。 

  159. ********************************************************************/  

  160. void RTCTest(void)   

  161. {  

  162. #if 0  

  163.     pucDateBuffer[0] = 0x12;        //==年  

  164.     pucDateBuffer[1] = 0x05;        //==月  

  165.     pucDateBuffer[2] = 0x03;        //==日  

  166.     pucDateBuffer[3] = 0x12;        //==时  

  167.     pucDateBuffer[4] = 0x28;        //==分  

  168.     pucDateBuffer[5] = 0x00;        //==秒  

  169.     pucDateBuffer[6] = 0x04;        //==星期  

  170.       

  171.     RTCSetDate() ;  

  172.     memset(pucDateBuffer, 0 ,7);  

  173. #endif  

  174.          

  175.     DbgPrintX( DBG_RTC_LEVEL, "RTC TIME Display " ) ;  

  176.   

  177. //  RTCGetDate();  

  178. //  memcpy(pucAlarmBuffer, pucDateBuffer, 6);  

  179.     pucAlarmBuffer[5] = 0x50;       //==每分钟的50秒报警  

  180.     RTCSetAlarm();  

  181.   

  182.     while(1)  

  183.     {  

  184.         RTCGetDate();  

  185.   

  186.         DbgPrintX( DBG_RTC_LEVEL,  " RTC time : %04x-%02x-%02x %02x:%02x:%02x",    

  187.             pucDateBuffer[0] + 0x2000,    

  188.             pucDateBuffer[1],    

  189.             pucDateBuffer[2],  

  190.             pucDateBuffer[4],   

  191.             pucDateBuffer[5],   

  192.             pucDateBuffer[6] );  

  193.   

  194.         mdelay(300) ;  

  195.     }  

  196. }  





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM-Linux移植之二