您的位置 首页 被动

S3C2440 实时时钟RTC

实时时钟(RTC)单元可以在当系统电源关闭后通过备用电池工作。RTC可以通过使用STRBLDRBARM操作发送8位二-十进制交换码(BCD)值数据

实时时钟RTC)单元能够在当体系电源封闭后经过备用电池作业。RTC能够经过运用STRB/LDRB ARM操

作发送8位二-十进制交流码(BCD)值数据给CPU。这些数据包含年、月、日、星期、时、分和秒的时刻信息。
RTC 单元作业在外部32.768kHz晶振而且能够履行闹钟功用。

RTC操作比较简单,寄存器的设置在数据手册上写的很具体,就不写了,贴一个RTC代码,该程序参阅了天翔的RTC程序代码,主要是他写的比较好,都模块化了,我修改了他的代码,有闹钟(使用蜂鸣器),在TQ2440 板子上能运转,程序功用:串口每秒显现一次时刻而且LED1闪一次,在闹钟设置中,秒为20时,显现闹钟时刻并蜂鸣器发声几秒钟。

  1. #include”2440addr.h”
  2. #include”Option.h”
  3. #include”2440lib.h”
  4. #include”def.h”
  5. #defineLED1_ON(rGPBDAT&=~(1<<5))
  6. #defineLED1_OFF(rGPBDAT|=(1<<5))
  7. void__irqRTC_tickHandler(void);
  8. void__irqRTC_alarmHandler(void);
  9. U8alarmflag=0;
  10. typedefstructDate//界说一个表明日期时刻的结构体
  11. {U16year;
  12. U8month;
  13. U8day;
  14. U8week_day;
  15. U8hour;
  16. U8minute;
  17. U8second;
  18. }date;
  19. dateC_date;
  20. char*week_num[7]={“SUN”,”MON”,”TUES”,”WED”,”THURS”,”FRI”,”SAT”};//界说一个指针数组
  21. voidBeep_Freq_Set(U32freq)
  22. {
  23. rGPBCON&=~3;
  24. rGPBCON|=2;//设置GPB0为OUT0
  25. rGPBUP=0x0;//使能上拉
  26. rTCFG0&=~0xff;
  27. rTCFG0|=15;//预分频值为15
  28. rTCFG1&=~0x0f;
  29. rTCFG1|=0x02;//分频值为8
  30. rTCNTB0=(PCLK>>7)/freq;//设定定时器0计数缓冲器的值
  31. rTCMPB0=rTCNTB0>>1;//定时器0比较缓冲器的值,PWM输出占空比50%
  32. rTCON&=~0x1f;
  33. rTCON|=0xb;//主动重载,封闭变相,手动更新,敞开定时器0
  34. rTCON&=~2;//铲除手动更新位
  35. }
  36. voidBeep_Stop(void)
  37. {
  38. rGPBCON&=~3;//setGPB0asoutput
  39. rGPBCON|=1;
  40. rGPBDAT&=~1;//输出低电平
  41. }
  42. voiddelay(intx)
  43. {
  44. inti,j;
  45. for(i=0;i
  46. for(j=0;j<1000000;j++);
  47. }
  48. /********************************
  49. *
  50. *设置实时时钟日期、时刻
  51. *
  52. *********************************/
  53. voidRTC_setdate(date*p_date)
  54. {
  55. rRTCCON=0x01;//RTC读写使能,BCD时钟、计数器、无复位
  56. rBCDYEAR=p_date->year;
  57. rBCDMON=p_date->month;
  58. rBCDDATE=p_date->day;
  59. rBCDDAY=p_date->week_day;//设置日期时刻
  60. rBCDHOUR=p_date->hour;
  61. rBCDMIN=p_date->minute;
  62. rBCDSEC=p_date->second;
  63. rRTCCON=0x00;//RTC读写制止,BCD时钟、计数器、无复位
  64. }
  65. /********************************
  66. *
  67. *读取实时时钟日期、时刻
  68. *
  69. *********************************/
  70. voidRTC_getdate(date*p_date)
  71. {
  72. rRTCCON=0x01;//RTC读写使能,BCD时钟、计数器、无复位
  73. p_date->year=rBCDYEAR+0x2000;
  74. p_date->month=rBCDMON;
  75. p_date->day=rBCDDATE;
  76. p_date->week_day=rBCDDAY;//读取日期时刻
  77. p_date->hour=rBCDHOUR;
  78. p_date->minute=rBCDMIN;
  79. p_date->second=rBCDSEC;
  80. rRTCCON=0x00;//RTC读写制止,BCD时钟、计数器、无复位
  81. }
  82. /********************************
  83. *
  84. *TICK中止初始化
  85. *
  86. *********************************/
  87. voidRTC_tickIRQ_Init(U8tick)
  88. {
  89. ClearPending(BIT_TICK);//铲除标志位
  90. EnableIrq(BIT_TICK);//使能中止源
  91. pISR_TICK=(unsigned)RTC_tickHandler;//中止函数进口地址
  92. rRTCCON=0x00;
  93. rTICNT=(tick&0x7f)|0x80;//使能中止
  94. }
  95. /********************************
  96. *
  97. *设置闹钟日期、时刻及其闹钟唤醒形式
  98. *
  99. *********************************/
  100. voidRTC_alarm_setdate(date*p_date,U8mode)
  101. {
  102. rRTCCON=0x01;
  103. rALMYEAR=p_date->year;
  104. rALMMON=p_date->month;
  105. rALMDATE=p_date->day;
  106. rALMHOUR=p_date->hour;
  107. rALMMIN=p_date->minute;
  108. rALMSEC=p_date->second;
  109. rRTCALM=mode;//RTC闹钟操控寄存器
  110. rRTCCON=0x00;
  111. ClearPending(BIT_RTC);//铲除标志位
  112. EnableIrq(BIT_RTC);//openRTCalarmINTERRUPT
  113. pISR_RTC=(unsigned)RTC_alarmHandler;
  114. }
  115. voidMain(void)
  116. {
  117. SelectFclk(2);//设置体系时钟400M
  118. ChangeClockDivider(2,1);//设置分频1:4:8
  119. CalcBusClk();//核算总线频率
  120. rGPHCON&=~((3<<4)|(3<<6));
  121. rGPHCON|=(2<<4)|(2<<6);//GPH2--TXD[0];GPH3--RXD[0]
  122. rGPHUP=0x00;//使能上拉功用
  123. Uart_Init(0,115200);
  124. Uart_Select(0);
  125. rGPBCON&=~((3<<10)|(3<<12)|(3<<14)|(3<<16));//对GPBCON[10:17]清零
  126. rGPBCON|=((1<<10)|(1<<12)|(1<<14)|(1<<16));//设置GPB5~8为输出
  127. rGPBUP&=~((1<<5)|(1<<6)|(1<<7)|(1<<8));//设置GPB5~8的上拉功用
  128. rGPBDAT|=(1<<5)|(1<<6)|(1<<7)|(1<<8);//封闭LED
  129. Beep_Stop();//蜂鸣器中止发声,蜂鸣器用作闹钟声
  130. C_date.year=0x12;
  131. C_date.month=0x05;
  132. C_date.day=0x09;
  133. C_date.week_day=0x03;//设置当时日期时刻
  134. C_date.hour=0x12;
  135. C_date.minute=0x00;
  136. C_date.second=0x10;
  137. RTC_setdate(&C_date);
  138. C_date.second=0x20;
  139. RTC_alarm_setdate(&C_date,0x41);//0x41表明使能RTC闹钟,以及使能秒时钟闹钟
  140. RTC_tickIRQ_Init(127);//设置1秒钟tick一次
  141. Uart_Printf(“\n—实时时钟测验程序—\n”);
  142. while(Uart_GetKey()!=ESC_KEY)
  143. {
  144. LED1_OFF;
  145. RTC_getdate(&C_date);
  146. if(alarmflag)
  147. {
  148. alarmflag=0;
  149. Uart_Printf(“\nRTCALARM%02x:%02x:%02x\n”,C_date.hour,C_date.minute,C_date.second);
  150. Beep_Freq_Set(1000);
  151. delay(5);
  152. Beep_Stop();
  153. }
  154. }
  155. }
  156. /********************************
  157. *
  158. *TICK中止
  159. *
  160. *********************************/
  161. void__irqRTC_tickHandler(void)
  162. {
  163. ClearPending(BIT_TICK);
  164. LED1_ON;//改写LED1
  165. Delay(500);
  166. RTC_getdate(&C_date);
  167. Uart_Printf(“RTCTIME:%04x-%02x-%02x%s%02x:%02x:%02x\n”,C_date.year,C_date.month,C_date.day,week_num[C_date.week_day],C_date.hour,C_date.minute,C_date.second);
  168. }
  169. /********************************
  170. *
  171. *T%&&&&&%K中止
  172. *
  173. *********************************/
  174. void__irqRTC_alarmHandler(void)
  175. {
  176. alarmflag=1;
  177. ClearPending(BIT_RTC);
  178. }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/262830.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部