在實(shí)際應(yīng)用中,有時(shí)候英創(chuàng)工控主板自帶的時(shí)鐘精度不能滿足項(xiàng)目需求,客戶需要自行擴(kuò)展更高精度的時(shí)鐘,本文舉例介紹一種在英創(chuàng)工控主板(WinCE)上擴(kuò)展高精度時(shí)鐘的一個(gè)方案。
硬件參考
高精度實(shí)時(shí)鐘擴(kuò)展方案,采用RX8025T,它是一顆內(nèi)部集成了高精度32768Hz晶體,且?guī)囟妊a(bǔ)償?shù)臅r(shí)實(shí)鐘芯片,最高精度相當(dāng)于1個(gè)月誤差5秒。
RX8025T的應(yīng)用電路圖非常簡單,采用I2C總線與ESMARC工控主板連接,GPIO26是I2C_SDA,GPIO27是I2C_SCL, 基本應(yīng)用電路圖如下所示:
RX8025T時(shí)鐘芯片沒有獨(dú)立的后備電池供電端口,因此,在供電端,采用雙二極管對(duì)它供電:當(dāng)系統(tǒng)供電正常,3.3V電壓高于3V電池電壓,由系統(tǒng)電源供電;當(dāng)系統(tǒng)斷電后,無3.3V電壓,3V電池電壓高于3.3V供電端,轉(zhuǎn)為3V電池供電。
根據(jù)RX8025T的電流消耗參數(shù):3uA/DC3V,如果使用CR2032鈕扣電池,其電能容量約為220mAH,再按照0.7的耗電率(電池自放電及電能利用效率),理論上可以使用5萬小時(shí)左右。
為了方便客戶高效地將RX8025T集成到應(yīng)用系統(tǒng)中,英創(chuàng)公司基于EM928x平臺(tái),提供了對(duì)RX8025T的參考程序,主要有幾個(gè)函數(shù)以供用戶使用:
RTC初始化程序:
首先初始化I2C引腳,再判斷時(shí)針是否起振。
輸入:
Force 為1,則強(qiáng)制設(shè)置初始化時(shí)間
返回:
如時(shí)鐘已經(jīng)起振,則返回0
如時(shí)鐘沒有起振,則設(shè)置起振位并初始化時(shí)間為:2009-12-21 15:20:30 星期一,再返回1
BOOL RTC_Init( BOOL Force );
RTC 時(shí)間讀取:
輸出:
SYSTEMTIME 數(shù)據(jù)
返回:
設(shè)置成功 1
設(shè)置失敗 0
BOOL GetRTCTime ( SYSTEMTIME *RTCTime );
RTC時(shí)間設(shè)置:
輸出:
SYSTEMTIME 數(shù)據(jù)
返回:
設(shè)置成功 1
設(shè)置失敗 0
BOOL SetRTCTime ( SYSTEMTIME *RTCTime );
讀取高精度時(shí)鐘時(shí)間到系統(tǒng)中
SYSTEMTIME RTCTime;
RTC_Init(1);
GetRTCTime (&RTCTime);
SetLocalTime(&RTCTime);
設(shè)置系統(tǒng)時(shí)間后如何同步設(shè)置到高精度時(shí)鐘中
擴(kuò)展高精度時(shí)鐘后,通常希望在系統(tǒng)中設(shè)置時(shí)間時(shí),或是使用SetLocalTime等API函數(shù)設(shè)置時(shí)間時(shí)能同步的將時(shí)間設(shè)置到高精度時(shí)鐘中。可以利用API函數(shù)CeRunAppAtEvent偵聽設(shè)置時(shí)間的消息,然后在消息響應(yīng)函數(shù)中進(jìn)行高精度時(shí)鐘的時(shí)間設(shè)置。
通過CeRunAppAtEvent綁定啟動(dòng)相應(yīng)exe
#include "Notify.h"
#define EXE_PATH L"\\FlashDisk\\test.exe"
CeRunAppAtEvent(EXE_PATH, NOTIFICATION_EVENT_TIME_CHANGE);
通過CeRunAppAtEvent綁定觸發(fā)相應(yīng)的消息
以”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)
{
//處理消息,將系統(tǒng)時(shí)間寫入高精度時(shí)鐘中");
}
讀取系統(tǒng)時(shí)間,同時(shí)設(shè)置高精度時(shí)鐘
SYSTEMTIME systime;
GetLocalTime(&systime);
SetRTCTime (&systime);
文中提到的例程,可以通過聯(lián)系英創(chuàng)工程師獲得。
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6085瀏覽量
35225
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
評(píng)論