办法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);
这样即可避免在读的过程中呈现跨分、时、日、月、年等跳变时获得的数据不同步。
在计数器改变的时分去读取,该读取被判为无效,主动疏忽。向寄存器写入规模外的数据和时刻会导致不行预见的成果。