<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è) > 嵌入式系統 > 設計應用 > LPC1768 IAP升級解析及例程分享

LPC1768 IAP升級解析及例程分享

作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò ) 收藏
1、IAP介紹

IAP即“inapplicatinprogramming”在應用編程的縮寫(xiě),指MCU可以在系統中獲取新代碼并對自己重新編程,即改變應用程序。它與我們所熟悉的ISP編程不同, LPC1768 的ISP編程接口為串口1,如果使用其他的串口或其他總線(xiàn)則不能對其進(jìn)行編程。而我們這里所說(shuō)的IAP通過(guò)下載一段引導程序Bootloader程序,如果我們想要從串口2或網(wǎng)口更新應用程序,在Bootloader中初始化相應的串口或網(wǎng)口,使其接收應用程序,將接收到的應用程序寫(xiě)入到Flash里面,IAP完成后跳轉到應用程序入口執行應用程序。所以現在的IAP程序涉及到兩個(gè)概念:Bootloader和應用程序。

本文引用地址:http://dyxdggzs.com/article/201611/319433.htm

Bootloader:BootLoader就是在操作系統內核運行之前運行的一段小程序。通過(guò)這段小程序,我們可以初始化硬件設備、建立內存空間映射圖,從而將系統的軟硬件環(huán)境帶到一個(gè)合適狀態(tài),以便為最終調用操作系統內核準備好正確的環(huán)境。這里我們所說(shuō)的Bootloader也是系統開(kāi)機前的一段小程序,其主要任務(wù)是用來(lái)初始化串口和IAP端口(網(wǎng)口CAN接口等)的,通過(guò)判斷狀態(tài)是否需要從IAP端口進(jìn)行更新應用程序,若需要更新則從端口接收應用程序,并存放到指定的Flash里面,更新完成后則跳入到指定的Flash里面執行應用程序。

應用程序:即我們需要開(kāi)發(fā)板實(shí)現功能的程序,其中應用程序主要分為兩種:hex文件和bin文件。在我們經(jīng)常使用的KEIL中默認編譯生成的可執行文件(應用程序)為hex格式的,若需要編譯生成bin格式需要做如下修改,加入“D:KeilARMARMCCbinfromelf.exe--bin--output./Obj/Can_Updata.bin./Obj/test.axf”,重新編譯生成的Can_Updata.bin文件存放在Obj文件夾下。


2、bin格式文件與hex格式文件的區別

bin格式文件是純粹的二進(jìn)制文件,使用下載其將其下載到開(kāi)發(fā)板時(shí)其內容完全不變,所以對于IAP下載使用bin格式文件是比較方便的,如下圖是bin文件的內容與寫(xiě)入到開(kāi)發(fā)板后使用仿真器觀(guān)察到Flash存放的內容(這段程序當然是可以執行的)。

Hex格式文件:Hex全稱(chēng)(IntelHEX)文件是由一行行符合IntelHEX文件格式的文本所構成的ASCII文本文件。在IntelHEX文件中,每一行包含一個(gè)HEX記錄。這些記錄由對應機器語(yǔ)言碼和/或常量數據的十六進(jìn)制編碼數字組成。如下圖是hex文件的部分數據,其組成由“:CCAAAARR...ZZ”,CC=10代表長(cháng)度為16字節,AAAA=0000本條記錄中的數據在存儲區中的起始地址,RR=00,數據區,ZZ=38為校驗,這里就不做仔細說(shuō)明了。

3、LPC1768IAP原理

LPC1768復位后開(kāi)始執行Boot代碼,Boot代碼可以執行ISP程序或用戶(hù)的應用代碼。發(fā)生硬件復位后,P2.10引腳為低電平,這就被當作啟動(dòng)ISP命令處理器的外部硬件請求。假定在/RESET引腳上出現上升沿時(shí),電源引腳出現正確的信號,那么在采樣P2.10之前有3ms的時(shí)間決定是執行用戶(hù)代碼還是ISP處理程序。如果P2.10為低電平且看門(mén)狗溢出標志置位,那么忽略啟動(dòng)ISP命令處理器的外部硬件請求。在沒(méi)有ISP命令處理器的請求(硬件復位后P2.10引腳為高電平)時(shí),將搜索有效的用戶(hù)程序。若發(fā)現有效的用戶(hù)程序,執行控制權就被轉移給用戶(hù)程序。若沒(méi)有找到有效的用戶(hù)程序,就將調用自動(dòng)波特率程序。這里不討論ISP下載及命令,有興趣的朋友可以查看LPC1768技術(shù)手冊第三十二章ISP命令。

