<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 汽車(chē)電子 > 設計應用 > 基于WiFi的車(chē)載終端遠程軟件升級方法

基于WiFi的車(chē)載終端遠程軟件升級方法

作者: 時(shí)間:2016-10-22 來(lái)源:網(wǎng)絡(luò ) 收藏

⑤Error(ERROR);

本文引用地址:http://dyxdggzs.com/article/201610/309975.htm

⑥OACK。

目前常用的是前5種。由于系統只需實(shí)現終端從數據采集設備上下載軟件文件,無(wú)需實(shí)現完整的TFTP協(xié)議,僅實(shí)現上述第1、3、4、5類(lèi)數據包功能即可。主要定義以下4個(gè)接口函數:

①RRQ發(fā)送接口函數定義:

void tftpReadQuerry(void);

該函數用于終端發(fā)送讀文件請求,數據采集設備收到該包將發(fā)送文件數據包給終端;

②數據包接收接口函數定義:

void tftp_recvpacket(void);

該函數用于接收數據采集設備發(fā)送到的包,根據包類(lèi)型分別對ERROR包、DATA包進(jìn)行處理。如果是ERROR包則需要重新傳輸文件,本次傳輸失敗。如果是DATA包,則校驗后根據包號存儲到FLASH指定位置,然后調用發(fā)送ACK函數回復ACK。掉包、錯包等的錯誤處理也在該函數執行;

③ACK發(fā)送接口函數定義:

void tftpSendAck(unsigned char BlockNo[2]);

該函數用于根據接收到的包的編號回復ACK。

④ERROR包接口函數定義:

void tftpSendErr(unsigned char BlockNo[2]);

該函數用于返回傳輸錯誤信息。

文件傳輸實(shí)現流程如下:

①數據采集設備在端口為69的UDP上等待終端發(fā)出讀文件請求包;

②終端通過(guò)UDP發(fā)送符合TFTP請求格式的RRQ包給數據采集設備;

③數據采集設備收到終端的這個(gè)請求包后,將直接發(fā)送DATA包給終端,這個(gè)DATA包中含數據采集設備選擇的TID作為UDP的源端口和終端的TID作為UDP目標端口,起始包號為1,往后包號逐次加1。

④終端接收來(lái)自數據采集設備的DATA包并回復ACK。直到請求完成。

傳輸過(guò)程中的掉包或包錯誤會(huì )導致重傳,重傳不超過(guò)三次,否則認為傳輸失敗。傳輸過(guò)程中的錯誤,會(huì )觸發(fā)發(fā)送ERROR包。ERROR包的錯誤代碼值供程序員分析使用。

(4)拷貝軟件到應用程序區

軟件正確的下載到臨時(shí)區后,需要拷貝到應用程序區。該部分關(guān)鍵部分在于內嵌FLASH的擦除與讀寫(xiě)。

F107內嵌FLASH是通過(guò)分頁(yè)機制來(lái)實(shí)現對尋址空間的擴展和FLASH頁(yè)面的使用和管理的。所以對FLASH的擦除操作需要按頁(yè)進(jìn)行擦除。即擦除FLASH不能擦除某一字節或一次擦除小于一頁(yè)(2048字節)。

FLASH擦除的具體步驟:

①解鎖FLASH編程控制寄存器;

②定位要擦除的扇區;

③寫(xiě)扇區擦除命令;

④等待命令執行完成;

⑤鎖定FLASH編程控制寄存器。

對FLASH執行寫(xiě)操作步驟如下:

①解鎖FLASH編程控制寄存器;

②向指定的地址寫(xiě)若干字數據;

③等待上一條命令執行完成;

④如果未寫(xiě)完數據,則遞增源地址和目標地址,重復步驟②和③;

⑤鎖定FLASH編程控制寄存器。

(5)軟件跳轉應用程序區

應用程序準備好后,程序需要從BOOT區跳轉到應用程序區首地址處執行應用程序。這里分為兩步:

①修改中斷向量表位置。由于F107采用ARM Cortex—M3內核,該內核的系統控制空間中寫(xiě)中斷向量表的寄存器地址NVIC_VectTaD_ Addr為0xE000ED08,在該地址寫(xiě)入應用程序起始地址即可,本程序應用程序起始地址APP_START_ADDRESS為0x08005000。設計如下:

ldr r0,=0x08005000

ldr r1,=0xe000ed08

Str r0, [r1]

②跳轉到應用程序首地址處執行應用程序。該步驟完成堆棧指針和程序指針(PC)的修改。在上述匯編代碼之后,通過(guò)以下方式實(shí)現:

;從應用程序向量表中載入堆棧指針

ldr r1, [r0]

mov sp,r1

;從應用程序向量表中初始化程序指針(PC),并跳轉到應用程序

;入口

ldr r0, [r0,#4]

bx r0

為保證軟件升級錯誤不導致系統崩潰,將終端程序隔離為引導程序(BOOT區程序)及應用程序兩部分,如單次軟件升級失敗仍可進(jìn)行再次升級。兩部分程序分別在Keil中編譯,并把BOOT區程序燒寫(xiě)在FLASH首地址0x08005000處,以便終端啟動(dòng)直接進(jìn)入BOOT區。用于應用程序編譯夾梟瓚ㄉ招吹刂肺應用程序區首地址,并生成bin文件以便直接下載到FLASH中即可運行。

結語(yǔ)

該方法實(shí)現了采用通信方式,通過(guò)TFTP協(xié)議將編譯后的軟件文件下載到終端設備,完成軟件升級的功能。在嵌入式系統領(lǐng)域,程序升級可以方便地對程序缺陷進(jìn)行彌補和修改,或對程序功能進(jìn)行擴充,運用該方法可極大提高產(chǎn)品的生存周期,節省對項目的維護成本和提高了開(kāi)發(fā)效率。

基于該方法已成功設計出可遠程程序的車(chē)輛管理系統。使用情況表明,該系統能穩定、可靠地工作,且為系統的維護節省了大量的工作量,對同類(lèi)型的軟件設汁有很好的參考價(jià)值。


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>