新聞中心

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

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

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

        S2C6410中的閏年問題:

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

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


        讀寫操作:

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


        后備電源操作:

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


        邏輯圖:

        接口:

        以下程序完成了時間設置獲取,在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. }

        設置實時數據:

        [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. }

        獲取實時數據:

        [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實

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 彩票| 南阳市| 瓮安县| 灵寿县| 区。| 兴义市| 宣城市| 鲜城| 高安市| 宣汉县| 大兴区| 无锡市| 西青区| 门头沟区| 凤阳县| 海宁市| 烟台市| 万载县| 白城市| 民和| 化隆| 宣汉县| 万源市| 凤凰县| 曲阜市| 开化县| 特克斯县| 榆社县| 子洲县| 萍乡市| 东阳市| 合阳县| 锡林浩特市| 信阳市| 玛纳斯县| 丰镇市| 驻马店市| 长武县| 安平县| 敦化市| 山西省|