在IAP升級中,程序正常執行即用戶(hù)代碼(這里的用戶(hù)代碼是我們所說(shuō)的IAP引導程序),如下是IAP升級流程圖,程序將預留端口(這里提供有串口和CAN總線(xiàn)接口兩種)接收到的APP程序bin文件,將接收到的數據寫(xiě)入到指定的Flash區域(例程APP地址為0x00010000),程序通過(guò)IAP命令將數據寫(xiě)入到Flash里面,LPC1768提供了一系列IAP命令對片內Flash進(jìn)行擦除編寫(xiě)等。

4、IAP命令

LPC1768通過(guò)IAP函數對片內Flash進(jìn)行操作,IAP函數是固化在0x1FFF1FF1處的一個(gè)有傳入參數和返回參數的一個(gè)函數,在LPC1768技術(shù)手冊第三十二章IAP命令中有有詳細的說(shuō)明。主要提供有如下命令:準備下操作扇區、將RAM內容復制到Flash、清除扇區、扇區查空、讀器件ID、讀boot版本、比較、重新調用ISP等。

?體; ????Sx?S??的外部硬件請求。假定在/RESET引腳上出現上升沿時(shí),電源引腳出現正確的信號,那么在采樣P2.10之前有3ms的時(shí)間決定是執行用戶(hù)代碼還是ISP處理程序。如果P2.10為低電平且看門(mén)狗溢出標志置位,那么忽略啟動(dòng)ISP命令處理器的外部硬件請求。在沒(méi)有ISP命令處理器的請求(硬件復位后P2.10引腳為高電平)時(shí),將搜索有效的用戶(hù)程序。若發(fā)現有效的用戶(hù)程序,執行控制權就被轉移給用戶(hù)程序。若沒(méi)有找到有效的用戶(hù)程序,就將調用自動(dòng)波特率程序。這里不討論ISP下載及命令,有興趣的朋友可以查看LPC1768技術(shù)手冊第三十二章ISP命令。

5、串口IAP升級

本例程是根據官方提供的串口IAP更新圖片進(jìn)行修改而來(lái),直接使用官方的IAP.c文件,該文件中提供了如上圖IAP命令的各種函數,其具體參數可以參考IAP命令。根據官方例程里面將bmp圖片經(jīng)過(guò)串口采用Xmodem1K協(xié)議發(fā)送到開(kāi)發(fā)板存放在地址0x00010000,如下圖是LPC1768Flash分配地址,第16~21扇區為應用程序存放空間。這里我們將要傳送的bmp圖片改為傳輸應用程序bin文件

?體;q?kr?Sx?S255,255,255); mso-shading:rgb(255,255,255); " >扇區查空、讀器件ID、讀boot版本、比較、重新調用ISP等。

?體; ????Sx?S??的外部硬件請求。假定在/RESET引腳上出現上升沿時(shí),電源引腳出現正確的信號,那么在采樣P2.10之前有3ms的時(shí)間決定是執行用戶(hù)代碼還是ISP處理程序。如果P2.10為低電平且看門(mén)狗溢出標志置位,那么忽略啟動(dòng)ISP命令處理器的外部硬件請求。在沒(méi)有ISP命令處理器的請求(硬件復位后P2.10引腳為高電平)時(shí),將搜索有效的用戶(hù)程序。若發(fā)現有效的用戶(hù)程序,執行控制權就被轉移給用戶(hù)程序。若沒(méi)有找到有效的用戶(hù)程序,就將調用自動(dòng)波特率程序。這里不討論ISP下載及命令,有興趣的朋友可以查看LPC1768技術(shù)手冊第三十二章ISP命令。

在IAP升級中,程序正常執行即用戶(hù)代碼(這里的用戶(hù)代碼是我們所說(shuō)的IAP引導程序),如下是IAP升級流程圖,程序將預留端口(這里提供有串口和CAN總線(xiàn)接口兩種)接收到的APP程序bin文件,將接收到的數據寫(xiě)入到指定的Flash區域(例程APP地址為0x00010000),程序通過(guò)IAP命令將數據寫(xiě)入到Flash里面,LPC1768提供了一系列IAP命令對片內Flash進(jìn)行擦除編寫(xiě)等。在IAP升級中,程序正常執行即用戶(hù)代碼(這里的用戶(hù)代碼是我們所說(shuō)的IAP引導程序),如下是IAP升級流程圖,程序將預留端口(這里提供有串口和CAN總線(xiàn)接口兩種)接收到的APP程序bin文件,將接收到的數據寫(xiě)入到指定的Flash區域(例程APP地址為0x00010000),程序通過(guò)IAP命令將數據寫(xiě)入到Flash里面,LPC1768提供了一系列IAP命令對片內Flash進(jìn)行擦除編寫(xiě)等。

