您现在的位置是:主页 > news > 网站开发p6/免费人脉推广
网站开发p6/免费人脉推广
admin2025/6/14 0:45:22【news】
简介网站开发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