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);
这样即可防止在读的过程中出现跨分、时、日、月、年等跳变时取得的数据不同步。
在计数器变化的时候去读取,该读取被判为无效,自动忽略。向寄存器写入范围外的数据和时间会导致不可预见的结果。
评论