5、串口IAP程序分析

例程通過(guò)按鍵對開(kāi)發(fā)板進(jìn)行控制,INT0鍵擦除Flash,確認鍵等待串口IAP,向上鍵顯示菜單,向下鍵執行應用程序,使用LCD來(lái)開(kāi)發(fā)板狀態(tài),其主函數如下

intmain(void)

{

uint32_tints[4];

SystemClockUpdate();

LCD_BSP_Init(); //LCD初始化

LCD_Clear(Black);

LCD_SetBackColor(Black);

LCD_SetTextColor(White);

cmd=MENU; //命令狀態(tài)初始化,顯示菜單

while(1)

{

switch(cmd)

{

caseREADY:

if (!(LPC_GPIO2->FIOPIN&(1<<10)))

{

Screen_Fresh("ErasingImages...");

cmd=ERASE_FLASH;

}

elseif(!(LPC_GPIO1->FIOPIN&(1<<29)))

{

cmd=MENU;

}

elseif(!(LPC_GPIO1->FIOPIN&(1<<25)))

{

Screen_Fresh("WaitingforXMODEMXfer...");

cmd=FLASH_IMG;

}

elseif(!(LPC_GPIO1->FIOPIN&(1<<26)))

{

Screen_Fresh("Executeprogram");

cmd=SHOW;

}

break;

caseMENU:

if(u32IAP_ReadBootVersion(&ints[0],&ints[1])==IAP_STA_CMD_SUCCESS)

{

snprintf((char*)string[0],MAX_STRING_SIZE,"BootCodeversion%d.%d",ints[0],ints[1]);

}

if(u32IAP_ReadPartID(&ints[0])==IAP_STA_CMD_SUCCESS)

{

snprintf((char*)string[1],MAX_STRING_SIZE,"PartID:%d(%#x)",ints[0],ints[0]);

}

u32IAP_ReadSerialNumber(&ints[0],&ints[1],&ints[2],&ints[3]);

snprintf((char*)string[2],MAX_STRING_SIZE,"Serial#:X:X:X:X",ints[0],ints[1],ints[2],ints[3]);

Screen_Fresh("Menu");

cmd=READY;

break;

caseERASE_FLASH:

if((u32IAP_PrepareSectors(16,20)==IAP_STA_CMD_SUCCESS)&&

(u32IAP_EraseSectors(16,20)==IAP_STA_CMD_SUCCESS))

Screen_Fresh("EraseDone");

else

Screen_Fresh("EraseFAIL");

cmd=READY;

break;

caseFLASH_IMG:

received_data=0;

vXmodem1k_Client(&load_image);

Screen_Fresh("UpdataComplete");

cmd=READY;

break;

caseSHOW:

Boot();

cmd=READY;

break;

}

}

}

當串口接收到數據后將數據寫(xiě)入到Flash,其寫(xiě)入步驟是:發(fā)送準備寫(xiě)扇區命令,執行RAM內容復制到Flash最后比較復制內容,其代碼如下:

staticuint32_tload_image(uint8_t*data,uint16_tlength)

{

if(length>0){

if(u32IAP_PrepareSectors(16,20)==IAP_STA_CMD_SUCCESS)

{

if(u32IAP_CopyRAMToFlash(IMG_START_SECTOR+received_data,(uint32_t)data,length)==IAP_STA_CMD_SUCCESS)

{

if(u32IAP_Compare(IMG_START_SECTOR+received_data,(uint32_t)data,length,0)==IAP_STA_CMD_SUCCESS)

{

received_data+=length;

return1;

}

}

}

Screen_Fresh("FAIL(RESET&ERASEIMAGE)");

return0;

}

else

return0;

}

當程序全部寫(xiě)入到Flash后,按下向下按鍵,跳轉到應用程序,首先修改中斷向量表然后進(jìn)入應用程序

voidBoot(void)

