袁霞+蒲實(shí)



摘要:以運(yùn)行Windows CE7.0操作系統(tǒng)的AM3359主板為開發(fā)平臺,介紹了AM3359處理器、Windows CE7.0系統(tǒng)架構(gòu)和硬件接口電路,詳細(xì)闡述了在嵌入式平臺WinCE7.0操作系統(tǒng)中DS1388芯片驅(qū)動程序設(shè)計原理和實(shí)現(xiàn)過程。該軟件已應(yīng)用在某縫制終端系列設(shè)備中,為系統(tǒng)提供精準(zhǔn)的實(shí)時時鐘功能。
關(guān)鍵詞:AM3359處理器;WinCE7.0;RTC時鐘;DS1388芯片
中圖分類號:TP319
文獻(xiàn)標(biāo)識碼:A
文章編號:16727800(2017)004013504
0引言
當(dāng)AM3359處理器自帶RTC時鐘不能滿足用戶更高要求,或因PMIC輸出電壓不正常導(dǎo)致RTC功能受到影響時,需要在PCB布局中添加單獨(dú)的RTC芯片DS1388,直接由電池供電,以保證系統(tǒng)能正確設(shè)置、保存、獲取實(shí)時時間,掉電不消失。對于外接DS1388芯片,AM3359處理器BSP包中自帶的RTC驅(qū)動程序不能實(shí)現(xiàn)DS1388芯片的實(shí)時時鐘功能,需對RTC時鐘驅(qū)動重新編寫,完成芯片寄存器配置、實(shí)時時鐘讀寫以及初始化功能。
1平臺介紹
1.1AM3359處理器
AM3359是TI(德州儀器)基于 ARM Cortex-A8內(nèi)核的32位 RISC微處理器,支持主頻275-MHz、500-MHz、600-MHz和 720-MHz,因其價格便宜,支持操作系統(tǒng)齊全等特性,在工業(yè)控制、醫(yī)療電子、數(shù)控、汽車電子等行業(yè)的環(huán)境惡劣場合中廣泛應(yīng)用[1],功能框架如圖1所示。
1.2WinCE7.0操作系統(tǒng)
Windows Embedded Compact 7簡稱WinCE7.0,是一種安全可靠的實(shí)時高性能嵌入式操作系統(tǒng),其將最新的網(wǎng)絡(luò)、多媒體和通信技術(shù)封裝于小型設(shè)備中,具有搶占式多任務(wù)執(zhí)行特性和強(qiáng)大的通訊能力。WinCE7擁有Windows 7特點(diǎn),支持虛擬內(nèi)存機(jī)制,按需分配內(nèi)存和內(nèi)存映射文件,專門為信息設(shè)備、移動計算、消費(fèi)類電子產(chǎn)品和嵌入式應(yīng)用等非PC領(lǐng)域而設(shè)計,為不同的應(yīng)用和設(shè)備提供強(qiáng)大的可定制功能。WinCE7作為微軟最新一代Windows CE操作系統(tǒng),提供了新的功能和特性,適用于更為廣泛的設(shè)備類別和應(yīng)用場景,為消費(fèi)者提供更友好的人機(jī)界面和用戶體驗[2]。
基于Windows CE的嵌入式系統(tǒng)采用四層體系結(jié)構(gòu),具有層次性強(qiáng)、可移植性好、組件可剪裁、強(qiáng)調(diào)編程接口和支持上層應(yīng)用等特點(diǎn)。系統(tǒng)從下而上分為硬件層、OEM 硬件適配層、操作系統(tǒng)服務(wù)層、應(yīng)用層[3],系統(tǒng)架構(gòu)如圖2所示。
OAL部分負(fù)責(zé)Windows CE與硬件通信,它與CPU、中斷、內(nèi)存、時鐘和調(diào)試口等核心設(shè)備相關(guān),用于屏蔽CPU平臺細(xì)節(jié),保證操作系統(tǒng)內(nèi)核的可移植性[3]。RTC時鐘驅(qū)動在OAL層中開發(fā)實(shí)現(xiàn)。
DS1388 I2C實(shí)時時鐘(RTC)、監(jiān)控器、EEPROM是一個多功能器件,提供時鐘/日歷、可編程看門狗定時器、具有復(fù)位功能的電源監(jiān)視器和512字節(jié)EEPROM。時鐘部分可提供百分之一秒、秒、分鐘和小時等信息,工作于24小時制式或帶AM/PM指示的12小時制式。日歷部分提供星期、日、月和年信息。對少于31天的月份,可對月末日期自動調(diào)整,包括對閏年的校正。看門狗定時器可對沒有響應(yīng)的微處理器復(fù)位。可以以10ms為間隔,在0.01-99.99秒范圍內(nèi)編程。經(jīng)過溫度補(bǔ)償?shù)碾妷夯鶞?zhǔn)和比較器電路對VCC狀態(tài)進(jìn)行監(jiān)視。如果探測到主電源失效,器件自動切換至備份電源,驅(qū)動復(fù)位輸出為有效狀態(tài)。在失去VCC情況下,備份電源維持時鐘/日歷部分繼續(xù)工作。當(dāng)VCC恢復(fù)至正常電平時,復(fù)位輸出繼續(xù)保持為低一段時間,以等待電源和處理器工作穩(wěn)定。器件還具有一個按鍵式復(fù)位控制器[4],可通過I2C串行接口訪問該器件。RTC計算百分秒、秒、分、時、星期、日期、月和年,閏年修正有效期至2100年。
1.4開發(fā)環(huán)境
本文硬件平臺采用英蓓特提供的Devkit8600評估板,對某縫制設(shè)備終端訂制AMM3359開發(fā)板,軟件使用Devkit8600提供的BSP包并針對應(yīng)用進(jìn)行適配,基于Windows Embedded Compact7操作系統(tǒng) 和Visual Studio 2008進(jìn)行芯片驅(qū)動程序開發(fā)。
2硬件接口電路設(shè)計
DS1388芯片與 AM3359處理器之間使用I2C總線進(jìn)行連接通信,芯片的SCL腳和SDA腳分別與處理器的I2C0_SCL腳和I2C0_SDA腳相連,其它外圍電路不作描述。硬件接口電路設(shè)計如圖3所示。
3RTC時鐘驅(qū)動程序設(shè)計與實(shí)現(xiàn)
WinCE7.0中 RTC時鐘驅(qū)動是在OEM接口層即OAL層實(shí)現(xiàn)的,其源代碼位置在:\\WINCE700\\platform\\common\\src\\soc\\COMMON_TI_V1\\COMMON_TI_AMXX\\OAL\\OALRTC\\oalrtc.c文件中。
3.1工作原理
應(yīng)用層程序調(diào)用操作系統(tǒng)層的應(yīng)用API,通過OAL層的RTC時鐘驅(qū)動操作DS1388時鐘芯片,通過轉(zhuǎn)碼算法達(dá)到控制RTC實(shí)時時鐘目的,詳細(xì)流程見圖4。
3.2I2C總線驅(qū)動
處理器外接RTC的時鐘芯片通過I2C總線進(jìn)行訪問,本文通過使用I2C總線操作DS1388芯片寄存器,因此需確保I2C總線驅(qū)動正常運(yùn)行。BSP包中I2C驅(qū)動已全部實(shí)現(xiàn)并通過測試,本文不再詳述I2C驅(qū)動程序原理和實(shí)現(xiàn)過程。
3.3BCD與BIN轉(zhuǎn)碼
BIN碼就是二進(jìn)制編碼,用二進(jìn)制記錄數(shù)據(jù); BCD碼亦稱二進(jìn)碼十進(jìn)數(shù)或二、十進(jìn)制代碼,就是用4位二進(jìn)制數(shù)表示1位十進(jìn)制數(shù)的編碼。最常用的BCD編碼使用0-9這10個數(shù)值的二進(jìn)碼表示。〖BT3〗3.3.1BCD碼轉(zhuǎn)BIN碼算法bin = bcd低四位數(shù)值+bcd高四位值*10static UINT8 BCDtoBIN(UINT8 bt){ return (bt & 0xf) + (((bt & 0xf0) >> 4)* 10); }
3.3.2BIN碼轉(zhuǎn)BCD碼算法bcd 高四位= bin/10;bcd 低四位= bin%10static UINT8 BINtoBCD(UINT8 bt){ return (((bt/10) << 4) | (bt % 10));}
3.4時鐘設(shè)計與實(shí)現(xiàn)
在WinCE7.0中,RTC驅(qū)動主要實(shí)現(xiàn)3個重要函數(shù):①設(shè)置當(dāng)前時間:BOOL OEMSetRealTime( SYSTEMTIME *pSystemTime );②獲取當(dāng)前時間:BOOL OEMGetRealTime(SYSTEMTIME *pSystemTime);③設(shè)置報警時間:BOOL OEMSetAlarmTime(SYSTEMTIME *pSystemTime )。本文主要實(shí)現(xiàn)當(dāng)前時間的設(shè)置和獲取,以及芯片初始化功能[5]。
3.4.1參數(shù)宏定義對照DS1388芯片手冊,芯片寄存器定義如下:// Global variables#define MILLISECONDS_DS1388 0x0// MilliSeconds Register#define SECONDS_DS1388 0x1// Seconds Register#define MINUTES_DS1388 0x2 // Minutes Register……//定義時、周、天、月、年寄存器地址#define FLAG_REG 0xB// 芯片標(biāo)識寄存器#define CTRL_REG 0xC// 芯片控制寄存器#define BASE_YEAR_DS1388 2000 //系統(tǒng)初始時間#define MAX_YEARS 99static void *g_hI2C = NULL;OMAP_DEVICE i2cdev = 4 ;//I2C0設(shè)備號static UINT16 g_devAddr = 0x0068;//Write Mode,0xD1 :Read Modestatic UINT16 g_baseYear = 2000;
3.4.2設(shè)置時鐘函數(shù)實(shí)現(xiàn)
BOOL RTC_SetTime(LPSYSTEMTIME time){ UCHAR cmdBuffer[8]; //依次將年月日、周、天、時分秒等數(shù)據(jù)從BIN碼轉(zhuǎn)變?yōu)锽CD碼 cmdBuffer[SECONDS_DS1388] = (UINT32)BINtoBCD((UINT8)time->wSecond);…… cmdBuffer[WEEK_DS1388] = (UINT32)BINtoBCD((UINT8)time->wDayOfWeek); if( RTCI2CWrite(0,cmdBuffer,8)==FALSE)//通過I2C總線將數(shù)據(jù)寫入芯片寄存器 { OALMSG(1,(L"RTC_SetTime():Failed to write the date/time to the RTC.\\r\\n")); return FALSE; }}
3.4.3獲取時鐘函數(shù)實(shí)現(xiàn)
BOOL RTC_GetTime(LPSYSTEMTIME time){ UCHAR receiveBuffer[8]; if (RTCI2CRead(0,receiveBuffer,8) == FALSE) {//通過I2C總線從芯片寄存器中讀取當(dāng)前時間}//將BCD碼轉(zhuǎn)變成上層應(yīng)用識別的BIN碼并分別賦值給時間結(jié)構(gòu)體time的各個元素 time->wSecond = BCDtoBIN((UINT8)(receiveBuffer[SECONDS_DS1388] & 0x7F));…… time->wDayOfWeek = BCDtoBIN((UINT8)(receiveBuffer[WEEK_DS1388] & 0x7F)); time->wMilliseconds = 0;; return TRUE;}
3.4.4RTC時鐘初始化實(shí)現(xiàn)
BOOL OAL3XX_RTCInit(UINT32 rtc_base_pa,DWORD rtc_irq){ OALI2CInit(4);//I2C初始化 g_hI2C = I2COpen(i2cdev);//打開I2C RTCI2CWrite(CTRL_REG,&buf,1); // 設(shè)置 DS1388 控制寄存器}
4測試
4.1時鐘測試設(shè)置
當(dāng)WinCE啟動后,會在界面右下角看到時間顯示。在界面中設(shè)置時間,系統(tǒng)就會調(diào)用OEMSetRealTime將設(shè)置的時間寫入到RTC模塊并保存。測試情況如下: 開機(jī)初始化時間為2000.1.1 12:00,如圖5所示。設(shè)置時間為2016.8.17 8:54:25,保存,如圖6所示。 間隔幾分鐘后再次開機(jī)時間為2016.8.17 8:56:35,如圖7所示,測試結(jié)果表明實(shí)時時鐘設(shè)置運(yùn)行成功。
4.2時鐘測試獲取
WinCE啟動后,默認(rèn)情況下系統(tǒng)會每隔一段時間調(diào)用OEMGetRealTime函數(shù)獲得系統(tǒng)時間,這種方式稱為hardware mode。同樣用戶也可以通過調(diào)用Windows時鐘基本API,即編寫測試程序調(diào)用OEMGetRealTime獲取當(dāng)前時間,每隔1秒顯示一次當(dāng)前時間,部分代碼如下:
void Ctimer_testDlg::OnTimer(UINT_PTR nIDEvent){ SYSTEMTIME Time ,CString str,LPCTSTR lpctstr; GetLocalTime(&Time);//獲取當(dāng)前時間 //顯示當(dāng)前時間 str.Format(_T("%04d.%02d.%02d %02d:%02d:%02d"), Time.wYear,Time.wMonth,Time.wDay, Time.wHour,Time.wMinute,Time.wSecond ); lpctstr = str.GetBuffer(str.GetLength()+1); str.ReleaseBuffer(); SetDlgItemText(IDC_TIME,lpctstr); CDialog::OnTimer(nIDEvent);//實(shí)時顯示}
測試結(jié)果如圖8所示。
5結(jié)語
本文介紹了WinCE系統(tǒng)結(jié)構(gòu)和RTC時鐘工作原理,以外接DS1388 RTC時鐘芯片為例,闡述了在AM3359和WinCE7.0平臺下,DS1388時鐘芯片驅(qū)動程序的設(shè)計實(shí)現(xiàn)過程,并通過設(shè)置時間和獲取時間測試驗證了驅(qū)動程序。驅(qū)動程序運(yùn)行穩(wěn)定可靠,滿足設(shè)計要求。
參考文獻(xiàn):[1]劉洪濤,鄒南.ARM處理器開發(fā)詳解[M].北京:電子工業(yè)出版社,2012.
[2]Texas Instruments.AM335X arm Cortex-A8 mMicroprocessors (MPUs) technical reference manual[Z].Literature Number:SPRUH73H,2011.
[3]尹成,黃永兵,胡耀文,等.Windows CE 7開發(fā)實(shí)戰(zhàn)詳解[M].北京:人民郵電出版社,2012.
[4]李紅,馮慶勝,曾潔.實(shí)時時鐘芯片DS1388的原理和應(yīng)用[J].電子元器件應(yīng)用,2006(1):7274.
[5]周建設(shè).Windows CE 設(shè)備驅(qū)動及BSP開發(fā)指南[M].北京:中國電力出版社,2009.
(責(zé)任編輯:杜能鋼)