色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 深入理解ARM體系架構(gòu)(S3C6410)---rtc實例

          深入理解ARM體系架構(gòu)(S3C6410)---rtc實例

          作者: 時間:2016-11-09 來源:網(wǎng)絡 收藏
          實時時鐘(RTC)的主要功能是在系統(tǒng)掉電的情況下,利用后備電源使時鐘繼續(xù)運行,從而不會丟失時間信息。s3c6410內(nèi)部集成了RTC模塊,其內(nèi)部的寄存器BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON和BCDYEAR分別存儲了當前的秒,分,小時,星期,日,月和年,表示時間的數(shù)值都是BCD碼。

          S2C6410中的閏年問題:

          本文引用地址:http://cafeforensic.com/article/201611/317831.htm

          閏年產(chǎn)生器基于BCDDAY,BCDMOD,BCDYEAR從而能決定每月最后的日期是28,29,30,還是31。一個8位的計數(shù)器只能表示2個BCD數(shù)據(jù),因此不能判斷“00”結(jié)尾的年份是不是閏年。例如它不能判斷1900和2000是不是閏年。為了解決這個問題,S3C6410中有一硬件邏輯來支持2000的閏年問題。因此S3C6410支持1901到2099年的范圍。


          讀寫操作:

          在讀BCD寄存器時,RTCCON寄存器0位必須至1,為了顯示秒,分,小時,日,月,年,cpu必須從其對應的寄存器中取值(BCDSEC, BCDMIN, BCDHOUR,BCDDATE, BCDDAY, BCDMON, BCDYEAR)。多寄存器同時讀取可能會產(chǎn)生1秒誤差。例如用戶從BCDMIN到BCDYEAR都進行了讀,得到的結(jié)果為2059年12月31日23時59分,當讀取這個結(jié)果時BCDSEC的數(shù)值在1~59之間,讀到的2059年12月31日23時59分是沒有問題的,但是當讀取這個結(jié)果時BCDSEC的值為0,實際結(jié)果可能是2059年12月31日23時59分也可能是2060年1月1日0時0分。所以此時應重讀這些寄存器,從而得到正確的數(shù)值。


          后備電源操作:

          實時時鐘邏輯能被后備電源驅(qū)動,通過RTCVDD向RTC模塊供電。當系統(tǒng)關閉時,cpu和RTC接口是封閉的,這時后備電源只驅(qū)動振蕩電路和BCD計數(shù)器,從而把功耗降到最低。


          邏輯圖:

          接口:

          以下程序完成了時間設置獲取,在lcd上顯示功能,

          源碼如下

          頭文件:

          [cpp]view plaincopyprint?
          1. //RTC
          2. #defineRTC_BASE(0x7E005040)
          3. #definerRTCCON(*(volatileunsigned*)RTC_BASE)
          4. #definerTICNT(*(volatileunsigned*)(RTC_BASE+0x4))
          5. #definerRTCALM(*(volatileunsigned*)(RTC_BASE+0x10))
          6. #definerALMSEC(*(volatileunsigned*)(RTC_BASE+0x14))
          7. #definerALMMIN(*(volatileunsigned*)(RTC_BASE+0x18))
          8. #definerALMHOUR(*(volatileunsigned*)(RTC_BASE+0x1c))
          9. #definerALMDATE(*(volatileunsigned*)(RTC_BASE+0x20))
          10. #definerALMMON(*(volatileunsigned*)(RTC_BASE+0x24))
          11. #definerALMYEAR(*(volatileunsigned*)(RTC_BASE+0x28))
          12. #definerBCDSEC(*(volatileunsigned*)(RTC_BASE+0x30))
          13. #definerBCDMIN(*(volatileunsigned*)(RTC_BASE+0x34))
          14. #definerBCDHOUR(*(volatileunsigned*)(RTC_BASE+0x38))
          15. #definerBCDDATE(*(volatileunsigned*)(RTC_BASE+0x3c))
          16. #definerBCDDAY(*(volatileunsigned*)(RTC_BASE+0x40))
          17. #definerBCDMON(*(volatileunsigned*)(RTC_BASE+0x44))
          18. #definerBCDYEAR(*(volatileunsigned*)(RTC_BASE+0x48))
          19. #definerCURTICNT(*(volatileunsigned*)(RTC_BASE+0x50))
          20. #definerINTP(*(volatileunsigned*)(RTC_BASE-0x10))

          初始化rtc:

          [cpp]view plaincopyprint?
          1. voidinit_rtc()
          2. {
          3. rRTCCON=0x85;
          4. }

          設置實時數(shù)據(jù):

          [cpp]view plaincopyprint?
          1. voidset_rtc()
          2. {
          3. //2012,04.14.13,06
          4. rRTCCON|=0x01;
          5. rBCDSEC=5*16+1;
          6. rBCDMIN=6;
          7. rBCDHOUR=1*16+3;
          8. rBCDDATE=1*16+4;
          9. rBCDMON=4;
          10. rBCDYEAR=1*16+2;
          11. rRTCCON&=~(0x01);
          12. }

          獲取實時數(shù)據(jù):

          [cpp]view plaincopyprint?
          1. voidget_rtc(unsignedcharrtc_data[6])
          2. {
          3. rRTCCON|=0x01;
          4. rtc_data[0]=rBCDSEC;
          5. rtc_data[1]=rBCDMIN;
          6. rtc_data[2]=rBCDHOUR;
          7. rtc_data[3]=rBCDDATE;
          8. rtc_data[4]=rBCDMON;
          9. rtc_data[5]=rBCDYEAR;
          10. rRTCCON&=~(0x01);
          11. if(rtc_data[0]==0)
          12. {
          13. rRTCCON|=0x01;
          14. rtc_data[0]=rBCDSEC;
          15. rtc_data[1]=rBCDMIN;
          16. rtc_data[2]=rBCDHOUR;
          17. rtc_data[3]=rBCDDATE;
          18. rtc_data[4]=rBCDMON;
          19. rtc_data[5]=rBCDYEAR;
          20. rRTCCON&=~(0x01);
          21. }
          22. }



          mian:

          [cpp]view plaincopyprint?
          1. init_rtc();
          2. LCD_Init();
          3. Paint_background(0xffffff,0,0,480,272);
          4. set_rtc();
          5. while(1)
          6. {
          7. get_rtc(tmp_rtc);
          8. rtc_data_tmp[13]=tmp_rtc[0];
          9. rtc_data_tmp[12]=tmp_rtc[0]/16;
          10. rtc_data_tmp[11]=tmp_rtc[1];
          11. rtc_data_tmp[10]=tmp_rtc[1]/16;
          12. rtc_data_tmp[9]=tmp_rtc[2];
          13. rtc_data_tmp[8]=tmp_rtc[2]/16;
          14. rtc_data_tmp[7]=tmp_rtc[3];
          15. rtc_data_tmp[6]=tmp_rtc[3]/16;
          16. rtc_data_tmp[5]=tmp_rtc[4];
          17. rtc_data_tmp[4]=tmp_rtc[4]/16;
          18. rtc_data_tmp[3]=tmp_rtc[5];
          19. rtc_data_tmp[2]=tmp_rtc[5]/16;
          20. rtc_data_tmp[1]=tmp_rtc[6];
          21. rtc_data_tmp[0]=tmp_rtc[6]/16;
          22. for(jj=0;jj<14;jj++)
          23. {
          24. Paint_text(124+8*jj,20,0x0,charnum[rtc_data_tmp[jj]],8,16);
          25. }
          26. delay_rtc();
          27. }



          關鍵詞: ARMS3C6410)rtc實

          評論


          技術專區(qū)

          關閉