• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于AM3359 和WinCE7.0平臺(tái)的RTC時(shí)鐘設(shè)計(jì)與實(shí)現(xiàn)

      2017-06-20 08:28:38袁霞蒲實(shí)
      軟件導(dǎo)刊 2017年4期
      關(guān)鍵詞:驅(qū)動(dòng)程序寄存器時(shí)鐘

      袁霞+蒲實(shí)

      摘要:以運(yùn)行Windows CE7.0操作系統(tǒng)的AM3359主板為開(kāi)發(fā)平臺(tái),介紹了AM3359處理器、Windows CE7.0系統(tǒng)架構(gòu)和硬件接口電路,詳細(xì)闡述了在嵌入式平臺(tái)WinCE7.0操作系統(tǒng)中DS1388芯片驅(qū)動(dòng)程序設(shè)計(jì)原理和實(shí)現(xiàn)過(guò)程。該軟件已應(yīng)用在某縫制終端系列設(shè)備中,為系統(tǒng)提供精準(zhǔn)的實(shí)時(shí)時(shí)鐘功能。

      關(guān)鍵詞:AM3359處理器;WinCE7.0;RTC時(shí)鐘;DS1388芯片

      中圖分類(lèi)號(hào):TP319

      文獻(xiàn)標(biāo)識(shí)碼:A

      文章編號(hào):16727800(2017)004013504

      0引言

      當(dāng)AM3359處理器自帶RTC時(shí)鐘不能滿(mǎn)足用戶(hù)更高要求,或因PMIC輸出電壓不正常導(dǎo)致RTC功能受到影響時(shí),需要在PCB布局中添加單獨(dú)的RTC芯片DS1388,直接由電池供電,以保證系統(tǒng)能正確設(shè)置、保存、獲取實(shí)時(shí)時(shí)間,掉電不消失。對(duì)于外接DS1388芯片,AM3359處理器BSP包中自帶的RTC驅(qū)動(dòng)程序不能實(shí)現(xiàn)DS1388芯片的實(shí)時(shí)時(shí)鐘功能,需對(duì)RTC時(shí)鐘驅(qū)動(dòng)重新編寫(xiě),完成芯片寄存器配置、實(shí)時(shí)時(shí)鐘讀寫(xiě)以及初始化功能。

      1平臺(tái)介紹

      1.1AM3359處理器

      AM3359是TI(德州儀器)基于 ARM Cortex-A8內(nèi)核的32位 RISC微處理器,支持主頻275-MHz、500-MHz、600-MHz和 720-MHz,因其價(jià)格便宜,支持操作系統(tǒng)齊全等特性,在工業(yè)控制、醫(yī)療電子、數(shù)控、汽車(chē)電子等行業(yè)的環(huán)境惡劣場(chǎng)合中廣泛應(yīng)用[1],功能框架如圖1所示。

      1.2WinCE7.0操作系統(tǒng)

      Windows Embedded Compact 7簡(jiǎn)稱(chēng)WinCE7.0,是一種安全可靠的實(shí)時(shí)高性能嵌入式操作系統(tǒng),其將最新的網(wǎng)絡(luò)、多媒體和通信技術(shù)封裝于小型設(shè)備中,具有搶占式多任務(wù)執(zhí)行特性和強(qiáng)大的通訊能力。WinCE7擁有Windows 7特點(diǎn),支持虛擬內(nèi)存機(jī)制,按需分配內(nèi)存和內(nèi)存映射文件,專(zhuān)門(mén)為信息設(shè)備、移動(dòng)計(jì)算、消費(fèi)類(lèi)電子產(chǎn)品和嵌入式應(yīng)用等非PC領(lǐng)域而設(shè)計(jì),為不同的應(yīng)用和設(shè)備提供強(qiáng)大的可定制功能。WinCE7作為微軟最新一代Windows CE操作系統(tǒng),提供了新的功能和特性,適用于更為廣泛的設(shè)備類(lèi)別和應(yīng)用場(chǎng)景,為消費(fèi)者提供更友好的人機(jī)界面和用戶(hù)體驗(yàn)[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)存、時(shí)鐘和調(diào)試口等核心設(shè)備相關(guān),用于屏蔽CPU平臺(tái)細(xì)節(jié),保證操作系統(tǒng)內(nèi)核的可移植性[3]。RTC時(shí)鐘驅(qū)動(dòng)在OAL層中開(kāi)發(fā)實(shí)現(xiàn)。

      DS1388 I2C實(shí)時(shí)時(shí)鐘(RTC)、監(jiān)控器、EEPROM是一個(gè)多功能器件,提供時(shí)鐘/日歷、可編程看門(mén)狗定時(shí)器、具有復(fù)位功能的電源監(jiān)視器和512字節(jié)EEPROM。時(shí)鐘部分可提供百分之一秒、秒、分鐘和小時(shí)等信息,工作于24小時(shí)制式或帶AM/PM指示的12小時(shí)制式。日歷部分提供星期、日、月和年信息。對(duì)少于31天的月份,可對(duì)月末日期自動(dòng)調(diào)整,包括對(duì)閏年的校正??撮T(mén)狗定時(shí)器可對(duì)沒(méi)有響應(yīng)的微處理器復(fù)位??梢砸?0ms為間隔,在0.01-99.99秒范圍內(nèi)編程。經(jīng)過(guò)溫度補(bǔ)償?shù)碾妷夯鶞?zhǔn)和比較器電路對(duì)VCC狀態(tài)進(jìn)行監(jiān)視。如果探測(cè)到主電源失效,器件自動(dòng)切換至備份電源,驅(qū)動(dòng)復(fù)位輸出為有效狀態(tài)。在失去VCC情況下,備份電源維持時(shí)鐘/日歷部分繼續(xù)工作。當(dāng)VCC恢復(fù)至正常電平時(shí),復(fù)位輸出繼續(xù)保持為低一段時(shí)間,以等待電源和處理器工作穩(wěn)定。器件還具有一個(gè)按鍵式復(fù)位控制器[4],可通過(guò)I2C串行接口訪(fǎng)問(wèn)該器件。RTC計(jì)算百分秒、秒、分、時(shí)、星期、日期、月和年,閏年修正有效期至2100年。

      1.4開(kāi)發(fā)環(huán)境

      本文硬件平臺(tái)采用英蓓特提供的Devkit8600評(píng)估板,對(duì)某縫制設(shè)備終端訂制AMM3359開(kāi)發(fā)板,軟件使用Devkit8600提供的BSP包并針對(duì)應(yīng)用進(jìn)行適配,基于Windows Embedded Compact7操作系統(tǒng) 和Visual Studio 2008進(jìn)行芯片驅(qū)動(dòng)程序開(kāi)發(fā)。

      2硬件接口電路設(shè)計(jì)

      DS1388芯片與 AM3359處理器之間使用I2C總線(xiàn)進(jìn)行連接通信,芯片的SCL腳和SDA腳分別與處理器的I2C0_SCL腳和I2C0_SDA腳相連,其它外圍電路不作描述。硬件接口電路設(shè)計(jì)如圖3所示。

      3RTC時(shí)鐘驅(qū)動(dòng)程序設(shè)計(jì)與實(shí)現(xiàn)

      WinCE7.0中 RTC時(shí)鐘驅(qū)動(dòng)是在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,通過(guò)OAL層的RTC時(shí)鐘驅(qū)動(dòng)操作DS1388時(shí)鐘芯片,通過(guò)轉(zhuǎn)碼算法達(dá)到控制RTC實(shí)時(shí)時(shí)鐘目的,詳細(xì)流程見(jiàn)圖4。

      3.2I2C總線(xiàn)驅(qū)動(dòng)

      處理器外接RTC的時(shí)鐘芯片通過(guò)I2C總線(xiàn)進(jìn)行訪(fǎng)問(wèn),本文通過(guò)使用I2C總線(xiàn)操作DS1388芯片寄存器,因此需確保I2C總線(xiàn)驅(qū)動(dòng)正常運(yùn)行。BSP包中I2C驅(qū)動(dòng)已全部實(shí)現(xiàn)并通過(guò)測(cè)試,本文不再詳述I2C驅(qū)動(dòng)程序原理和實(shí)現(xiàn)過(guò)程。

      3.3BCD與BIN轉(zhuǎn)碼

      BIN碼就是二進(jìn)制編碼,用二進(jìn)制記錄數(shù)據(jù); BCD碼亦稱(chēng)二進(jìn)碼十進(jìn)數(shù)或二、十進(jìn)制代碼,就是用4位二進(jìn)制數(shù)表示1位十進(jìn)制數(shù)的編碼。最常用的BCD編碼使用0-9這10個(gè)數(shù)值的二進(jìn)碼表示?!糂T3〗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è)計(jì)與實(shí)現(xiàn)

      在WinCE7.0中,RTC驅(qū)動(dòng)主要實(shí)現(xiàn)3個(gè)重要函數(shù):①設(shè)置當(dāng)前時(shí)間:BOOL OEMSetRealTime( SYSTEMTIME *pSystemTime );②獲取當(dāng)前時(shí)間:BOOL OEMGetRealTime(SYSTEMTIME *pSystemTime);③設(shè)置報(bào)警時(shí)間:BOOL OEMSetAlarmTime(SYSTEMTIME *pSystemTime )。本文主要實(shí)現(xiàn)當(dāng)前時(shí)間的設(shè)置和獲取,以及芯片初始化功能[5]。

      3.4.1參數(shù)宏定義對(duì)照DS1388芯片手冊(cè),芯片寄存器定義如下:// Global variables#define MILLISECONDS_DS1388 0x0// MilliSeconds Register#define SECONDS_DS1388 0x1// Seconds Register#define MINUTES_DS1388 0x2 // Minutes Register……//定義時(shí)、周、天、月、年寄存器地址#define FLAG_REG 0xB// 芯片標(biāo)識(shí)寄存器#define CTRL_REG 0xC// 芯片控制寄存器#define BASE_YEAR_DS1388 2000 //系統(tǒng)初始時(shí)間#define MAX_YEARS 99static void *g_hI2C = NULL;OMAP_DEVICE i2cdev = 4 ;//I2C0設(shè)備號(hào)static UINT16 g_devAddr = 0x0068;//Write Mode,0xD1 :Read Modestatic UINT16 g_baseYear = 2000;

      3.4.2設(shè)置時(shí)鐘函數(shù)實(shí)現(xiàn)

      BOOL RTC_SetTime(LPSYSTEMTIME time){ UCHAR cmdBuffer[8]; //依次將年月日、周、天、時(shí)分秒等數(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)//通過(guò)I2C總線(xiàn)將數(shù)據(jù)寫(xiě)入芯片寄存器 { OALMSG(1,(L"RTC_SetTime():Failed to write the date/time to the RTC.\\r\\n")); return FALSE; }}

      3.4.3獲取時(shí)鐘函數(shù)實(shí)現(xiàn)

      BOOL RTC_GetTime(LPSYSTEMTIME time){ UCHAR receiveBuffer[8]; if (RTCI2CRead(0,receiveBuffer,8) == FALSE) {//通過(guò)I2C總線(xiàn)從芯片寄存器中讀取當(dāng)前時(shí)間}//將BCD碼轉(zhuǎn)變成上層應(yīng)用識(shí)別的BIN碼并分別賦值給時(shí)間結(jié)構(gòu)體time的各個(gè)元素 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í)鐘初始化實(shí)現(xiàn)

      BOOL OAL3XX_RTCInit(UINT32 rtc_base_pa,DWORD rtc_irq){ OALI2CInit(4);//I2C初始化 g_hI2C = I2COpen(i2cdev);//打開(kāi)I2C RTCI2CWrite(CTRL_REG,&buf,1); // 設(shè)置 DS1388 控制寄存器}

      4測(cè)試

      4.1時(shí)鐘測(cè)試設(shè)置

      當(dāng)WinCE啟動(dòng)后,會(huì)在界面右下角看到時(shí)間顯示。在界面中設(shè)置時(shí)間,系統(tǒng)就會(huì)調(diào)用OEMSetRealTime將設(shè)置的時(shí)間寫(xiě)入到RTC模塊并保存。測(cè)試情況如下: 開(kāi)機(jī)初始化時(shí)間為2000.1.1 12:00,如圖5所示。設(shè)置時(shí)間為2016.8.17 8:54:25,保存,如圖6所示。 間隔幾分鐘后再次開(kāi)機(jī)時(shí)間為2016.8.17 8:56:35,如圖7所示,測(cè)試結(jié)果表明實(shí)時(shí)時(shí)鐘設(shè)置運(yùn)行成功。

      4.2時(shí)鐘測(cè)試獲取

      WinCE啟動(dòng)后,默認(rèn)情況下系統(tǒng)會(huì)每隔一段時(shí)間調(diào)用OEMGetRealTime函數(shù)獲得系統(tǒng)時(shí)間,這種方式稱(chēng)為hardware mode。同樣用戶(hù)也可以通過(guò)調(diào)用Windows時(shí)鐘基本API,即編寫(xiě)測(cè)試程序調(diào)用OEMGetRealTime獲取當(dāng)前時(shí)間,每隔1秒顯示一次當(dāng)前時(shí)間,部分代碼如下:

      void Ctimer_testDlg::OnTimer(UINT_PTR nIDEvent){ SYSTEMTIME Time ,CString str,LPCTSTR lpctstr; GetLocalTime(&Time);//獲取當(dāng)前時(shí)間 //顯示當(dāng)前時(shí)間 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í)時(shí)顯示}

      測(cè)試結(jié)果如圖8所示。

      5結(jié)語(yǔ)

      本文介紹了WinCE系統(tǒng)結(jié)構(gòu)和RTC時(shí)鐘工作原理,以外接DS1388 RTC時(shí)鐘芯片為例,闡述了在AM3359和WinCE7.0平臺(tái)下,DS1388時(shí)鐘芯片驅(qū)動(dòng)程序的設(shè)計(jì)實(shí)現(xiàn)過(guò)程,并通過(guò)設(shè)置時(shí)間和獲取時(shí)間測(cè)試驗(yàn)證了驅(qū)動(dòng)程序。驅(qū)動(dòng)程序運(yùn)行穩(wěn)定可靠,滿(mǎn)足設(shè)計(jì)要求。

      參考文獻(xiàn):[1]劉洪濤,鄒南.ARM處理器開(kāi)發(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開(kāi)發(fā)實(shí)戰(zhàn)詳解[M].北京:人民郵電出版社,2012.

      [4]李紅,馮慶勝,曾潔.實(shí)時(shí)時(shí)鐘芯片DS1388的原理和應(yīng)用[J].電子元器件應(yīng)用,2006(1):7274.

      [5]周建設(shè).Windows CE 設(shè)備驅(qū)動(dòng)及BSP開(kāi)發(fā)指南[M].北京:中國(guó)電力出版社,2009.

      (責(zé)任編輯:杜能鋼)

      猜你喜歡
      驅(qū)動(dòng)程序寄存器時(shí)鐘
      別樣的“時(shí)鐘”
      古代的時(shí)鐘
      Lite寄存器模型的設(shè)計(jì)與實(shí)現(xiàn)
      分簇結(jié)構(gòu)向量寄存器分配策略研究*
      有趣的時(shí)鐘
      時(shí)鐘會(huì)開(kāi)“花”
      高速數(shù)模轉(zhuǎn)換器AD9779/AD9788的應(yīng)用
      一種可重構(gòu)線(xiàn)性反饋移位寄存器設(shè)計(jì)
      驅(qū)動(dòng)程序更新與推薦
      驅(qū)動(dòng)程序更新與推薦
      炎陵县| 昂仁县| 彰武县| 四平市| 济南市| 吴桥县| 邵阳市| 崇文区| 湘阴县| 高阳县| 南城县| 固始县| 织金县| 东乡| 霍城县| 通海县| 恩施市| 吉安市| 金山区| 米脂县| 沐川县| 隆林| 沂水县| 逊克县| 鹤山市| 荥经县| 民丰县| 兰溪市| 武乡县| 东兰县| 抚顺县| 兰考县| 高淳县| 阳高县| 辉县市| 孟村| 庆阳市| 台江县| 仁化县| 涿州市| 资溪县|