在实际应用中,有时候英创工控主板自带的时钟精度不能满足项目需求,客户需要自行扩展更高精度的时钟,本文举例介绍一种在英创工控主板(WinCE)上扩展高精度时钟的一个方案。
硬件参考
高精度实时钟扩展方案,采用RX8025T,它是一颗内部集成了高精度32768Hz晶体,且带温度补偿的时实钟芯片,最高精度相当于1个月误差5秒。
RX8025T的应用电路图非常简单,采用I2C总线与ESMARC工控主板连接,GPIO26是I2C_SDA,GPIO27是I2C_SCL, 基本应用电路图如下所示:
RX8025T时钟芯片没有独立的后备电池供电端口,因此,在供电端,采用双二极管对它供电:当系统供电正常,3.3V电压高于3V电池电压,由系统电源供电;当系统断电后,无3.3V电压,3V电池电压高于3.3V供电端,转为3V电池供电。
根据RX8025T的电流消耗参数:3uA/DC3V,如果使用CR2032钮扣电池,其电能容量约为220mAH,再按照0.7的耗电率(电池自放电及电能利用效率),理论上可以使用5万小时左右。
为了方便客户高效地将RX8025T集成到应用系统中,英创公司基于EM928x平台,提供了对RX8025T的参考程序,主要有几个函数以供用户使用:
RTC初始化程序:
首先初始化I2C引脚,再判断时针是否起振。
输入:
Force 为1,则强制设置初始化时间
返回:
如时钟已经起振,则返回0
如时钟没有起振,则设置起振位并初始化时间为:2009-12-21 15:20:30 星期一,再返回1
BOOL RTC_Init( BOOL Force );
RTC 时间读取:
输出:
SYSTEMTIME 数据
返回:
设置成功 1
设置失败 0
BOOL GetRTCTime ( SYSTEMTIME *RTCTime );
RTC时间设置:
输出:
SYSTEMTIME 数据
返回:
设置成功 1
设置失败 0
BOOL SetRTCTime ( SYSTEMTIME *RTCTime );
读取高精度时钟时间到系统中
SYSTEMTIME RTCTime;
RTC_Init(1);
GetRTCTime (&RTCTime);
SetLocalTime(&RTCTime);
设置系统时间后如何同步设置到高精度时钟中
扩展高精度时钟后,通常希望在系统中设置时间时,或是使用SetLocalTime等API函数设置时间时能同步的将时间设置到高精度时钟中。可以利用API函数CeRunAppAtEvent侦听设置时间的消息,然后在消息响应函数中进行高精度时钟的时间设置。
通过CeRunAppAtEvent绑定启动相应exe
#include "Notify.h"
#define EXE_PATH L"\\FlashDisk\\test.exe"
CeRunAppAtEvent(EXE_PATH, NOTIFICATION_EVENT_TIME_CHANGE);
通过CeRunAppAtEvent绑定触发相应的消息
以”MyEvent”命名事件为例。
#include "Notify.h"
m_hEvent = CreateEvent(NULL, FALSE, FALSE, L"MyEvent");
CeRunAppAtEvent(L"\\\\.\\Notifications\\NamedEvents\\MyEvent", NOTIFICATION_EVENT_TIME_CHANGE);
//在线程中等待MyEvent事件
DWORD dwRet;
dwRet = WaitForSingleObject(m_hEvent, 500);
if (dwRet == 0)
{
//处理消息,将系统时间写入高精度时钟中");
}
读取系统时间,同时设置高精度时钟
SYSTEMTIME systime;
GetLocalTime(&systime);
SetRTCTime (&systime);
文中提到的例程,可以通过联系英创工程师获得。
全部0条评论
快来发表一下你的评论吧 !