【RTC读取】RTC时间的安全读取

方法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);

 

这样即可防止在读的过程中出现跨分、时、日、月、年等跳变时取得的数据不同步。

 

在计数器变化的时候去读取,该读取被判为无效,自动忽略。向寄存器写入范围外的数据和时间会导致不可预见的结果。

posted on 2022-10-04 01:31  bdy  阅读(92)  评论(0编辑  收藏  举报

导航