版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
作者:PanHongliang僅供個(gè)人學(xué)習(xí)摘要隨著計(jì)算機(jī)技術(shù),微電子技術(shù)和網(wǎng)絡(luò)技術(shù)的迅速發(fā)展,嵌入式系統(tǒng)技術(shù)是電子產(chǎn)品設(shè)計(jì)領(lǐng)域最為熱門(mén)的技術(shù)之一。在消費(fèi)電子、網(wǎng)絡(luò)通信、工業(yè)控制等諸多領(lǐng)域得到了廣泛的應(yīng)用。ARM處理器是目前公認(rèn)的領(lǐng)先的32位嵌入式RSIC微處理器,已成為許多行業(yè)嵌入式解決方案的 RISC標(biāo)準(zhǔn)。ARM肢術(shù)以低功耗,低成本、體積小等諸多優(yōu)點(diǎn)在嵌入式領(lǐng)域獲得更廣泛的應(yīng)用。GPS是以衛(wèi)星為基礎(chǔ)的無(wú)線導(dǎo)航定位系統(tǒng)。它具有全能性(陸地、海洋、航空和航天)、全球性、全天候、連續(xù)性和實(shí)時(shí)性的導(dǎo)航、定位和定時(shí)的功能,能為用戶提供精密的三維坐標(biāo)、速度和時(shí)間。本設(shè)計(jì)將闡述LPC2292的啟動(dòng)程序、串口UART通訊程序、I2C通訊程序和GPS數(shù)據(jù)解碼程序,重點(diǎn)介紹LPC2292串口UART0I2C部件和NMEA-0813&議,在LCD顯示方面介紹如何使用ZLG/GUI編寫(xiě)菜單界面,本軟件能正確的對(duì)GPS信息進(jìn)行解碼,并在液晶上顯示。關(guān)鍵詞:LPC2292、GPS接收器、I2C、NMEA-0813協(xié)議AbstractWiththedevelopmentofthecomputertechnology,microelectronics andnetworktechnology,embeddedsystemisoneofthemostpopulartechnologyofthefieldofelectronicproductdesign.Embeddedsystemisadoptedinthefieldsofconsumerelectronics,networkcommunication,industrialcontrolandsoon.ARMprocessorisakindofadvanee32-bitmicroprocessorembeddedRISC,ithavebecomedembeddedRISCstardardofsolutionformanyindustries. ARMtechnologyhavelow-power,low-cost,smallsizeandmanyotheradvantages,soitappliedinthefieldofembeddedsystemwidely.GPSisaWirelessnavigation andpositioningsystembasedonSatellite.Ithasthefunction ofomnipotent(terrestrial,marine,aviationandaerospace),aglobal,all-weather, continuityandattachmentofnavigation,positioningandtiming,itcanprovideforthecustomerSophisticatedthree-dimensionalcoordinates,speedandtime.Thisarticleexpoundthathowtoprogramfor2292Bootloader、serialUART(communication、I2Ccommunication.AndGPSdatadecode,andintroduceLPC2292emphasisonserialUART0、I2CandNMEA-0813protocol,andintroducehowtouseZLG/GUIprogrammenuinterfaceinthepartoflcddisplay.ThissoftwarecandecodeGPSdataaccuracyanddisplayontheLCD.Keyword:LPC2292、GPSreceiver、I2C、NMEA-0813protocol目錄TOC\o"1-5"\h\z\o"CurrentDocument"緒論 1\o"CurrentDocument"2總體方案設(shè)計(jì) 2\o"CurrentDocument"設(shè)計(jì)任務(wù) 2\o"CurrentDocument"硬件設(shè)計(jì) 2\o"CurrentDocument"軟件設(shè)計(jì) 3\o"CurrentDocument"3各模塊程序設(shè)計(jì) 4\o"CurrentDocument"Bootloader代碼 4初始化中斷向量 5初始化外部總線控制器 7堆棧初始化 8目標(biāo)板初始化 9\o"CurrentDocument"移殖卩COS衛(wèi)至ULPC2292 11編寫(xiě)OS_CUP.h 13OS_CPU_C.c文件 14OS_CPU_A.S文件 15中斷及時(shí)鐘節(jié)拍 17\o"CurrentDocument"信息解碼程序設(shè)計(jì) 18NMEA-0183的協(xié)議標(biāo)準(zhǔn) 18GPS數(shù)據(jù)結(jié)構(gòu)的定義 19\o"CurrentDocument"GPS信息解碼程序設(shè)計(jì) 22\o"CurrentDocument"串口驅(qū)動(dòng)程序 23串口結(jié)構(gòu)圖 23串口的初始化 23串口接收數(shù)據(jù)程序設(shè)計(jì) 24\o"CurrentDocument"鍵盤(pán)處理程序 26I2C總線 26I2C總線速度的配置 31ZLG7290 31液晶顯示程序的設(shè)計(jì) 32\o"CurrentDocument"4軟件的調(diào)試 34\o"CurrentDocument"軟件調(diào)試流程 34\o"CurrentDocument"調(diào)試結(jié)果 35結(jié)束語(yǔ) 36\o"CurrentDocument"致謝 36\o"CurrentDocument"參考文獻(xiàn) 36附錄 錯(cuò)誤!未定義書(shū)簽。緒論GPS衛(wèi)星導(dǎo)航定位技術(shù)是現(xiàn)代信息通信領(lǐng)域中一門(mén)新興的技術(shù)。 GPS系統(tǒng)的空間部分由24顆衛(wèi)星組成,均勻分布在6個(gè)軌道面上,地面高度為20200公里,軌道傾角為55度,扁心率約為0,周期約為12小時(shí),衛(wèi)星向地面發(fā)射兩個(gè)波段的載波信號(hào),載波信號(hào)頻率分別為1575.442兆赫茲(L1波段)和1227.6兆赫茲(L2波段),衛(wèi)星上安裝了精度很高的原子鐘,以確保頻率的穩(wěn)定性,在載波上調(diào)制有表示衛(wèi)星位置的廣播星歷,用于測(cè)距的C/A碼和P碼,以及其它系統(tǒng)信息,能在全球范圍內(nèi)向任意多用戶提供高精度的、全天候的、連續(xù)的、實(shí)時(shí)的三維測(cè)速、三維定位和授時(shí)。GPS系統(tǒng)的控制部分由設(shè)在美國(guó)本土的5個(gè)監(jiān)控站組成,這些監(jiān)控站不間斷地對(duì)GPS衛(wèi)星進(jìn)行觀測(cè),并將計(jì)算和預(yù)報(bào)的信息由注入站對(duì)衛(wèi)星信息更新。GPS系統(tǒng)的用戶是非常隱蔽的,它是一種單程系統(tǒng),用戶只接收而不必發(fā)射信號(hào),因此用戶的數(shù)量也是不受限制的。目前,中國(guó)衛(wèi)星導(dǎo)航技術(shù)應(yīng)用領(lǐng)域十分廣闊,傳統(tǒng)測(cè)量應(yīng)用及軍工相關(guān)應(yīng)用的比例在逐年下降,應(yīng)用已滲透到許多嶄新的行業(yè)。通信行業(yè)用GPS做時(shí)間同步測(cè)控;電力、有線電視、城市地下管道采用 GPS布設(shè)線路;交通、運(yùn)輸部門(mén)用GPS等相關(guān)集成技術(shù)營(yíng)建ITS系統(tǒng)和監(jiān)控系統(tǒng);公安、銀行、醫(yī)療、消防等用GPS營(yíng)建緊急救援或報(bào)警系統(tǒng);汽車(chē)、船舶用GPS導(dǎo)航;GIS數(shù)據(jù)提供商用GPS采集地理信息相關(guān)數(shù)據(jù),并提供位置信息相關(guān)服務(wù)(LBS;廣播電視行業(yè)用GPS與羅盤(pán)制造衛(wèi)星電視定向接收天線;電子商務(wù)領(lǐng)域, GPS甚至應(yīng)用于CRM客戶管理和物流配送體系中;而電腦制造商、通訊設(shè)備商正在推動(dòng)通訊、電腦、 GPS—體化的各類(lèi)移動(dòng)信息終端應(yīng)用?,F(xiàn)實(shí)的應(yīng)用已經(jīng)使衛(wèi)星導(dǎo)航技術(shù)從專(zhuān)業(yè)化領(lǐng)域走向了大眾化應(yīng)用的廣闊前景,這也使得衛(wèi)星導(dǎo)航技術(shù)逐漸成為通信、互聯(lián)網(wǎng)之后的第三個(gè)IT新增長(zhǎng)點(diǎn)。中國(guó)衛(wèi)星導(dǎo)航產(chǎn)品與服務(wù)一直呈現(xiàn)強(qiáng)勁增長(zhǎng)的勢(shì)頭。據(jù)有關(guān)部門(mén)統(tǒng)計(jì),GPS接收機(jī)相關(guān)產(chǎn)品的擁有量8萬(wàn)臺(tái)左右,航海型約有5萬(wàn)臺(tái)左右,應(yīng)用數(shù)量最多;車(chē)載型以每年200%勺速度遞增,發(fā)展最快;手持型各類(lèi)個(gè)人消費(fèi)終端產(chǎn)品形態(tài)極為豐富,最具誘惑力。本設(shè)計(jì)主要研究對(duì)基于NMEA-0813協(xié)議的GPS信息解碼程序的設(shè)計(jì),程序可以對(duì)RMC推薦定位信息)、GGA固定數(shù)據(jù)輸出信息)、GSA當(dāng)前衛(wèi)星信息)進(jìn)行精確的解碼,并能在液晶顯示器顯示經(jīng)度、緯度、日期、時(shí)間等信息。2總體方案設(shè)計(jì)設(shè)計(jì)任務(wù)本軟件設(shè)計(jì)的所需完成的任務(wù)是:通過(guò)編寫(xiě)GPS言息解碼程序,能對(duì)GPS言息進(jìn)行正確的解碼;通過(guò)移值ZLG/GU,設(shè)計(jì)菜單操作界面,方便用戶操作,并顯示詳細(xì)的GPS言息。硬件設(shè)計(jì)本設(shè)計(jì)要求微處理器能提供串口接收GPS莫塊輸出的信息,并有較強(qiáng)的運(yùn)算能力及高的處理速度使得菜單界面顯示效果好。目前 ,ARM所提供的16/32位嵌入式RISC內(nèi)核主要有以下幾個(gè)系列產(chǎn)品:ARM7ARM9ARM10EARM1和SecurCore、StrongARM和Xscale等。ARM7TMD屬于低端的ARM處理器,其最高主頻可達(dá)130MIPS(MillionInstructions PerSecond),高速的運(yùn)算能力能勝任絕大多數(shù)復(fù)雜的應(yīng)用。本次設(shè)計(jì)采用LPC2292作為微處理器,其最高主頻為60MH乙足以勝任本次設(shè)計(jì)任務(wù)丄PC2292有256kB片內(nèi)Flash,為本次設(shè)計(jì)提供了足夠的程序存儲(chǔ)空間,可以不用擴(kuò)展外部Flash。雖然LPC2292有16kB的片內(nèi)RAM但是仍然不夠用,因?yàn)楸驹O(shè)計(jì)所移植的uCOS_II操作系統(tǒng)和ZLG/GUI共生成了7kB多的Data,必須為每一個(gè)任務(wù)分配足夠的堆??臻g和聲明存放 GPS信息的數(shù)組,加上定義必要的變量將增加大約6kB的Data,使16kB的RAM剩余不多??紤]到以后能容易的添加新的功能,本設(shè)計(jì)采用外部RAMW存程序變量,具體芯片選用高速訪問(wèn)時(shí)間達(dá)10ns、高性能和低功耗的IS61LV25616AL,該芯片是美國(guó)ISSI公司生產(chǎn)的SRAM靜態(tài)RAM)存儲(chǔ)容量是512kB,這為以后擴(kuò)展功能提供極大的發(fā)揮余地。本設(shè)計(jì)采用ZLG7290作為鍵盤(pán)接口,ZLG7290是標(biāo)準(zhǔn)的I2C接口器件,只使用三個(gè)LPC2292的I/O口,其中有兩個(gè)是I2C引腳SDASCL,另外一個(gè)引腳是外部中斷EINT3,這樣就可以節(jié)省I/O口又可以擴(kuò)展多達(dá)64個(gè)引腳ZLG7290可以自動(dòng)消除抖動(dòng),其中有8只可以作為功能鍵使用。另外ZLG7290內(nèi)部還設(shè)置有連擊計(jì)數(shù)器,能夠使某鍵按下后不松手而連續(xù)有效。 在液晶方面可以選用點(diǎn)陣圖形的單色液晶,也可以選用STN或者更高級(jí)別的液晶,但價(jià)格昂貴。本設(shè)計(jì)采用SMG240128作為顯示器,就可以滿足設(shè)計(jì)要求。本設(shè)計(jì)的總體硬件框圖如圖 2.1所示。圖2.1總體硬件框圖軟件設(shè)計(jì)本設(shè)計(jì)采用卩COS召實(shí)時(shí)操作系統(tǒng)實(shí)現(xiàn),該操作系統(tǒng)的優(yōu)點(diǎn)是提高處理事件的實(shí)時(shí)性。本設(shè)計(jì)共建立3個(gè)任務(wù),分別為T(mén)askA、TaskBTaskG其中TaskA為起始任務(wù),其優(yōu)先級(jí)最高,在TaskA中建立TaskBTaskGTaskB是顯示GPS信息任務(wù),TaskC是鍵盤(pán)檢測(cè)任務(wù)。 TaskB獲取鍵盤(pán)的方法是,先建立郵箱havenewkey,并等待郵箱havenewkey,TaskC檢測(cè)到按鍵按下時(shí)發(fā)出郵箱havenewkey,之后當(dāng)執(zhí)行任務(wù)TaskB時(shí)通過(guò)郵箱havenewkey獲取按鍵值。主程序執(zhí)行過(guò)程如圖2.2所示。程序由7部分組成:Bootloader、GPS信息解碼程序、串口中斷服務(wù)程序、讀按鍵值程序、ZLG/GU、卩COS召和主程序,下面將闡述其中幾部分程序的設(shè)計(jì)方法。顯示GPS簡(jiǎn)介無(wú)限期等待郵箱Havenewkey顯示GPS簡(jiǎn)介無(wú)限期等待郵箱Havenewkey圖2.2 主程序流程圖各模塊程序設(shè)計(jì)Bootloader代碼Bootloader代碼(啟動(dòng)代碼)是嵌入式系統(tǒng)中應(yīng)用程序的開(kāi)頭部分,它與應(yīng)
用程序一起固化在ROM中,并首先在系統(tǒng)上運(yùn)行。Bootloader代碼是嵌入式程序的重要組成部分,好的Bootloader代碼是系統(tǒng)能夠正常工作的前提。本設(shè)計(jì)的啟動(dòng)代碼的整個(gè)流程圖如圖3.1所示。圖3.1啟動(dòng)代碼流程圖3.1.1 初始化中斷向量ARM體系中共包含7個(gè)異常中斷,異常的類(lèi)型及向量地址見(jiàn)表 3.1表3.1異常的類(lèi)型及向量地址異常中斷類(lèi)型異常中斷模式向量地址復(fù)位管理模式0x00000000未定義指令未疋義模式0x00000004軟件中斷(SWI)管理模式0x00000008指令預(yù)取中止中止模式0x0000000C數(shù)據(jù)訪問(wèn)中止中止模式0x00000010
保留0x00000014外部中斷請(qǐng)求IRQIRQ模式0x00000018快速中斷請(qǐng)求FIQFIQ模式0X0000001C初始化中斷向量是設(shè)置中斷向量表,該中斷向量表給出了ARM芯片出現(xiàn)異常時(shí)轉(zhuǎn)去執(zhí)行的程序地址,如當(dāng)ARM芯片復(fù)位時(shí),產(chǎn)生復(fù)位中斷,進(jìn)入管理模式,執(zhí)行地址為0x00000000處的代碼。初始化中斷向量程序代碼如下:CODE32AREAvectors,CODE,READONLYENTRY;中斷向量表ResetLDRPC,ResetAddrLDRPC,UndefinedAddrLDRPC,SWI_AddrLDRPC,PrefetchAddrLDRPC,DataAbortAddrDCD0xb9205f80LDRPC,[PC,#-0xff0]LDRPC,FIQ_AddrResetAddrDCD ResetInitUndefinedAddr DCDUndefinedSWI_AddrDCDSoftwareInterruptPrefetchAddr DCDPrefetchAbortDataAbortAddr DCDDataAbortNouseDCD0IRQ_AddrDCD0FIQ_AddrDCDFIQ_Handler;未定義指令UndefinedBUndefined;取指令中止PrefetchAbortBPrefetchAbort;取數(shù)據(jù)中止DataAbortBDataAbort;快速中斷FIQ_HandlerSTMFDSP!,{R0-R3,LR}BL FIQ_ExceptionLDMFDSP!,{R0-R3,LR}SUBSPC,LR,#4AREA是偽操作,定義了名為vectors的代碼段,ENTR是至關(guān)重要的偽操作,作用是指定程序的入口點(diǎn),即是ARM執(zhí)行程序的起始點(diǎn)。從上面的代碼可以看出若發(fā)生取數(shù)據(jù)中止、指令預(yù)取中止、未定義指令異常時(shí) ,程序?qū)⑦M(jìn)入死循環(huán),這有助于用戶調(diào)試程序,如執(zhí)行用戶代碼:K+=Tab[temp],若在執(zhí)行該行程序之前,未對(duì)Tab[temp]賦值,則程序?qū)⑦M(jìn)入取數(shù)據(jù)中止死循環(huán),這使得用戶發(fā)現(xiàn)程序錯(cuò)誤從而矯正錯(cuò)誤。當(dāng)發(fā)生IRQ異常,CPU跳轉(zhuǎn)至異常向量地址為0x00000018處執(zhí)行指令LDRPC,[PC,#-0x0FF0],此時(shí)程序計(jì)數(shù)器PC中內(nèi)容為0x00000020,0x00000020減去0x00000FF0為0xFFFFF030這是向量中斷控制器(VIC)的向量地址寄存器VICVectAddr的地址,這個(gè)寄存器保存當(dāng)前將要服務(wù)的IRQ中斷服務(wù)程序的入口,用這一條指令就可以直接跳轉(zhuǎn)到需要的中斷服務(wù)程序中。 保留的異常向量“DCD0xb9205f80”位置填充數(shù)據(jù)0xb9205f8是為了使向量表中所有的數(shù)據(jù)32位累加和為0。初始化外部總線控制器正確的配置外部存儲(chǔ)器控制器是保證ARM運(yùn)行良好的前提,LPC2292含有外部總線控制器,支持靜態(tài)存儲(chǔ)器映射器件,包括RAMROMFlash、BurstROM和一些外部I/O器件。該模塊可同時(shí)支持多達(dá)4個(gè)單獨(dú)配置的存儲(chǔ)器組。初始化外部存儲(chǔ)器控制器BCFG寸,主要設(shè)置該寄存器的幾個(gè)域:BM(27),若使用的是BurstROM突發(fā)數(shù)據(jù)傳輸僅讀記憶體),則設(shè)置BM為1,否則設(shè)置為0;對(duì)不同寬度的存儲(chǔ)器,設(shè)置MW(29~28)設(shè)為00表示使用8位的存儲(chǔ)器,設(shè)為01表示使用16位的存儲(chǔ)器,設(shè)為10表示使用32位的存儲(chǔ)器;若是帶字節(jié)選擇輸入的16/32位寬度的器件,需要設(shè)置RBLE(10)為1,然后設(shè)置總線切換的空閑周期IDCY(3~0),讀訪問(wèn)長(zhǎng)度WST1(9~5),寫(xiě)訪問(wèn)長(zhǎng)度WST2以下為配置外部存儲(chǔ)器控制器的代碼。LDRR0,=BCFG0LDRR1,=((1<<28)+(0x02<<11)+(1<<10)+(0x02<<5)+(1));STRR1,[R0] ;LDRR0,=BCFG1LDRR1,=((1vv28)+(0x4vv11)+(1vv10)+(0x4v<5)+(0x01));STRR1,[R0] ;LDRR0,=BCFG2;LDRR1,=((0vv28)+(0x6vv11)+(1vv10)+(0x6v<5)+(0x01)) ;STRR1,[R0]LDRR0,=BCFG3 ;設(shè)置BCFG寄存器LDR R1,= ((1<<28)+(0x5<<11)+(1<<10)+(0x5<<5)+(0x01));STRR1,[R0]本設(shè)計(jì)分別把IS61LV25616AL、SST39VF1601分配至UBANK0BANK)IS61LV25616ALSST39VF1601都是16位的外部存儲(chǔ)器,因此MW(29~28設(shè)為1,IS61LV25616AL高速訪問(wèn)時(shí)間分別為10ns、90ns,以上的程序把對(duì)這兩個(gè)外部存儲(chǔ)器的讀寫(xiě)配置成最快速度。堆棧初始化每個(gè)異常模式都有自身堆??臻g,異常處理程序通常將其它要使用的寄存器保存到這個(gè)堆棧。以下為初始化堆棧的代碼。InitStackMOVR0,LR;設(shè)置中斷模式堆棧MSRCPSR_c,#0xd2LDRSP,StackIrq;設(shè)置快速中斷模式堆棧MSRCPSR_c,#0xd1LDRSP,StackFiq;設(shè)置中止模式堆棧MSRLDRCPSR_c,#0xd7SP,StackAbt;設(shè)置未定義模式堆棧MSRLDRCPSR_c,#0xdbSP,StackUnd;設(shè)置系統(tǒng)模式堆棧MSRLDRCPSR_c,#0xdfSP,=StackUsrMOVStackIrqStackFiqStackAbtStackUndPC,R0DCDIrqStackSpace+(IRQ_STACK_LEGTH-1)*4DCDFiqStackSpace+(FIQ_STACK_LEGTH-1)*4DCDAbtStackSpace+(ABT_STACK_LEGTH-1)*4DCDUndtStackSpace+(UND_STACK_LEGTH-1)*4
AREAMyStacks,DATA,NOINIT,ALIGN=2IrqStackSpaceFiqStackSpace空間IrqStackSpaceFiqStackSpace空間AbtStackSpace間4;中斷模式堆??臻g4;快速中斷模式堆棧4;中止義模式堆??誗PACEFIQ_STACK_LEGTHSPACEABT_STACK_LEGTHUndtStackSpace SPACEUND_STACK_LEGTH*4; 未定義模式堆棧MSF為寫(xiě)狀態(tài)寄存器指令,該指令可以直接設(shè)置狀態(tài)寄存器CPSR或SPSR上述代碼的MSF指令都是設(shè)置CPSF的控制域psr[7:0],接著指令LDR是設(shè)置各個(gè)模式的專(zhuān)用的堆棧指針SP的地址。用偽操作AREA聲明名為MyStatus的數(shù)據(jù)段,數(shù)據(jù)偽操作SPACED各個(gè)堆棧分配內(nèi)存單元,并用0初始化內(nèi)存單元,從程序中可以看出中止模式、未定義模式堆??臻g都被初始化為 0,是因?yàn)樵谶@些異常模式下都是執(zhí)行一個(gè)死循環(huán)不需要保存數(shù)據(jù)。由于CPU要進(jìn)行模式切換即由管理模式切換到系統(tǒng)模式,不能由系統(tǒng)模式的LR正確返回子程序,所以在初始化堆棧程序的入口處保存鏈接寄存器LR(模式自身的LR(R14)用于保存子程序返回地址)到R0,同時(shí)用R0返回子程序。目標(biāo)板初始化根據(jù)目標(biāo)板的外圍電路設(shè)置存儲(chǔ)器映射控制寄存器 MEMMAP分頻器寄存器VPBPLL倍頻值寄存器PLLCFG[4:0]、MAMt時(shí)寄存器。以下為初始化目標(biāo)板代碼。#ifdef__DEBUGMEMMAP=0x3; //remap#endif#ifdef__OUT_CHIPMEMMAP=0x3; //remap#endif#ifdef__IN_CHIPMEMMAP=0x1; //remap#endif/*設(shè)置系統(tǒng)各部分時(shí)鐘*/倍的Fpclk倍的倍的Fpclk倍的Fpclk#if(Fpclk/(Fcclk/4))==1〃fcclk==4VPBDIV=0;#endif#if(Fpclk/(Fcclk/4))==2//fcclk==2VPBDIV=2;#endif#if(Fpclk/(Fcclk/4))==4//fcclk==1 倍的FpclkVPBDIV=1;#endif#if(Fcco/Fcclk)==2PLLCFG=((Fcclk/Fosc)-1)|(0<<5);#endif#if(Fcco/Fcclk)==4PLLCFG=((Fcclk/Fosc)-1)|(1<<5);#endif#if(Fcco/Fcclk)==8PLLCFG=((Fcclk/Fosc)-1)|(2<<5);#endif#if(Fcco/Fcclk)==16PLLCFG=((Fcclk/Fosc)-1)|(3<<5);#endifPLLFEED=0xaa;PLLFEED=0x55;while((PLLSTAT&(1<<10))==0);PLLCON=3;PLLFEED=0xaa;PLLFEED=0x55;MAMCR=0;#ifFcclk<20000000MAMTIM=1;#else#ifFcclk<40000000MAMTIM=2;#elseMAMTIM=3;#endif#endifMAMCR=2;ARM在調(diào)試前ARM在調(diào)試前若選擇RelOutChip則編譯器會(huì)執(zhí)行#ifdef_OUT_CHIPMEMMAP=0x3; //remap#endif把MEMA設(shè)置為0x3,即選擇用戶外部存儲(chǔ)器模式,從0x80000000處開(kāi)始執(zhí)行程序,這樣0x80000000-0x8000003C異常向量表便映射0x00000000-0x0000003C同樣的,若選擇RelInChip則編譯器會(huì)執(zhí)行#ifdef_IN_CHIPMEMMAP=0x1; //remap#endif選擇用戶Flash模式,ARM直接從0x00000000執(zhí)行程序。在本設(shè)計(jì)中使用11.0592MHz晶振,倍增器值M=4所以處理器時(shí)鐘(Fcclk)為44.2368MHz為了使電流控制振蕩器頻率(Fcco)滿足156-320MHz選擇分頻器的值P=2,使得Fcco=FcclkX2XP=176.9472MHz取VP盼頻器的分頻值為1/4,所以外設(shè)時(shí)鐘(Fpclk)=Fcclk/4=11.0592MHz,為了使PLLCO和PLLCF寄存器的更改生效,必須將正確的饋送序列寫(xiě)入PLLFEE寄存器。饋送序列是將值0xAA寫(xiě)入PLLFEED接著將值0x55寫(xiě)入PLLFEEDwhile((PLLSTAT&(1<<10))==0);是等待PLL處于鎖定狀態(tài),MA定時(shí)寄存器決定使用多少個(gè)cclk周期訪問(wèn)Flash存儲(chǔ)器。這樣可調(diào)整MA時(shí)序使其匹配處理器操作頻率,在本設(shè)置所使用的處理器時(shí)鐘較快,把MAMTI配置為3,即使用3個(gè)處理器時(shí)鐘訪問(wèn)外部FLASH經(jīng)過(guò)了初始化中斷向量表、配置外部總線、初始化各模式堆棧、設(shè)置系統(tǒng)各部分時(shí)鐘、設(shè)置存儲(chǔ)加速模塊ARMf,ARM將進(jìn)入用戶主程序,執(zhí)行用戶代碼。移殖uCOS-n至ULPC2292嵌入實(shí)時(shí)操作系統(tǒng)卩COSn是一種占先式多任務(wù)操作系統(tǒng)??晒袒?、可裁減、移植性好,具有良好的可靠性和穩(wěn)定性。它支持64個(gè)任務(wù),具有信號(hào)量、消息郵箱、消息隊(duì)列等多種任務(wù)間通信機(jī)制,圖3.2說(shuō)明了卩C/OSn的結(jié)構(gòu)以及它與硬件的關(guān)系。
ApplitionSoftwareaCOSHConfiguration(AppticationSepcific)OS_CPU.HINCLUDES.Hi aCOSHaCOSHConfiguration(AppticationSepcific)OS_CPU.HINCLUDES.Hi(ProcesserIndententCode)IOS_CORE.C OS_TIME.CI — —'OS_FLAG.C uCOS_II.H!OSMBOX.CI_IOSMEM.CI _IOS_MUTEX.CiOSQ.CI —IOSSEM.CI_!OS_TASK.C卩COSHPort(ProcesserSpecificCode)OS_CPU.H、OS_CPU_A.ASM、OS_CPU_C.CSoftWareHardWareCPU Timer圖3.2C/OS-H的結(jié)構(gòu)以及它與硬件的關(guān)系aCOS-II中要移植的部分見(jiàn)表3.2所示。移植aCOS-II到一個(gè)新的體系機(jī)構(gòu)上一般需要3個(gè)文件:OS_CPU.HC語(yǔ)言頭文件)、OS_CPU_C.C(程序源文件)及OS_CPU_A.AS匯編程序源文件)。由表3.2可以看出,移植aCOS-II需要在OS_CPU.H包含幾個(gè)類(lèi)型的定義和幾個(gè)常數(shù)的定義;在OS_CPU_C.C和OS_CPU_A.AS中包含幾個(gè)函數(shù)的定義和時(shí)鐘節(jié)拍中斷服務(wù)程序的代碼。 實(shí)際上,還有一個(gè)includes.h文件需要關(guān)注,因?yàn)槊恳粋€(gè)應(yīng)用都包含獨(dú)特的includes.h文件。表3.2aCOS-II中要移植的部分移殖內(nèi)容類(lèi)型所屬文件描述BOOLEANINT8UINT8S、INT16UINT16S、INT32U數(shù)據(jù)類(lèi)型OS_CPU.h與編譯器無(wú)關(guān)的數(shù)據(jù)類(lèi)型
INT32S、FP32、FP64OS_STK數(shù)據(jù)類(lèi)型OS_CPU.h堆棧數(shù)據(jù)類(lèi)型OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()宏OS_CPU.h開(kāi)關(guān)中斷的代碼OS_STK_GROWTH常量OS_CPU.h定義堆棧增長(zhǎng)方向OS_TASK_SW函數(shù)OS_CPU.h任務(wù)切換時(shí)執(zhí)行的代碼OSTaskStkInit函數(shù)OSCPUC.c任務(wù)堆棧初始化函數(shù)OSTaskStkInit()OSTaskCreateHook()OSTaskDelHook()OSTaskSwHook()OSTaskStatHook()OSTimeTickHook()OSTimeIdleHook()函數(shù)OS_CPU_C.c卩COS-II在執(zhí)行某些操作調(diào)用的用戶函數(shù),一般為空OSStartHighRdy()函數(shù)OS_CPU_A.asmn進(jìn)入多任務(wù)環(huán)境時(shí)運(yùn)行優(yōu)先級(jí)最高的任務(wù)OSIntCtxSw()函數(shù)OSCPUA.asmn中斷級(jí)的任務(wù)切換函數(shù)OSTickISR()中斷服務(wù)函數(shù)OS_CPU_A.asmn時(shí)鐘節(jié)拍中斷服務(wù)程序根據(jù)J.Labrosse對(duì)卩COS-II移植的要求,本移植也包括 OS_CUP.hOS_CPU_C.和OS_CPU_A.三個(gè)文件。將OS_CUP_A.as更名為OS_CPU_A.是遵照ADS編譯器的慣例。實(shí)際上,還有一個(gè)文件很重要,就是 IRQ.inc,它定義了一個(gè)匯編宏,是卩COS-II為ARM71用的中斷服務(wù)程序的匯編與函數(shù)接口代碼。時(shí)鐘節(jié)拍中斷服務(wù)程序也沒(méi)有移植,因?yàn)槠渑c芯片和應(yīng)用都強(qiáng)烈相關(guān),需要用戶自己編寫(xiě),不過(guò)可以通過(guò)IRQ.S簡(jiǎn)化用戶代碼的編寫(xiě)。編寫(xiě)OS_CUP.h數(shù)據(jù)類(lèi)型定義數(shù)據(jù)類(lèi)型的修改與所使用的編譯器相關(guān),不同的編譯器使用不同的字節(jié)長(zhǎng)度表示同一數(shù)據(jù)類(lèi)型。根據(jù)ADS編譯器的要求,這些代碼定義如下:布爾變量 */無(wú)符號(hào)8位整型變量*/有符號(hào)8位整型變量*/無(wú)符號(hào)16位整型變量*/有符號(hào)16位整型變量*/無(wú)符號(hào)32位整型變量*/有符號(hào)32位整型變量*/單精度浮點(diǎn)數(shù)(32位長(zhǎng)度)*/typedefunsignedcharBOOLEAN;/*typedefunsignedcharINT8U;/*typedefsignedcharINT8S;/*typedefunsignedshortINT16U;/*typedefsignedshortINT16S;/*typedefunsignedintINT32U;/*typedefsignedintINT32S;/*typedeffloatFP32; /*
號(hào)區(qū)分不同的函數(shù)。軟件中斷功能號(hào)如表 3.3所示表3.3 軟中斷功能號(hào)功能號(hào)接口函數(shù)簡(jiǎn)介0x00voidOS_TASK_SW(void);任務(wù)級(jí)任務(wù)切換函數(shù)0x01void_OSStartHighRdy(void);運(yùn)行優(yōu)先級(jí)最高的任務(wù)0x02voidOS_ENTER_CRITICAL(void)關(guān)中斷0x03voidOS_EXIT_CRITICAL(void);開(kāi)中斷0x80voidChangeToSYSMode(void);任務(wù)切換到系統(tǒng)模式0x81voidChangeToUSRMode(void);任務(wù)切換到用戶模式0x82voidTaskIsARM(INT8Uprio);任務(wù)代碼是ARM弋碼0x83voidTaskIsTHUMB(INT8lprio);任務(wù)代碼是THUM代碼typedefdoubleFP64; /*雙精度浮點(diǎn)數(shù)(64位長(zhǎng)度)*/typedefINT32UOS_STK;/*堆棧是32typedefdoubleFP64; /*雙精度浮點(diǎn)數(shù)(64位長(zhǎng)度)*/typedefINT32UOS_STK;/*堆棧是32位寬度*/⑵使用軟件中斷SWI作底層接口為了使底層接口函數(shù)與處理器狀態(tài)無(wú)關(guān),同時(shí)在任務(wù)調(diào)用相應(yīng)的函數(shù)不需要知道函數(shù)的位置,本移植使用軟件中斷指令SWI作為底層接口,使用不同的功能底層接口函數(shù)聲明如下:__swi(0x00)voidOS_TASK_SW(void);__swi(0x01)void_OSStartHighRdy(void);__swi(0x02)voidOS_ENTER_CRITICAL(void);__swi(0x03)voidOS_EXIT_CRITICAL(void);__swi(0x80)voidChangeToSYSMode(void);__swi(0x81)voidChangeToUSRMode(void);_swi(0x82)voidTaskIsARM(INT8Uprio);_swi(0x83)voidTasklsTHUMB(INT8Uprio);用軟件中斷作為操作系統(tǒng)的底層接口就需要在 C語(yǔ)言中使用SWI指令。在ADS中,有一個(gè)關(guān)鍵字__swi,用它聲明一個(gè)不存在的函數(shù),調(diào)用這個(gè)函數(shù)就在調(diào)用這個(gè)函數(shù)的地方插入一條SWI指令,并且可以指定功能號(hào)。(3)定義堆棧增長(zhǎng)方向雖然ARM處理器可以支持堆棧向上增長(zhǎng),也可以支持堆棧向下增長(zhǎng),但是ADS的C語(yǔ)言編譯器僅支持一種方式,即從上往下增長(zhǎng)。所以定義如下:#defineOS_STK_GROWTH1OS_CPU_C.c文件OSTaskStkInit()OSTaskCreate()和OSTaskCreateExt()通過(guò)調(diào)用OSTaskStklnt()來(lái)初始
化任務(wù)的堆棧結(jié)構(gòu)。軟件中斷異常SWI服務(wù)程序C語(yǔ)言部分函數(shù)原型為voidSWI_Exception(intSWI_Num,int*regs); 參數(shù)SWI_Num為功能號(hào),而Regs為指向堆棧中保存寄存器的值的位置。程序通過(guò)一個(gè) switch語(yǔ)句把各個(gè)功能分割開(kāi),各個(gè)功能相對(duì)獨(dú)立。OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()卩COS-II使用宏OS_ENTER_CRITICAL和OS_EXIT_CRITICAL(分別關(guān)中斷和開(kāi)中斷。在ARMi理器核中關(guān)中斷和開(kāi)中斷時(shí),通過(guò)改變程序狀態(tài)寄存器CPSR中的相應(yīng)位來(lái)實(shí)現(xiàn)。由于使用了軟件中斷,程序狀態(tài)寄存器 CPSRS存到程序狀態(tài)保存寄存器SPSF中,軟件中斷退出時(shí)會(huì)將SPSR恢復(fù)到CPSF中,所以程序只要改變程序狀態(tài)保存寄存器SPSR中的相應(yīng)的控制位就可以了。OS_CPU_A.S文件(1)SoftwareInterrupt()這是軟件中斷的匯編接口,當(dāng)發(fā)生軟件中斷時(shí),程序通過(guò)異常向量表跳轉(zhuǎn)到C接口程序SoftwareInterrupt軟中斷的匯編與C接口程序SoftwareInterrupt軟中斷的匯編與LDRSP,StackSvc;STMFDSP!,{R0-R3,R12,LR}MOVR1,SP ;R1MRSR3,SPSRTSTR3,#T_bit ;LDRNEHR0,[LR,#-2] ;BICNER0,R0,#0xff00LDREQR0,[LR,#-4] ;BICEQR0,R0,#0xFF000000;r0=SWI處。軟件中斷代碼如下:重新設(shè)置堆棧指針指向參數(shù)存儲(chǔ)位置中斷前是否是Thumb犬態(tài)是:取得Thumb犬態(tài)SWI號(hào)否:取得arm狀態(tài)SWI號(hào)號(hào),R1指向參數(shù)存儲(chǔ)位置CMPR0,#1LDRLOPC,=OSIntCtxSwLDREQPC,=__OSStartHighRdy;SWI0x01 為第一次任務(wù)切換BLSWI_ExceptionLDMFDSP!,{R0-R3,R12,PC}AStackSvcDCD(SvcStackSpace+SVC_STACK_LEGTH*4-4)因?yàn)閳?zhí)行任務(wù)切換時(shí)堆棧指針會(huì)指向用戶的堆棧, 這樣下一次進(jìn)入管理模式就會(huì)破壞用戶堆棧,從而導(dǎo)致程序執(zhí)行不正確。所以程序在一開(kāi)始設(shè)置堆棧指針。軟中斷指令使處理器進(jìn)入管理模式,而用戶程序處于系統(tǒng)/用戶模式,其它異常也有自己的處理器模式,都有各自的堆棧指針,不會(huì)因?yàn)榻o堆棧指針賦值而破壞其它處理器模式的堆棧而影響其它程序的執(zhí)行。 返回的地址已經(jīng)存儲(chǔ)在連接寄存器LR中而不是存儲(chǔ)在堆棧中。由于進(jìn)入管理模式自動(dòng)關(guān)中斷,所以這段程序不會(huì)被其它程序同時(shí)調(diào)用,設(shè)置的堆棧指針指向的位置肯定是空閑位置,后一次調(diào)用不會(huì)影響前一次調(diào)用。這樣就可以保證“LDRSP,StackSvc”進(jìn)行正確的堆棧指針設(shè)置。OSCtxSw()任務(wù)級(jí)的任務(wù)切換函數(shù),當(dāng)任務(wù)被阻塞而主動(dòng)請(qǐng)求CPU調(diào)度時(shí)被執(zhí)行,由于此時(shí)的任務(wù)切換在非異常模式下進(jìn)行,因此有別于中斷級(jí)別的任務(wù)切換。它的工作是先將當(dāng)前的任務(wù)的CPU現(xiàn)場(chǎng)保存到該任務(wù)堆棧中。然后獲得最高優(yōu)先級(jí)任務(wù)的堆棧指針,從該堆棧中恢復(fù)此任務(wù)的CPU現(xiàn)場(chǎng),使之繼續(xù)執(zhí)行。這樣就完成一次任務(wù)的切換。OSIntCtxSw()中斷級(jí)的任務(wù)切換,在時(shí)鐘中斷ISR中發(fā)現(xiàn)有高優(yōu)先級(jí)任務(wù)等待時(shí)鐘信號(hào)的到來(lái),貝恠中斷退出后并不是返回被中斷的任務(wù), 而是直接調(diào)度就緒的高優(yōu)先級(jí)任務(wù)執(zhí)行(函數(shù)OSIntExitO被用來(lái)在ISR使得更高優(yōu)先級(jí)的任務(wù)處于就緒態(tài))。從而能夠盡快讓高優(yōu)先級(jí)的任務(wù)得到響應(yīng), 保證系統(tǒng)的實(shí)時(shí)性能。其基本原理與任務(wù)的切換相同。但是由于進(jìn)入中斷時(shí)已經(jīng)保存了被中斷的 CPU現(xiàn)場(chǎng),因此不用做類(lèi)似的操作,只需對(duì)堆棧指針做相應(yīng)調(diào)整。OSStartHighRdy()卩C/OS-H啟動(dòng)多任務(wù)環(huán)境的函數(shù)叫做OSStart()。用戶在調(diào)用OSStart()之前,必須已經(jīng)建立了一個(gè)或更多任務(wù)。 OSStart()最終調(diào)用OSStartHighRdy()函數(shù)運(yùn)行多任務(wù)啟動(dòng)前優(yōu)先級(jí)最高的任務(wù)。由軟中斷的匯編接口SWI_Exception()與C接口程序Softwarelnterrupt()可知,這是調(diào)用軟中斷的1號(hào)功能。這是因?yàn)锳RM處理器核具有兩個(gè)指令集,在執(zhí)行Thumb指令的狀態(tài)時(shí)不是所有寄存器都可見(jiàn),而且任務(wù)可能不在特權(quán)模式。為了兼容任意一種模式,本移植使用軟中斷指令SWI使處理器進(jìn)入管理模式和ARMt令狀態(tài),并使用功能1實(shí)現(xiàn)OSStartHighRdy的功能。卩C/OS-H中調(diào)用函數(shù)OSStartHighRdy()之前,OSTCBHighRd指向的是優(yōu)先級(jí)最高的任務(wù)的任務(wù)控制塊?!狾SStartHighRdy代碼如下:MSRCPSR_c,#(Nolnt|SYS32Mode)LDRR4,=OSRunningMOVR5,#1STRBR5,[R4]BLOSTaskSwHookLDRR6,=OSTCBHighRdyLDRR6,[R6]B OSIntCtxSw_1在卩C/OS-H中,需要用戶提供周期性信號(hào)源,用于實(shí)現(xiàn)時(shí)間延時(shí)和確認(rèn)超時(shí)。必須在多任務(wù)系統(tǒng)啟動(dòng)以后再開(kāi)啟時(shí)鐘節(jié)拍器,也就是在調(diào)用 OSStart()之后。換句話說(shuō),在調(diào)用OSStart()之后做的第一件事是初始化定時(shí)器中斷。 通常,容易犯的錯(cuò)誤是將允許時(shí)鐘節(jié)拍器中斷放在系統(tǒng)初始化函數(shù) OSInit()之后,在調(diào)用啟動(dòng)多任務(wù)系統(tǒng)啟動(dòng)函數(shù)OSStart()之前允許時(shí)鐘節(jié)拍中斷。卩C/OS-H的啟動(dòng)多任務(wù)函數(shù)OSStart()會(huì)在最后調(diào)用OSStartHighRdy,而SStartHighRdy的第一條語(yǔ)句MSRCPSR_c,#(Nolnt|SYS32Mode),是將CPSF的第8位置1,允許IRQ中斷。中斷及時(shí)鐘節(jié)拍(1) 中斷句柄HANDLER中斷句柄HANDLE可以容易的聲明中斷處理函數(shù),如在IRQ.s文件中添加中斷句柄Uart0_Handler HANDLERUART0_IR其中UART0_IRQ是中斷處理函數(shù)名,可以用語(yǔ)句VICVectAddr1=(uint32)Uart0_Handler;告知微處理器發(fā)生UART(中斷時(shí)中斷處理程序的地址。中斷句柄HANDLE是通過(guò)宏定義實(shí)現(xiàn)的。(2)中斷程序框架{OS_ENTER_CRITICAL();①清除中斷源;②通知中斷控制器中斷結(jié)束;③OS_EXIT_CRITICAL();④用戶處理代碼;}⑤程序中的①、④是必需的,因?yàn)樵谥袛喟l(fā)生之前一定是允許中斷的,如果用戶在程序③之前調(diào)用卩C/OS-H的系統(tǒng)服務(wù)函數(shù),就很可能打開(kāi)中斷,而在系統(tǒng)沒(méi)有清中斷和/或③沒(méi)有執(zhí)行的情況下就開(kāi)中斷就會(huì)造成芯片的中斷系統(tǒng)工作異常而使程序工作異常。如果用戶沒(méi)有這種情況,則可以不要程序①,而把程序④用普通的方法打開(kāi)中斷。掛接SWI軟件中斷通過(guò)在Startup.s 中設(shè)置中斷向量表的軟件中斷代碼處添加程序 LDRPC,SWI_Addr并對(duì)SWI_Addr作如下定義:SWI_AddrDCDSoftwareInterrupt每當(dāng)發(fā)生軟件中斷時(shí),程序便跳轉(zhuǎn)到軟件中斷的匯編接口程序,執(zhí)行相應(yīng)的程序。時(shí)鐘節(jié)拍通過(guò)Timer。提供時(shí)鐘節(jié)拍,Timer0中斷處理程序如下:T0IR=0x01;VICVectAddr=0;// 通知中斷控制器中斷結(jié)束OSTimeTick();TimerO的匹配寄存器的設(shè)置是,T0MR0=(Fpclk/OS_TICKS_PER_SEC);即每1/OS_TICKS_PER_SE秒發(fā)生一次中斷。信息解碼程序設(shè)計(jì)3.3.1NMEA-0183的協(xié)議標(biāo)準(zhǔn)本設(shè)計(jì)使用SRIFStarIII模塊接收GPS定位信息,該模塊遵循NMEA-0183(NationalMarineElectronicsAssociation 即國(guó)際海洋電子協(xié)會(huì))協(xié)議標(biāo)準(zhǔn)。以下分別列出NMEA-0183協(xié)議標(biāo)準(zhǔn)的輸出數(shù)據(jù)格式中的RMCGGAGSARM—RecommendedMinimumSpecificGNSSDataExample:$GPRMC,161229.487,A,3723.2475,N,12158.3416,W,0.13,309.62,120598,,*10nameexampleuintsDescriptionMessageID$GPRMCRMCprotocolheaderUTCTime161229.487hhmmss.sssStatusAA=datavalidorV=datanotvalidLatitude3723.2475ddmm.mmmmN/SIndicatorNN=northorS=southLongitude12158.3416dddmm.mmmmE/WIndicatorWE=eastorW=westSpeedOverGround0.13knotsCourseOverGround309.62degreestrueDate120598ddmmyyMagneticVariation2.degreesE=eastorW=westModeAA=Autonomous,D=DGPS,E=DRChecksum*10<CR><LF>AEndofmessageterminationGGA—GlobalPositioningSystemFixedDataExample:$GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1. 0,9.0,M,,,,0000*18NameExampleUnitsDescriptionMessageID$GPGGAGGAprotocolheader
UTCTime161229.487hhmmss.sssLatitude3723.2475ddmm.mmmmN/SIndicatorNN=northorS=southLongitude12158.3416dddmm.mmmmE/WIndicatorWE=eastorW=westPosition FixIndicator1SeeTable1-4SatellitesUsed07Range0to12HDOP1.0Horizontal Dilution ofPrecisionMSLAltitude9.0metersUnitsMmetersGeoidSeparationmetersUnitsMmetersAgeofDiff.Corr.secondNullfieldswhenDGPSisnotusedDiff.Ref.StationID0000Checksum*18<CR><LF>EndofmessageterminationGS—GNSSDOPandActiveSatellitesExample:$GPGSA,A,3,07,02,26,27,09,04,15,,,,,,1.8,1.0,1.5*33NameExampleUnitsDescriptionMessageID$GPGSAGSAprotocolheaderMode1ASeeTable1-7Mode23SeeTable1-8Satellite Used1.Satelliteusedinsolution.107SvonChannel1SatelliteUsed102SvonChannel2SatelliteUsed1SvonChannel12PDOP1.8Position Dilution ofPrecisionHDOP1.0Horizontal Dilution ofPrecisionVDOP1.5Vertical Dilution ofPrecisionChecksum*33<CR><LF>Endofmessagetermination332GPS數(shù)據(jù)結(jié)構(gòu)的定義根據(jù)GPS接收器輸出數(shù)據(jù)格式,定義保存GPS數(shù)據(jù)的結(jié)構(gòu)體,這使得容易對(duì)GPS數(shù)據(jù)進(jìn)行操作。由于各種GPS言息組成成分不一樣,所以定義不同的結(jié)構(gòu)體以下為在程序中所定義的結(jié)構(gòu)體。對(duì)于RMC言息定義如下的結(jié)構(gòu)體typedefstructGPRMC」nformation{UTCTime」nformationRMC_UTCTime;uint8FixStatus[1];Latitude」nformationRMC_Latitude;〃uint8NSInditor[1];〃Longitude」nformation RMC_Longitude;//uint8EWInditor[1];//uint8 SpeedOverGroud[10];〃uint8CourseOverGroud[10];////Date」nformationRMCDate;//uint8RMCDate[6];uint8MagneticVariation[10];//uint8Mode[1];//uint8CRC[2];uint8checkresult;}GPRMC_BUF,*P_GPRMC_BUF;該結(jié)構(gòu)體中包含了三個(gè)共用體::UTCTime_InformationtypedefunionUTCTime_Struct{uint8UTCTimeBuf[12];struct{uint8Hour[2];uint8Minute[2];uint8Second[2];uint8MilliSecond[6];}UTCTimeUnits;}UTCTime_Information;:Latitude_InformationtypedefunionLatitude_Struct{uint8LatitudeBuf[9];struct
{uint8LatDegree[2];uint8 LatMinute[2];uint8 LatMilliMinute[5];}LatitudeUnits;}Latitude_lnformation,*P_Latitude_lnformation;iii:Longitude_InformationtypedefunionLongitude_Struct{ uint8LongitudeBuf[10];struct{uint8 LonDegree[3];uint8 LonMinute[2];uint8LonMilliMinute[5];}LongitudeUnits;}Longitude_Information,*P_Longitude_Information;對(duì)于GGA言息定義如下的結(jié)構(gòu)體typedefstructGPGGA_Information{UTCTime」nformationGGA_UTCTime;〃Latitude_Information GGA_Latitude;〃uint8NSIndicator[1];〃uint8EWIndicator[1];//Longitude_InformationGGA_Longitude;//Longitude_InformationGGA_Longitude;//uint8PositionFixIndicator[1];//uint8SatellitesUse[2];〃uint8HDOP[4];〃uint8MSLAItitude[7];〃uint8uint1[1];//uint8GeoidSeparation[6];//uint8uint2[1];//uint8AgeOfDiffErr[4];//uint8DiffRefStionID[4];//uint8CRC[2];uint8checkresult;}GPGGA_BUF,*P_GPGGA_BUF;對(duì)于GSA言息定義如下的結(jié)構(gòu)體:typedefstructGPGSA_Information{uint8Mode[1];〃uint8FixMode[1];〃uint8SatelliteUse1[2];〃uint8SatelliteUse2[2];〃uint8SatelliteUse3[2];〃uint8SatelliteUse4[2];〃uint8SatelliteUse5[2];〃uint8SatelliteUse6[2];〃uint8SatelliteUse7[2];〃uint8SatelliteUse8[2];〃uint8SatelliteUse9[2];〃uint8SatelliteUse10[2];〃uint8SatelliteUse11[2];〃uint8SatelliteUse12[2];〃uint8PDOP[4];〃uint8HDOP[4];〃uint8 VDOP[4];〃uint8CRC[2];uint8checkresult;}GPGSA_BUF,*P_GPGSA_BUF;GPS信息解碼程序設(shè)計(jì)NMEA-0183協(xié)議的數(shù)據(jù)的特點(diǎn)是‘$'開(kāi)頭,‘$'后的5個(gè)字符表示信息的類(lèi)型,校驗(yàn)和是在‘*'后的2個(gè)字符,并以‘\r'、‘\n'作為結(jié)束符,針對(duì)這樣的數(shù)據(jù)結(jié)構(gòu)特點(diǎn),本設(shè)計(jì)的解碼程序采用狀態(tài)機(jī)的方法進(jìn)行解碼,定義一個(gè)枚舉類(lèi)型的解碼狀態(tài)變量status。enum{ begin_status=0,found_status,gpgga_status,gprmc_status,gpvtg_status,gpgsa_status,crc_status1,crc_status2};其中begin_status為開(kāi)始狀態(tài),表示未對(duì)PGS言息解碼,當(dāng)搜索到‘$',status轉(zhuǎn)到found_status,表示接收到GPS信息頭,接著若搜索到GPGGA則status轉(zhuǎn)到gpgga_status,表示程序處于對(duì)GGA言息解碼狀態(tài);若搜索到GPRMC則status轉(zhuǎn)到gprmc_status,表示程序處于對(duì)RMC信息解碼狀態(tài);若搜索到GPGSAUstatus進(jìn)入gpgsa_status表示程序處于對(duì)GSA言息解碼狀態(tài)。在以上的解碼狀態(tài)下,若程序搜索到‘*',status進(jìn)入保存校驗(yàn)和crc_status1狀態(tài),在此狀態(tài)下若搜索到‘\r',status 進(jìn)入校驗(yàn)和計(jì)算狀態(tài)crc_status2狀態(tài),最后status重新進(jìn)入begin_status,繼續(xù)對(duì)GPS信息解碼。(注:status也會(huì)從found_status直至退回begin_status,如當(dāng)status處于found_status時(shí),若接著搜索到的5個(gè)字符不是GPGGAGPRMCGPGSAP的字符時(shí),則status將返回begin_status。)在串口中斷服務(wù)程序里,接收$GPRM后的250個(gè)字符,在這250個(gè)字符里包含RMCGGAGSA言息,按照上面的思想編寫(xiě)GPS信息解碼程序。3.4 串口驅(qū)動(dòng)程序本設(shè)計(jì)使用LPC2292UART接收GPS1出的定位信息,LPC2292的UART0勺特點(diǎn)是具有16字節(jié)接收FIFO16字節(jié)發(fā)送FIFO,接收器FIFO觸發(fā)點(diǎn)可為1,4,8和14字節(jié),內(nèi)置波特率發(fā)生器。串口結(jié)構(gòu)圖圖3.3為L(zhǎng)PC2292UART0吉構(gòu)方框圖。圖3.3UART0方框圖UART(接收器模塊U0RX監(jiān)視串行輸入線RxD0的有效輸入。UART(Rx移位寄存器(U0RSR通過(guò)RxD0接收有效的字符。當(dāng)U0RSR8收到一個(gè)有效的字符時(shí),它將該字符傳送到UARTCRX緩沖寄存器FIFO中,等待CPU通過(guò)VPB接口進(jìn)行訪問(wèn)。UART發(fā)送器模塊U0Tx接收CPU或主機(jī)寫(xiě)入的數(shù)據(jù)并將數(shù)據(jù)緩存到UARTCTx保持寄存器FIFO(U0THR中。UARTCTx移位寄存器U0TSF讀取U0THF中的數(shù)據(jù)并將數(shù)據(jù)通過(guò)串行輸出引腳TxD0發(fā)送。串口的初始化串口初始化涉及到的寄存器有除數(shù)鎖存 U0DLLU0DLM引腳功能選擇寄存器PINSEL0UART0FIFO空制寄存器U0FCRUART(線控制寄存器U0LCR,UART0中斷使能寄存器U0IER其中除數(shù)鎖存U0DLLU0DLM是用于設(shè)置串口通訊波特率,它保存了用于產(chǎn)生波特率時(shí)鐘的VPB時(shí)鐘(pclk)分頻值。由于波特率時(shí)鐘必須是波特率的16倍,因而所設(shè)的除數(shù)鎖存U0DLLU0DLM分頻值是(Fpclk/16)/bps,bps是用戶要設(shè)置的波特率,常用波特率值是115200、57600、38400、19200……等,在本設(shè)計(jì)中使用9600的波特率與GPS模塊通訊。設(shè)置引腳功能選擇寄存器PINSEL0的1:0位與3:2位為01,使能P0.0、P0.1串口通信功能。UARTCFIFO控制寄存器U0FCR控制9UARTCRX和TXFIFO的操作,置位U0FCR的0位是使能對(duì)UART0Rx和TxFIFO以及U0FCR7:1的訪問(wèn),置位U0FCF的1位會(huì)清零,UARTdRxFIFO中的所有字節(jié)并復(fù)位指針邏輯,置位U0FCF的2位清零UARTCTxFIFO中的所有字節(jié)并復(fù)位指針邏輯,設(shè)置U0FCR勺7:6位為10選擇觸發(fā)點(diǎn)2,默認(rèn)8個(gè)字節(jié)觸發(fā)。UART(線控制寄存器U0LCR決定發(fā)送與接收數(shù)據(jù)字符的格式,本設(shè)計(jì)中設(shè)置U0LCR的1:0位為11,即8位字符長(zhǎng)度,1個(gè)停止位,無(wú)奇偶產(chǎn)生和校驗(yàn)置位。設(shè)置UART0中斷使能寄存器U0IER的位0為1,使能RDA中斷。串口初始化代碼:PINSEL0'=(PINSEL0&0xfffffff0)|5;U0LCR=:0x80;//允許訪問(wèn)分頻因子寄存器Fdiv=(Fpclk/16)/bps;//設(shè)置波特率U0DLM=:Fdiv/256;U0DLL=Fdiv%256;U0LCR=:0x03;//禁止訪問(wèn)分頻因子寄存器//且設(shè)置為8,1,nU0FCR=:0x87;//初始化FIFOU0IER=0x01;//串口接收數(shù)據(jù)程序設(shè)計(jì)本設(shè)計(jì)采用中斷方式接收GPS接收機(jī)輸出到串口的數(shù)據(jù),為了使用中斷接收數(shù)據(jù),除了對(duì)U0IER寄存器設(shè)置之外,還要對(duì)向量中斷控制器(VIC)進(jìn)行設(shè)置。向量中斷控制器(VIC)向量中斷控制器(VIC)的特點(diǎn)是:具有32個(gè)中斷請(qǐng)求輸入,可將其編程分為3類(lèi):FIQ、向量IRQ和非向量IRQ??删幊谭峙錂C(jī)制意味著不同外設(shè)的中斷優(yōu)先級(jí)可以動(dòng)態(tài)分配并調(diào)整??焖僦袛嗾?qǐng)求(FIQ)要求具有最高優(yōu)先級(jí)。如果分配給FIQ的請(qǐng)求多于1個(gè),VIC將中斷請(qǐng)求“相或”后向ARM處理器產(chǎn)生FIQ信號(hào)。當(dāng)只有一個(gè)中斷被分配為 FIQ時(shí)可實(shí)現(xiàn)最短的FIQ等待時(shí)間,因?yàn)镕IQ服務(wù)程序只要簡(jiǎn)單地啟動(dòng)器件的處理就可以了。 但如果分配給FIQ級(jí)的中斷多于1個(gè),F(xiàn)IQ服務(wù)程序從VIC中讀出一個(gè)字來(lái)識(shí)別產(chǎn)生中斷請(qǐng)求的 FIQ中斷源是哪一個(gè)。向量IRQ具有中等優(yōu)先級(jí)。該級(jí)別可分配32個(gè)請(qǐng)求中的16個(gè)。32個(gè)請(qǐng)求中的任意一個(gè)都可分配到16個(gè)向量IRQslot中的任意一個(gè),其中slotO具有最高優(yōu)先級(jí),而slot15貝U為最低優(yōu)先級(jí)。非向量IRQ的優(yōu)先級(jí)最低。VIC將所有向量和非向量IRQ“相或”向ARMi理器產(chǎn)生IRQ信號(hào)。IRQ服務(wù)程序可通過(guò)讀取VIC的一個(gè)寄存器立即啟動(dòng)并跳轉(zhuǎn)到相應(yīng)地址。如果有任意一個(gè)向量 IRQ發(fā)出請(qǐng)求,VIC則提供最高優(yōu)先級(jí)請(qǐng)求IRQ服務(wù)程序的地址,否則提供所默認(rèn)程序的地址。該默認(rèn)程序由所有非向量IRQ共用。默認(rèn)程序可讀取任何VIC寄存器以確定哪個(gè)IRQ被激活設(shè)置UART沖斷把UART(設(shè)置為向量中斷,代碼如下:VICVectAddrl=(uint32)Uart0_Handler;VICVectCntl1=(0x20|0x06);VICIntEnable=1<<6;LPC2292執(zhí)行UART沖斷過(guò)程在UART0接收中斷請(qǐng)求產(chǎn)生之后,微控制器切換到管理模式并跳轉(zhuǎn)到地址0x00000018執(zhí)行代碼,在啟動(dòng)代碼中,把0x00000018地址處設(shè)置的執(zhí)行代碼是LDRPC,[PC,#-0xff0] ,該指令將VICVectAddr寄存器中保存的地址裝入PC,此時(shí)VICVectAddr的值和VICVectAddr1的值相同,由于VICVectAddr1存放了UART沖斷處理程序的地址,因而LPC2292將執(zhí)行UART(中斷處理程序。UART0中斷處理程序每當(dāng)GPS接收器把數(shù)據(jù)輸出到LPC2292時(shí),UART0中斷處理程序把接收到數(shù)據(jù)存放到Gps_Data中,Gps_Data為自定義結(jié)構(gòu)體變量:typedefstructData_Buf{uint32 writepoint;uint32 readpoint;uint8RecGpsData[MaxRecDat];}RecData,*P_RecData;RecDataGps_Data;UART(中斷處理程序示例代碼:voidUART0_IRQ(void){uint8i,j,k;i=U0IIR;OS_ENTER_CRITICAL();while(((i=U0IIR)&0x01)==0){switch(i&0x0e){case0x02:break;case0x04:case0x0c:while((U0LSR&0x01)!=0){gps_Data.RecGpsData[Gps_Data.writepoint++]=U0RBR;if(Gps_Data.writepoint>=MaxRecDat)Gps_Data.writepoint=0;}break;case0x06:k=U0LSR;break;default:break;}}VICVectAddr=0;OS_EXIT_CRITICAL();}當(dāng)發(fā)生UART(中斷時(shí),讀取UART(中斷標(biāo)識(shí)寄存器U0IIR寄存器,若沒(méi)有中斷掛起時(shí),處理器直接退出中斷處理程序,若至少有一個(gè)中斷掛起時(shí),處理器繼續(xù)判斷,若中斷標(biāo)識(shí)為接收數(shù)據(jù)可用或字符超時(shí)指示時(shí),從UART0接收器緩存寄存器U0RF讀取數(shù)據(jù)存放到gps_Data中,直到UART(線狀態(tài)寄存器U0LSR的0位為0即U0RBM空。3.5鍵盤(pán)處理程序在本設(shè)計(jì)中,采用ZLG7290檢測(cè)鍵盤(pán),ZLG7290是標(biāo)準(zhǔn)的IIC串行器件,ZLG7290的I2C接口傳輸速率可達(dá)32kbit/s,容易與處理器接口并提供鍵盤(pán)中斷信號(hào)提高主處理器時(shí)間效率,ZLG7290的從地址slaveaddress為70H(01110000B)。3.5.1I2C總線LPC2292的I2C總線接口的特點(diǎn):標(biāo)準(zhǔn)的I2C總線接口,可配置為主機(jī)、從機(jī)或主/從機(jī),可編程時(shí)鐘可實(shí)現(xiàn)通用速率控制,主機(jī)從機(jī)之間雙向數(shù)據(jù)傳輸,多主機(jī)總線(無(wú)中央主機(jī)),同時(shí)發(fā)送的主機(jī)之間進(jìn)行仲裁,避免了總線數(shù)據(jù)的沖突,串行時(shí)鐘同步使器件在一條串行總線上實(shí)現(xiàn)不同位速率的通信,串行時(shí)鐘同步可作為握手機(jī)制使串行傳輸掛起和恢復(fù),I2C總線可用于測(cè)試和診斷。I2C總線上傳輸數(shù)據(jù)的類(lèi)型:I2C總線上存在兩種類(lèi)型的數(shù)據(jù)傳輸i:主發(fā)送器向從接收器發(fā)送數(shù)據(jù)。主機(jī)發(fā)送的第一個(gè)字節(jié)是從機(jī)地址。接下來(lái)是數(shù)據(jù)字節(jié)流。從機(jī)每接收一個(gè)字節(jié)返回一個(gè)應(yīng)答位。ii:從發(fā)送器向主接收器發(fā)送數(shù)據(jù)。第一個(gè)字節(jié)(從地址)由主機(jī)發(fā)送。從機(jī)返回一個(gè)應(yīng)答位。接下來(lái)從機(jī)向主機(jī)發(fā)送數(shù)據(jù)字節(jié)。主機(jī)每接收一個(gè)字節(jié)返回一個(gè)應(yīng)答位。接收完最后一個(gè)字節(jié),主機(jī)返回一個(gè)“非應(yīng)答位” 。主器件產(chǎn)生所有串行時(shí)鐘脈沖和起始以及停止條件。出現(xiàn)停止條件或重復(fù)的起始條件時(shí)傳輸結(jié)束。由于重復(fù)的起始條件同時(shí)是下一個(gè)串行發(fā)送的開(kāi)始,因此I2C總線不會(huì)被釋放。I2C操作模式:有4種操作模式:主發(fā)送器模式、主接收器模式、從發(fā)送器模式和從接收器模式。主發(fā)送器模式:在該模式中,數(shù)據(jù)從主機(jī)發(fā)送到從機(jī)。在進(jìn)入主發(fā)送器模式之前,I2CONSE■必須按照表3.4進(jìn)行初始化。必須置位I2EN來(lái)使能I2C功能。如果AA位為0,而另一個(gè)器件成為總線的主控器時(shí),I2C將不會(huì)對(duì)任何地址產(chǎn)生應(yīng)答。也就是說(shuō)它無(wú)法進(jìn)入從模式。STASTO和SI必須設(shè)置為0。向I2CONCLR寄存器中的SIC位寫(xiě)入1可清零SI。表3.4主模式配置位76543210位名--I2ENSTASTOSIAA----值--01000----I2EN=1,使能I2C接口;AA=0,不產(chǎn)生應(yīng)答信號(hào),即不允許進(jìn)入從機(jī)模式;SI=0,I2C中斷標(biāo)志為0;STO=0停止標(biāo)志為0;STA=0起始標(biāo)志為1。主模式I2C的數(shù)據(jù)格式見(jiàn)圖3.4,起始和停止條件用于指示串行傳輸?shù)钠鹗己徒Y(jié)束。第一個(gè)發(fā)送的數(shù)據(jù)包含接收器件的從地址(7位)和讀寫(xiě)操作位。在此模式下,讀寫(xiě)操作模式位(R/W)應(yīng)該為0,表示執(zhí)行寫(xiě)操作。數(shù)據(jù)的發(fā)送每次8位,即一字節(jié),每發(fā)送完一字節(jié),主機(jī)都收到一個(gè)應(yīng)答位(從機(jī)回發(fā)的)?!瑼(圖…A(圖3.4該模式的數(shù)據(jù)發(fā)送操作步驟是:“1”寫(xiě)從地址據(jù)中的格式據(jù)應(yīng)答「A/A27=/應(yīng)答(SDA為低)/A=非應(yīng)答(SDA為高)$=起始條件卩=停止條件A:通過(guò)軟件置位STA進(jìn)入I2C主發(fā)送器模式,I2C邏輯在總線空閑后立即發(fā)送一個(gè)起始條件。B:當(dāng)發(fā)送完起始條件后,SI位置位。此時(shí)I2STAT(狀態(tài)寄存器)中的狀態(tài)代碼為08H,該狀態(tài)代碼用于中斷服務(wù)程序的處理。C:把從地址和寫(xiě)方向位裝入 I2DAT(數(shù)據(jù)寄存器),然后清零SI位(向I2CONCL寄存器中得SIC位寫(xiě)入1可清零SI),開(kāi)始發(fā)送從地址和寫(xiě)方向位。D:當(dāng)從地址和寫(xiě)方向位已發(fā)送且接收到應(yīng)答位后, SI位再次置位(可能的狀態(tài)代碼為18H,20H或38H)。E:當(dāng)狀態(tài)碼為18H時(shí),表明從機(jī)已應(yīng)答,則可以將數(shù)據(jù)裝入I2DAT,然后清零SI位,開(kāi)始發(fā)送數(shù)據(jù)。F:當(dāng)正確發(fā)送數(shù)據(jù),SI位再次置位(可能的狀態(tài)碼為28H,30H)。此時(shí)可以再次發(fā)送數(shù)據(jù)或者置位STO結(jié)束總線。每個(gè)狀態(tài)代碼及其執(zhí)行的相應(yīng)動(dòng)作如表3.5所示。主模式I2C的數(shù)據(jù)發(fā)送程序原理示意圖如圖3.5所示。表3.5 主發(fā)送器模式中的格式狀I(lǐng)2C總線應(yīng)用軟件的響應(yīng)I2C硬件執(zhí)行的下一個(gè)動(dòng)作態(tài)代碼(I2STAT)硬件狀態(tài)讀/寫(xiě)I2DATSTA寫(xiě)12(STO;O卜SIJAA08H已發(fā)送起始條件裝入SLA+Wx00x將發(fā)送SLA+W10H已發(fā)送重復(fù)裝入SLA+Wx00x同上起始條件裝入SLA+Rx00x將發(fā)送SLA+W,I2(切換到主機(jī)接收模式18H已發(fā)送裝入的數(shù)據(jù)000x將發(fā)送數(shù)據(jù)字節(jié),接收ACKS
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年深圳中考語(yǔ)文高分沖刺綜合試卷(附答案可下載)
- 2026年魯教版生物八年級(jí)下冊(cè)期中質(zhì)量檢測(cè)卷(附答案解析)
- 2026-2032年中國(guó)石英掩模版行業(yè)市場(chǎng)全景分析及投資機(jī)會(huì)研判報(bào)告
- 水庫(kù)管理人員培訓(xùn)課件
- 水庫(kù)供水知識(shí)課件
- 創(chuàng)業(yè)板基礎(chǔ)知識(shí)課件
- 消防安全黨校培訓(xùn)計(jì)劃
- 體制內(nèi)離職溝通話術(shù)
- 2026年財(cái)務(wù)稅務(wù)培訓(xùn)合同協(xié)議
- 科研經(jīng)驗(yàn)分享心得
- 5年(2021-2025)山東高考生物真題分類(lèi)匯編:專(zhuān)題17 基因工程(解析版)
- 新華資產(chǎn)招聘筆試題庫(kù)2025
- 智能化項(xiàng)目驗(yàn)收流程指南
- 搶劫案件偵查課件
- 2026年遼寧軌道交通職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)必考題
- 老年人遠(yuǎn)離非法集資講座
- 沙子石子采購(gòu)合同范本
- 軍采協(xié)議供貨合同范本
- 2025年醫(yī)院年度應(yīng)急演練計(jì)劃表
- 2024年新高考Ⅰ卷英語(yǔ)真題(原卷+答案)
- 機(jī)械安裝安全培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論