新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > S3C2440 實(shí)時(shí)時(shí)鐘RTC

S3C2440 實(shí)時(shí)時(shí)鐘RTC

作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
實(shí)時(shí)時(shí)鐘RTC)單元可以在當(dāng)系統(tǒng)電源關(guān)閉后通過(guò)備用電池工作。RTC可以通過(guò)使用STRB/LDRB ARM操

作發(fā)送8位二-十進(jìn)制交換碼(BCD)值數(shù)據(jù)給CPU。這些數(shù)據(jù)包括年、月、日、星期、時(shí)、分和秒的時(shí)間信息。
RTC 單元工作在外部32.768kHz晶振并且可以執(zhí)行鬧鐘功能。

本文引用地址:http://butianyuan.cn/article/201611/319202.htm

RTC操作比較簡(jiǎn)單,寄存器的設(shè)置在數(shù)據(jù)手冊(cè)上寫(xiě)的很詳細(xì),就不寫(xiě)了,貼一個(gè)RTC代碼,該程序參考了天翔的RTC程序代碼,主要是他寫(xiě)的比較好,都模塊化了,我修改了他的代碼,有鬧鐘(利用蜂鳴器),在TQ2440 板子上能運(yùn)行,程序功能:串口每秒顯示一次時(shí)間并且LED1閃一次,在鬧鐘設(shè)置中,秒為20時(shí),顯示鬧鐘時(shí)間并蜂鳴器發(fā)聲幾秒鐘。

  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//定義一個(gè)表示日期時(shí)間的結(jié)構(gòu)體
  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"};//定義一個(gè)指針數(shù)組
  21. voidBeep_Freq_Set(U32freq)
  22. {
  23. rGPBCON&=~3;
  24. rGPBCON|=2;//設(shè)置GPB0為OUT0
  25. rGPBUP=0x0;//使能上拉
  26. rTCFG0&=~0xff;
  27. rTCFG0|=15;//預(yù)分頻值為15
  28. rTCFG1&=~0x0f;
  29. rTCFG1|=0x02;//分頻值為8
  30. rTCNTB0=(PCLK>>7)/freq;//設(shè)定定時(shí)器0計(jì)數(shù)緩沖器的值
  31. rTCMPB0=rTCNTB0>>1;//定時(shí)器0比較緩沖器的值,PWM輸出占空比50%
  32. rTCON&=~0x1f;
  33. rTCON|=0xb;//自動(dòng)重載,關(guān)閉變相,手動(dòng)更新,開(kāi)啟定時(shí)器0
  34. rTCON&=~2;//清除手動(dòng)更新位
  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. *設(shè)置實(shí)時(shí)時(shí)鐘日期、時(shí)間
  51. *
  52. *********************************/
  53. voidRTC_setdate(date*p_date)
  54. {
  55. rRTCCON=0x01;//RTC讀寫(xiě)使能,BCD時(shí)鐘、計(jì)數(shù)器、無(wú)復(fù)位
  56. rBCDYEAR=p_date->year;
  57. rBCDMON=p_date->month;
  58. rBCDDATE=p_date->day;
  59. rBCDDAY=p_date->week_day;//設(shè)置日期時(shí)間
  60. rBCDHOUR=p_date->hour;
  61. rBCDMIN=p_date->minute;
  62. rBCDSEC=p_date->second;
  63. rRTCCON=0x00;//RTC讀寫(xiě)禁止,BCD時(shí)鐘、計(jì)數(shù)器、無(wú)復(fù)位
  64. }
  65. /********************************
  66. *
  67. *讀取實(shí)時(shí)時(shí)鐘日期、時(shí)間
  68. *
  69. *********************************/
  70. voidRTC_getdate(date*p_date)
  71. {
  72. rRTCCON=0x01;//RTC讀寫(xiě)使能,BCD時(shí)鐘、計(jì)數(shù)器、無(wú)復(fù)位
  73. p_date->year=rBCDYEAR+0x2000;
  74. p_date->month=rBCDMON;
  75. p_date->day=rBCDDATE;
  76. p_date->week_day=rBCDDAY;//讀取日期時(shí)間
  77. p_date->hour=rBCDHOUR;
  78. p_date->minute=rBCDMIN;
  79. p_date->second=rBCDSEC;
  80. rRTCCON=0x00;//RTC讀寫(xiě)禁止,BCD時(shí)鐘、計(jì)數(shù)器、無(wú)復(fù)位
  81. }
  82. /********************************
  83. *
  84. *TICK中斷初始化
  85. *
  86. *********************************/
  87. voidRTC_tickIRQ_Init(U8tick)
  88. {
  89. ClearPending(BIT_TICK);//清除標(biāo)志位
  90. EnableIrq(BIT_TICK);//使能中斷源
  91. pISR_TICK=(unsigned)RTC_tickHandler;//中斷函數(shù)入口地址
  92. rRTCCON=0x00;
  93. rTICNT=(tick&0x7f)|0x80;//使能中斷
  94. }
  95. /********************************
  96. *
  97. *設(shè)置鬧鐘日期、時(shí)間及其鬧鐘喚醒模式
  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);//清除標(biāo)志位
  112. EnableIrq(BIT_RTC);//openRTCalarmINTERRUPT
  113. pISR_RTC=(unsigned)RTC_alarmHandler;
  114. }
  115. voidMain(void)
  116. {
  117. SelectFclk(2);//設(shè)置系統(tǒng)時(shí)鐘400M
  118. ChangeClockDivider(2,1);//設(shè)置分頻1:4:8
  119. CalcBusClk();//計(jì)算總線(xiàn)頻率
  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));//對(duì)GPBCON[10:17]清零
  126. rGPBCON|=((1<<10)|(1<<12)|(1<<14)|(1<<16));//設(shè)置GPB5~8為輸出
  127. rGPBUP&=~((1<<5)|(1<<6)|(1<<7)|(1<<8));//設(shè)置GPB5~8的上拉功能
  128. rGPBDAT|=(1<<5)|(1<<6)|(1<<7)|(1<<8);//關(guān)閉LED
  129. Beep_Stop();//蜂鳴器停止發(fā)聲,蜂鳴器用作鬧鐘聲
  130. C_date.year=0x12;
  131. C_date.month=0x05;
  132. C_date.day=0x09;
  133. C_date.week_day=0x03;//設(shè)置當(dāng)前日期時(shí)間
  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鬧鐘,以及使能秒時(shí)鐘鬧鐘
  140. RTC_tickIRQ_Init(127);//設(shè)置1秒鐘tick一次
  141. Uart_Printf("n---實(shí)時(shí)時(shí)鐘測(cè)試程序---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:%02xn",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:%02xn",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. *TICK中斷
  172. *
  173. *********************************/
  174. void__irqRTC_alarmHandler(void)
  175. {
  176. alarmflag=1;
  177. ClearPending(BIT_RTC);
  178. }




評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