嵌入式微系统
上QQ阅读APP看书,第一时间看更新

1.3.7 计时时钟

计时时钟是基于系统节拍模拟的一个计时用时钟,用于记录系统工作的时间,如天、时、分、秒。这个功能是模拟的,跟专用带独立电池的32.768 kHz晶体的RTC时钟有些差异:

1)系统重启后,时间归零,适合于常规的只需要知道当前工作了多久的系统;

2)因为从系统时钟分频而来,精度没有专用的时钟高。

计时时钟的数据结构如下。

代码清单1-22:RTC时钟结构体

typedef struct
{
    Byte Second;                                // 
    Byte Minute;                                // 
    Byte Hour;                                  // 
    ushort Day;                                 // 
} RtcStruct;
RtcStruct idata Rtc;                            // 定义Rtc实体

计时时钟的系统节拍例行处理函数如下。

代码清单1-23:RTC系统节拍例行代码

void RtcSystickRoutine(void) 
{
    static Byte idata Counter = 0;
    if (++Counter == 100)
    {
        Counter = 0;
        if (Rtc.Second < 59)                        // 累进到分
            Rtc.Second++;
        else
        {
            Rtc.Second = 0;
            if(Rtc.Minute < 59)                     // 累进到时
                Rtc.Minute++;
            else
            {
                Rtc.Minute = 0;
                if(Rtc.Hour < 23)                   // 累进到天
                    Rtc.Hour++;
                else
                {
                    Rtc.Hour = 0;
                    Rtc.Day++;
                } 
            }
        }
    }
}

需要注意的是,时钟累进在节拍中断中进行,而RTC是一个结构体,成员累进不是原子操作,读取数据的时候,需要进入临界态保护,防止出现进位采样错误。比如当前时分秒为0:59:59,若从Second开始读取,假如在读Minute的时候数据进位了,则变成了1:0:59,或者是1:59:59,这种叫进位错误。此时有一个办法,就是先锁定进入临界态保护,时钟就不会累进。结构体类的读取,往往会有这类问题。