新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > RTC時間的安全讀取

        RTC時間的安全讀取

        作者: 時間:2016-11-25 來源:網絡 收藏
        方法1:
        (缺點): for(;RTCCTL01&RTCRDY;) _NOP() ; // 等待RTC有效
        這一步最長可能需要等上一秒鐘,對實時操作十分不利。
        單要這一步: for(;!(RTCCTL01&RTCRDY);) _NOP() ; 雖然可以避免 RTCRDY復位的時候去讀取,但是不能避免讀取的還未完成,就遇到RTCRDY 復位的可能。
        //
        // //
        // 讀取RTC時鐘 方法1 //
        // //
        //
        unsigned long GetTime(void)
        {
        int hour,minute,second ;
        unsigned long time ;
        for(;RTCCTL01&RTCRDY;) _NOP() ; // 等待RTC有效
        for(;!(RTCCTL01&RTCRDY);) _NOP() ;
        hour = GetRTCHOUR() ;
        minute = GetRTCMIN() ;
        second = GetRTCSEC() ;
        time = (unsigned long)hour*1000000
        +(unsigned long)minute*1000
        +(unsigned long)second ;
        return time ;
        }
        方法2:
        讀取時鐘 方法2 缺點:
        (數據體結構pTime->wYear )
        讀取RTC寄存器或者相關RTC芯片的絕妙方法
        do
        {
        seconds = FROM_BCD(pRTCReg->BCDSEC & 0x7f);
        pTime->wYear = FROM_BCD((pRTCReg->BCDYEAR & 0xff)) + RTC_YEAR_DATUM;
        pTime->wMonth = FROM_BCD(pRTCReg->BCDMON & 0x1f);
        pTime->wDay = FROM_BCD(pRTCReg->BCDDATE & 0x3f);
        pTime->wDayOfWeek = pRTCReg->BCDDAY - 1;
        pTime->wHour = FROM_BCD(pRTCReg->BCDHOUR & 0x3f);
        pTime->wMinute = FROM_BCD(pRTCReg->BCDMIN & 0x7f);
        pTime->wSecond = FROM_BCD(pRTCReg->BCDSEC & 0x7f);
        pTime->wMilliseconds= 0;
        } while (pTime->wSecond != seconds);
        這樣即可防止在讀的過程中出現跨分、時、日、月、年等跳變時取得的數據不同步。
        在計數器變化的時候去讀取,該讀取被判為無效,自動忽略。向寄存器寫入范圍外的數據和時間會導致不可預見的結果。


        關鍵詞: RTC時間安全讀

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 电白县| 本溪| 海盐县| 宕昌县| 健康| 贡嘎县| 南宁市| 台中县| 许昌市| 米脂县| 通辽市| 株洲市| 遵化市| 土默特右旗| 乡城县| 泊头市| 靖边县| 玉龙| 邻水| 大新县| 内黄县| 汝阳县| 乡宁县| 越西县| 浮梁县| 内丘县| 金沙县| 崇礼县| 汉寿县| 新竹县| 陕西省| 遂川县| 临西县| 诏安县| 松潘县| 保定市| 建平县| 修武县| 惠安县| 沂源县| 崇明县|