网站导航: 首页 > 设计参考 > 正文 文章搜索
S3c44b0 RTC程序
 
文章编号:
090105131921
文章分类: 单片机 ARM
点 击:
...
关 键 词: S3c44b0,RTC
文章来源:
网络
摘 要:

RTC.H

 
  1. RTC.H   
  2.   
  3. /******************************************************************************/  
  4. /*  This file is part of the uVision/ARM development tools                    */  
  5. /*  Copyright KEIL ELEKTRONIK GmbH 2002-2004                                  */  
  6. /******************************************************************************/  
  7. /*                                                                            */  
  8. /*  RTC.H:  Header file for Real Time Clock (RTC)                             */  
  9. /*          Samsung S3C44B0X                                                  */  
  10. /*                                                                            */  
  11. /******************************************************************************/  
  12.   
  13. #ifndef __RTC_H   
  14. #define __RTC_H   
  15.   
  16.   
  17. #define RTC_BASE    0x01D70040  // Real Time Clock Base Address   
  18.   
  19.   
  20. // Real Time Clock Registers   
  21. typedef struct {   
  22.     reg8  RTCCON;     // RTC Control   
  23.     reg8  pad0[15];   
  24.     reg8  RTCALM;     // RTC Alarm   
  25.     reg8  pad1[3];   
  26.     reg8  ALMSEC;     // Alarm Second   
  27.     reg8  pad2[3];   
  28.     reg8  ALMMIN;     // Alarm Minute   
  29.     reg8  pad3[3];   
  30.     reg8  ALMHOUR;    // Alarm Hour   
  31.     reg8  pad4[3];   
  32.     reg8  ALMDAY;     // Alarm Day   
  33.     reg8  pad5[3];   
  34.     reg8  ALMMON;     // Alarm Month   
  35.     reg8  pad6[3];   
  36.     reg8  ALMYEAR;    // Alarm Year   
  37.     reg8  pad7[3];   
  38.     reg8  RTCRST;     // RTC Round Reset   
  39.     reg8  pad8[3];   
  40.     reg8  BCDSEC;     // BCD Second   
  41.     reg8  pad9[3];   
  42.     reg8  BCDMIN;     // BCD Minute   
  43.     reg8  padA[3];   
  44.     reg8  BCDHOUR;    // BCD Hour   
  45.     reg8  padB[3];   
  46.     reg8  BCDDAY;     // BCD Day   
  47.     reg8  padC[3];   
  48.     reg8  BCDDATE;    // BCD Date   
  49.     reg8  padD[3];   
  50.     reg8  BCDMON;     // BCD Month   
  51.     reg8  padE[3];   
  52.     reg8  BCDYEAR;    // BCD Year   
  53.     reg8  padF[3];   
  54.     reg8  TICINT;     // Tick Time Count   
  55.     reg8  padG[3];   
  56. } regRTC;   
  57.   
  58. #define pRTC ((regRTC *)RTC_BASE)   
  59.   
  60.   
  61. // RTCCON: RTC Control Register   
  62. #define RTCEN       0x00000001   
  63. #define CLKSEL      0x00000002   
  64. #define CNTSEL      0x00000004   
  65. #define CLKRST      0x00000008   
  66.   
  67. // RTCALM: RTC Alarm Register   
  68. #define SECEN       0x00000001   
  69. #define MINEN       0x00000002   
  70. #define HOUREN      0x00000004   
  71. #define DAYEN       0x00000008   
  72. #define MONREN      0x00000010   
  73. #define YEAREN      0x00000020   
  74. #define ALMEN       0x00000040   
  75.   
  76. // RTCRST: RTC Round Reset Register   
  77. #define SECCR_NONE  0x00000000   
  78. #define SECCR_30    0x00000003   
  79. #define SECCR_40    0x00000004   
  80. #define SECCR_50    0x00000005   
  81. #define SRSTEN      0x00000008   
  82. //*****************************************************   
  83. // TICNT: Tick Time Count Register   
  84. #define TICKINT_EN  0x00000080   
  85.   
  86.   
  87. #ifndef __RTC_STRUCT_   
  88. #define __RTC_STRUCT_   
  89. //*****************************************************   
  90. //定义时间数据结构   
  91. //*****************************************************   
  92. typedef struct {   
  93.     unsigned char Year; //采用BIN方法记录   
  94.     unsigned char Mon;   
  95.     unsigned char Day;   
  96.     unsigned char Hour;   
  97.     unsigned char Min;   
  98.     unsigned char Sec;   
  99.     unsigned char mS;   
  100.     unsigned char Week;   
  101. }RTC_TIMER;   
  102. //***************************************************************************   
  103. //周期中断tick 10ms中断1次   
  104. //***************************************************************************   
  105. typedef struct{   
  106.     unsigned int Tick;   
  107.     unsigned char Fl200ms;   
  108.     unsigned char Fl500ms;   
  109.     unsigned char Fl1000ms;   
  110.     unsigned char Divk[3];            //记录TICK对应3个标志的取摸系数   
  111. }RTC_TICK;   
  112. //*****************************************************   
  113. extern void RTC_Timer_Init(void);   
  114. extern void RTC_Read_Timer(RTC_TIMER * p);   
  115. extern void RTC_Write_Timer(RTC_TIMER *p);   
  116. extern void RTC_Alarm_Init(RTC_TIMER *p);   
  117. extern void RTC_Tick_Init (void);   
  118.   
  119. #endif   
  120.   
  121. #endif /* __RTC_H */   
  122.   
  123. #include "..\inc\44b.h"   
  124. #include "..\S3C44B0X_INC\S3C44B0X.H"   
  125. //*******************************************************************   
  126. RTC_TIMER     SysTimer;   
  127. regRTC         * const pRtc=pRTC;            //定义RCT的指针   
  128. //*****************************************************   
  129. //定义初始化时间BIN   
  130. //*****************************************************   
  131. RTC_TIMER DefTimer={   
  132.     6,    //2006 06 10 08:20:50:00 6(week)   
  133.         6,       
  134.         10,   
  135.         8,   
  136.         20,   
  137.         50,   
  138.         0,   
  139.         6,   
  140. };   
  141. //*******************************************************************   
  142. unsigned char BinToBCD (unsigned char i){   
  143.     unsigned char bcd;   
  144.        
  145.     bcd    =i/10;   
  146.     bcd |=i%10;   
  147.     return bcd;   
  148. }   
  149. //*******************************************************************   
  150. unsigned char BCDToBin (unsigned char bcd){   
  151.     unsigned char i;   
  152.        
  153.     i    =    10*(bcd & 0xf0);   
  154.     i   +=     bcd & 0x0f;   
  155.     return i;   
  156. }   
  157. //*******************************************************************   
  158. //时间BIN<===>BCD   
  159. //*******************************************************************   
  160. void Turn_Bin_BCD (RTC_TIMER *pS,RTC_TIMER *pT){   
  161.     pT->Year    = BinToBCD(pS->Year);  //2进制时间转化成BCD   
  162.     pT->Mon        = BinToBCD(pS->Mon);   
  163.     pT->Day        = BinToBCD(pS->Day);   
  164.     pT->Hour    = BinToBCD(pS->Hour);   
  165.     pT->Min        = BinToBCD(pS->Min);   
  166.     pT->Sec        = BinToBCD(pS->Sec);   
  167.     pT->Week    = BinToBCD(pS->Week);   
  168. }   
  169. //********************************************************************   
  170. //时间输入S3C44B0XRTC寄存器   
  171. //********************************************************************   
  172. void PutToRtc (RTC_TIMER *p){   
  173.     pRtc->BCDYEAR = p->Year;   
  174.     pRtc->BCDMON  = p->Mon;   
  175.     pRtc->BCDDAY  = p->Day;    // SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7   
  176.     pRtc->BCDDATE = p->Week;   
  177.     pRtc->BCDHOUR = p->Hour;   
  178.     pRtc->BCDMIN  = p->Min;   
  179.     pRtc->BCDSEC  = p->Sec;   
  180. }   
  181. //*********************************************************************   
  182. //S3C44B0X RTC 初始化   
  183. //*********************************************************************   
  184. void RTC_Timer_Init(void){   
  185.        
  186. /*    CLKRST      [3]        RTC 时钟计数复位   
  187. 0 = No reset, 1 = Reset   
  188. CNTSEL     [2]       BCD计数复位   
  189. 0 = Merge BCD counters   
  190. 1 = 保留 (Separate BCD counters)   
  191. CLKSEL      [1]      BCD 时钟选择   
  192. 0 = XTAL 1/2 15 divided clock  1Hz   
  193. 1 = Reserved (XTAL clock only for test)   
  194. RTCEN      [0]      RTC读写允许   
  195. 0 = Disable, 1 = Enable   
  196.     */   
  197.     RTC_TIMER timer;   
  198.     Turn_Bin_BCD (&timer,&DefTimer);   
  199.     pRtc->RTCCON |= 0x01;    // R/W enable, 1/32768, Normal(merge), No reset   
  200.     PutToRtc(&timer);   
  201.     pRtc->RTCCON &=~0x01;    //禁止R/W   
  202. }   
  203.   
  204. //*************************************************************************   
  205. //读取时间   
  206. //*************************************************************************   
  207. void RTC_Read_Timer(RTC_TIMER * p){   
  208.        
  209.     p->Year =BCDToBin( pRtc->BCDYEAR);   
  210.     p->Mon    =BCDToBin( pRtc->BCDMON);   
  211.     p->Day    =BCDToBin( pRtc->BCDDAY);   
  212.     p->Week    =BCDToBin( pRtc->BCDDATE);   
  213.     p->Hour    =BCDToBin( pRtc->BCDHOUR);   
  214.     p->Min    =BCDToBin( pRtc->BCDMIN);   
  215.     p->Sec    =BCDToBin( pRtc->BCDSEC);   
  216.        
  217. }   
  218. //**************************************************************************   
  219. //写时间   
  220. //**************************************************************************   
  221. void RTC_Write_Timer(RTC_TIMER *p){   
  222.        
  223.     RTC_TIMER timer;   
  224.     Turn_Bin_BCD (&timer,&SysTimer);   
  225.     pRtc->RTCCON |= 0x01;    // R/W enable, 1/32768, Normal(merge), No reset   
  226.     PutToRtc(&timer);   
  227.     pRtc->RTCCON &=~0x01;    //禁止R/W   
  228. }   
  229. //********************************************************************************   
  230. //定时处理中断   
  231. //********************************************************************************   
  232. void __irq RTC_ISP_Alarm(void){   
  233.     rI_ISPC=BIT_RTC;      
  234.     //rI_ISPC; //is needed only when cache=on & wrbuf=on & BSFRD=0   
  235.     //Uart_Printf("\nRTC Alarm Interrupt O.K.\n");   
  236.        
  237. }   
  238. //*********************************************************************************   
  239. RTC_TIMER SysAlarm;   
  240. //*********************************************************************************   
  241. //定时时间初始化   
  242. //*********************************************************************************   
  243. void RTC_Alarm_Init(RTC_TIMER *p){   
  244.     RTC_TIMER timer;   
  245.        
  246.     Turn_Bin_BCD (&timer,p);   
  247.        
  248.     pRtc->ALMYEAR=timer.Year;   
  249.     pRtc->ALMMON =timer.Mon;   
  250.     pRtc->ALMDAY =timer.Day;   
  251.     pRtc->ALMHOUR=timer.Hour;   
  252.     pRtc->ALMMIN =timer.Min;   
  253.     pRtc->ALMSEC =timer.Sec;   
  254.        
  255.     pISR_RTC=(unsigned)RTC_ISP_Alarm;   
  256.     //***********************************************************   
  257.     //全部允许报警   
  258.     //***********************************************************   
  259.     pRtc->RTCALM=0x7f;        //=1 打开 RTC ALARM CONTROL REGISTER (RTCALM)   
  260.     //***********************************************************   
  261.     rINTMSK=~(BIT_GLOBAL|BIT_RTC); //=0允许中断!   
  262. }   
  263. //*****************************************************************************   
  264. RTC_TICK     RtcTick;                    //定义数据   
  265. //*****************************************************************************   
  266. //中断处理涵数   
  267. //*****************************************************************************   
  268. void __irq RTC_ISP_Tick(void){   
  269.        
  270.     rI_ISPC=BIT_TICK;   
  271.        
  272.     RtcTick.Tick++;   
  273.        
  274.     if(RtcTick.Tick % RtcTick.Divk[0]==0 ){   
  275.         RtcTick.Fl200ms =    ~RtcTick.Fl200ms;   
  276.     }   
  277.        
  278.     if(RtcTick.Tick % RtcTick.Divk[1]==0 ){   
  279.         RtcTick.Fl500ms =    ~RtcTick.Fl500ms;   
  280.     }   
  281.        
  282.     if(RtcTick.Tick % RtcTick.Divk[2]==0 ){   
  283.         RtcTick.Fl1000ms =    ~RtcTick.Fl1000ms;   
  284.     }   
  285. }   
  286.   
  287. /****************************************************************************/   
  288. /*  TICNT 计算10MS的分频系数 CLK=32768Hz 计算:Divk[3]                        */  
  289. /*                                                                          */  
  290. /*  Period = ( n+1 ) / 128 second                                           */  
  291. /*  n : Tick time count value (1-127)                                       */  
  292. /*                                                                          */  
  293. /*    如果要10ms中断==》n=1; 7.8ms中断一次                                    */  
  294. /*    TICK INT ENABLE   [7]       时间滴答中断允许                          */  
  295. /*    0 = disable 1 = enable                                                */  
  296. /*    TICK TIME COUNT  [6:0]    时间滴答计数值. (1-127)                        */  
  297. /*    这个计数值内部递减, 用户不能读它的实时值                             */  
  298. /****************************************************************************/  
  299. void RTC_Tick_Init (void){   
  300.     pRtc->TICINT     = 0x11; //打开 n=1   
  301.     RtcTick.Divk[0]    = 2*13;    //k=200ms/(1000ms*(n+1)/128)   
  302.     RtcTick.Divk[1]    = 5*13;    //k=200ms/(1000ms*(n+1)/128)   
  303.     RtcTick.Divk[2]    = 10*13;//k=200ms/(1000ms*(n+1)/128)   
  304.     //***************************************************************   
  305.     //pISR_TICK    (*(unsigned *)(_ISR_STARTADDRESS+0x24))   
  306.     // _ISR_STARTADDRESS+0x24 等于 Rtc_Tick 涵数的地址!   
  307.     //***************************************************************   
  308.     pISR_TICK=(unsigned)RTC_ISP_Tick;//中断向量地址转化   
  309.     //*(unsigned *)(_ISR_STARTADDRESS+0x24)=(unsigned)Rtc_Tick;   
  310.     //***************************************************************   
  311.     rINTMSK=~(BIT_GLOBAL|BIT_TICK);   
  312. }   
  313.   

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4