新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S3C2440 實時時鐘RTC

        S3C2440 實時時鐘RTC

        作者: 時間:2016-11-21 來源:網絡 收藏
        實時時鐘RTC)單元可以在當系統電源關閉后通過備用電池工作。RTC可以通過使用STRB/LDRB ARM操

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

        本文引用地址:http://www.104case.com/article/201611/319202.htm

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




        關鍵詞: S3C2440實時時鐘RT

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 古浪县| 军事| 武陟县| 荆州市| 阿巴嘎旗| 桐乡市| 阳信县| 黑龙江省| 民乐县| 正镶白旗| 新宾| 三门县| 蒙阴县| 襄汾县| 浮梁县| 武穴市| 桂林市| 章丘市| 淮阳县| 保靖县| 卫辉市| 荆州市| 杭锦旗| 岫岩| 佛冈县| 全椒县| 客服| 桂阳县| 和龙市| 明水县| 崇文区| 上饶县| 库车县| 沙洋县| 都兰县| 侯马市| 温州市| 巴中市| 新乡县| 泸州市| 石屏县|