mini2440硬件篇之rtc-u球体育app下载

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

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.  * u球体育app下载 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.  * u球体育app下载 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 : x-x-x x:x:x",    

  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. }  





『本文转载自网络,u球体育app下载的版权归原作者所有,如有侵权请联系删除』

热门文章 更多
stm32cubemx新建工程 基本io配置过程
网站地图