袁霞+蒲實



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