【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);

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

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值