您现在的位置是:主页 > news > 网站开发p6/免费人脉推广

网站开发p6/免费人脉推广

admin2025/6/14 0:45:22news

简介网站开发p6,免费人脉推广,建设微信网站的流程图,如何制作网站首页RTC就是实时时钟(real time clock)。目前大部分32bit处理器都自带RTC模块,也有外接RTC模块的。一般外接的RTC都是通过I2C来访问。如果CPU本身自带RTC,那通过读取内部寄存器就能访问RTC模块。如果是外接的,还要写个I2C的驱动来访问外部RTC模块…

网站开发p6,免费人脉推广,建设微信网站的流程图,如何制作网站首页RTC就是实时时钟(real time clock)。目前大部分32bit处理器都自带RTC模块,也有外接RTC模块的。一般外接的RTC都是通过I2C来访问。如果CPU本身自带RTC,那通过读取内部寄存器就能访问RTC模块。如果是外接的,还要写个I2C的驱动来访问外部RTC模块…

      RTC就是实时时钟(real time clock)。目前大部分32bit处理器都自带RTC模块,也有外接RTC模块的。一般外接的RTC都是通过I2C来访问。如果CPU本身自带RTC,那通过读取内部寄存器就能访问RTC模块。如果是外接的,还要写个I2C的驱动来访问外部RTC模块。

(1)主要函数

      在WinCE6.0里面,RTC的驱动是在OAL里面实现的,文件名一般都叫rtc.c。在这个文件里面有3个重要的函数,只要实现了他们,RTC的驱动就完成了,函数如下:

BOOL OEMGetRealTime(LPSYSTEMTIME lpst) : 获得当前的时间

BOOL OEMSetRealTime(LPSYSTEMTIME lpst):   设置当前的时间

BOOL OEMSetAlarmTime(LPSYSTEMTIME lpst): 设置报警的时间

      上面三个函数的参数都是lpst,这里介绍一下:LPSYSTEMTIME实际上是一个指向SYSTEMTIME结构的指针,定义如下:

typedef struct _SYSTEMTIME {
      WORD wYear;
      WORD wMonth;
      WORD wDayOfWeek;
      WORD wDay;
      WORD wHour;
      WORD wMinute;
      WORD wSecond;
      WORD wMilliseconds;
} SYSTEMTIME;

(2)函数说明

      OEMGetRealTime(..)用来获得当前的时间。WinCE启动以后,默认情况下WinCE会每隔一段时间调用OEMGetRealTime(..)函数来获得系统的时间,这种方式被称为hardware mode。WinCE还有另一种获得系统时间的方法,被称为software mode,就是通过调用GetTickCount(..)函数跟踪系统的timetick的变化来累加时间。

      OEMSetRealTime(..)用来设置当前的时间。当WinCE启动以后,我们会在界面的右下角看到时间显示,我们可以直接在WinCE的界面里面设置时间,这个时候,系统就会调用OEMSetRealTime(..)把你设置的时间写到RTC模块里面。这里要提一下,我们都知道在OEMIoControl函数里面有一个case叫IOCTL_HAL_INIT_RTC,这个case用来在初始化的时候设置实时时钟的初始值,一般在这个case里面会调用OEMSetRealTime(..)函数。

      OEMSetAlarmTime(..)用来设置报警时间。实现这个函数,要看你的RTC模块是否具有报警功能。具备报警功能的RTC会允许你设置报警时间,当你设置了报警时间以后,RTC会比较你的报警时间和当前时间,一旦这两个时间相等了,就会产生中断。大致原理就是这样了。所以这个函数里面实际上就是实现设置一个报警时间,还有就是打开相应的RTC中断。当然在中断程序ISR中,要返回SYSINTR_RTC_ALARM。

(3)RTC问题实例

      目前在PXA的WIN MOBILE平台上的RTC出现一个BUG:设置好时间后,复位机器,时间恢复成芯片的默认值20000101了,因为没有保存。解决方法就是要在出现复位操作的时候用NANDFLASH记录下当前RTC参数,在开机时再将保存的RTC参数恢复到芯片中。

      原理如上所述,但在解决实际问题时有需要注意的地方。普通的复位操作在开机后,都被芯片识别成GPIO复位,但是这个操作偶尔会导致死机,为了避免出现此现象。在GPIO复位中添加了看门狗复位,以保证复位百分百成功。所以在开机流程中,要加上只有判别是看门狗复位时,才能恢复NAND数据。而对于正常的关机再开机流程,由于有电池或者电容保证关机后的时间记录,只需要在开机后读时间就行了。

      A,保存时间的操作

if((g_arsr_eb&XLLP_ARSR_GPR)    //检测到复位动作,就存储时间

      &&(g_pBSPArgs->eBootCFG.drvCfg[CFG_SHUT_DOWN] != 1))  //不是正常关机才保存并置看门狗复位
{                                                                                                      //否则不用
        SYSTEMTIME SysTime;
        EBOOT_SYSTEMTIME SaveTime;
        OEMGetRealTimeEboot(&SysTime);    //获得RTC当前时间

        SaveTime.wYear = SysTime.wYear;
        SaveTime.wMonth = SysTime.wMonth;
        SaveTime.wDayOfWeek = SysTime.wDayOfWeek;
        SaveTime.wDay = SysTime.wDay;
        SaveTime.wHour = SysTime.wHour;
        SaveTime.wMinute = SysTime.wMinute;
        SaveTime.wSecond = SysTime.wSecond;
        SaveTime.wMilliseconds = SysTime.wMilliseconds;    //转化时间格式

        g_pBSPArgs->tApRtc = SaveTime;             //EBOOT中记录AP的RTC
        StoreBSPCFG(g_pBSPArgs);                       //保存全局参数到NAND中

        g_pOST_eb->osmr3 = g_pOST_eb->oscr0+10;    //置看门狗复位,保证复位百分百成功

}

     B,开机后恢复时间的操作

if(g_arsr_eb&XLLP_ARSR_WDT)  //g_arsr_eb是复位原因寄存器。判断是看门狗复位就执行
{                                                 //否则的话,正常开机直接调用读RTC(因为RTC有供电)
        SYSTEMTIME SysTime;
        EBOOT_SYSTEMTIME GetTime;
        GetTime = g_pBSPArgs->tApRtc;                 //从NAND中取得记录时间

        SysTime.wYear = GetTime.wYear;
        SysTime.wMonth = GetTime.wMonth;
        SysTime.wDayOfWeek = GetTime.wDayOfWeek;
        SysTime.wDay = GetTime.wDay;
        SysTime.wHour = GetTime.wHour;
        SysTime.wMinute = GetTime.wMinute;
        SysTime.wSecond = GetTime.wSecond;
        SysTime.wMilliseconds = GetTime.wMilliseconds;           //转换时间格式

        OEMSetRealTimeEboot(&SysTime);       //恢复时间到RTC中
}

 

参考原文:http://blog.csdn.net/nanjianhui/archive/2008/01/29/2071792.aspx