首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

S3C2440 Windows CE的RTC模块驱动设计与实现(3)

S3C2440 Windows CE的RTC模块驱动设计与实现(3)

 3.2、时钟函数  实现RTC功能需要编写3个函数,分别是OEMGetRealTime()、OEMSetRealTime()与OEMSetAlarmTime()。下面对于这三个函数分别介绍。
  OEMGetRealTime()得到当前时间。此函数名不可更改,是WinCE内核规定好了的,也就是当内核需要知道当前时间的时候直接调用此函数。图3为函数OEMGetRealTime()执行流程。


  由于RTC不能任意地修改,不然会造成时间的混乱,所以每次获取时间或者设置时间完毕以后必须禁止RTC,具体是通过设置RTC使能/禁止寄存器实现的。而在每次读取时间或者设置时间的时候必须先使用它。在读取时间的时候若读取的“秒”为0必须重新读取时间,因此时的“分”已经被进位了。
  OEMSetRealTime()设置时间。与OEMGetRealTime()一样,它也不可改名,通过此函数核心可以直接修改时间。也就是说,如果用户点击WinCE任务栏中的时间以后,修改时间最终都是调用此函数。
  OEMSetAlarmTime()设置系统报警时间,其参数为指向含有SYSTEMTIME结构体缓冲区的长指针。如果此函数执行成功则返回TRUE,执行失败则返回FALSE。此函数必须是可重人的以防止对硬件的多次操作。对于一般用户的操作,用户可以不用编写此函数。如果需要系统在特定的时间完成特定的功能就需要完成此函数的编写。
  下面给出OEMGetRealTime()的源代码仅供参考。
  OEMGetRealTime(LPSYSTEMTIMElpst)
  {
  volatileRTCreg*s2440RTC;
  s2440RTC=(RTCreg*)RTC_BASE;
  //RETAILMSG(1,(_T("OEMGetRealTime")));
  //使能RTC
  s2440RTC->rRTCCON=0x1;
  lpst->wMilliseconds=0;
  lpst->wSecond=FROM_BCD(s2440RTC->rBCDSEC&0x7f);
  lpst->wMinute=FROM_BCD(s2440RTC->rBCDMIN&0x7f);
  lpst->wHour=FROM_BCD(s2440RTC->rBCDHOUR&0x3f);
  lpst->wDayOfWeek=(s2440RTC->rBCDDATE-1);
  lpst->wDay=FROM_BCD(s2440RTC->rBCDDAY&0x3f);
  lpst->wMonth=FROM_BCD(s2440RTC->rBCDMON&0x1f);
  //lpst->wYear=(2000+s2440RTC->rBCDYEAR);
  lpst->wYear=FROM_BCD(s2440RTC->rBCDYEAR)+2000;
  if(lpst->wSecond==0)
  {
  lpst->wSecond=FROM_BCD(s2440RTC->rBCDSEC&0x7f);
  lpst->wMinute=FROM_BCD(s2440RTC->rBCDMIN&0x7f);
  lpst->wHour=FROM_BCD(s2440RTC->rBCDHOUR&0x3f);
  lpst->wDayOfWeek=(s2440RTC->rBCDDATE-1);
  lpst->wDay=FROM_BCD(s2440RTC->rBCDDAY&0x3f);
  lpst->wMonth=FROM_BCD(s240RTC->rBCDMON&0x1f);
  lpst->wYear=(2000+s240RTC->rBCDYEAR);
  }
  //禁止RTC
  s2440RTC->rRTCCON=0;
  returnTRUE;
  }
继承事业,薪火相传
返回列表