{

SCB->VTOR=IMG_START_SECTOR&0x1FFFFF80; //修改中斷向量表

JMP_Boot(IMG_START_SECTOR);

}

堆棧地址更新,PC地址更新

__asmvoidJMP_Boot(uint32_taddress){

LDRSP,[R0] ;堆棧地址更新

LDRPC,[R0,#4] ;進(jìn)入應用程序

}

7、操作步驟及實(shí)驗現象

1、下載“寶馬開(kāi)發(fā)板串口IAP升級”例程,插上USB轉串口線(xiàn),打開(kāi)超級終端,復位開(kāi)發(fā)板。

2、按下按鍵INT0按鍵--擦除扇區

3、按下方向鍵確認鍵--等待從串口接收程序

4、串口打印‘C’字符等待接收數據

5、串口發(fā)送文件,選擇“1K Xmodem”協(xié)議,選擇要下載的應用程序bin文件,這里使用DAC例程作為測試。

6、發(fā)送文件

7、按下方向鍵向下鍵開(kāi)始執行應用程序,可以用示波器測試P0.26輸出正弦波信號

bin文件生成方法及設置:

打開(kāi)要更新應用程序工程,這里使用“IAP升級DAC轉換”程序,設置ROM空間地址(程序下載到Flash的地址),這里也是我們應用程序的入口地址0x10000

打開(kāi)User選項,利用Keil自帶的fromelf.exe生成bin文件,bin文件保存在Obj文件夾中,如下圖添加“D:KeilARMARMCCbinfromelf.exe--bin--output./Obj/app.bin./Obj/app.axf”,輸入文件為app.axf,所以工程編譯生成輸出文件名設置為app,命令執行生成app.bin文件

打開(kāi)Asm選項,定義“NO_CRP”,我們可以打開(kāi)啟動(dòng)文件,當定義了“NO_CRP”后,那么我們后面的代碼也就不起作用了,所以在需要加密的時(shí)候前面就一定不能再定義了代碼讀保護,也就是加密的關(guān)鍵字,經(jīng)過(guò)加密后芯片再也無(wú)法擦除,由于我們這里程序需要使用到IAP升級,因此添加此定義

8、CAN總線(xiàn)

CAN是ControllerAreaNetwork的縮寫(xiě)(以下稱(chēng)為CAN),是ISO國際標準化的串行通信協(xié)議。在汽車(chē)產(chǎn)業(yè)中,出于對安全性、舒適性、方便性、低公害、低成本的要求,各種各樣的電子控制系統被開(kāi)發(fā)了出來(lái)。CAN屬于現場(chǎng)總線(xiàn)的范疇,它是一種有效支持分布式控制或實(shí)時(shí)控制的串行通信網(wǎng)絡(luò )。較之許多RS-485基于R線(xiàn)構建的分布式控制系統而言,基于CAN總線(xiàn)的分布式控制系統在以下方面具有明顯的優(yōu)越性:

1)網(wǎng)絡(luò )各節點(diǎn)之間的數據通信實(shí)時(shí)性強

2)縮短了開(kāi)發(fā)周期

3)已形成國際標準的現場(chǎng)總線(xiàn)

4)最有前途的現場(chǎng)總線(xiàn)之一

9、CANIAP升級

關(guān)于LPC1768CAN總線(xiàn)介紹可以參考“寶馬開(kāi)發(fā)板基礎例程文檔”第十九章“CAN總線(xiàn)”,這里就不在贅述了,CANIAP例程使用兩塊寶馬開(kāi)發(fā)板進(jìn)行實(shí)驗,分為“CANIAP編程板”與“CANIAP接收板”,將編程板(ID=0x01)與接收板(ID=0x02)的CAN1進(jìn)行連接(CAN1L對CAN1L,CAN1H對CAN1H),波特率為500K,編程板通過(guò)讀取板上SD卡內的app.bin文件然后傳輸給接收板,每次傳送1024字節,然后等待接收板發(fā)送“CONTINUE”信號繼續發(fā)送下一個(gè)1K數據,直到發(fā)送完成,發(fā)送“UPDATAOK”通知接收板發(fā)送完成。其操作步驟與串口IAP類(lèi)似,只是將通信方式有串口改為CAN總線(xiàn),有興趣的朋友可以修改成其他方式進(jìn)行IAP下載。




關(guān)鍵詞: LPC1768IAP升級解

評論


技術(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>