新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > LPC1768 IAP升級(jí)解析及例程分享

        LPC1768 IAP升級(jí)解析及例程分享

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

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

        本文引用地址:http://www.104case.com/article/201611/319433.htm

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

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


        2、bin格式文件與hex格式文件的區(qū)別

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

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

        3、LPC1768IAP原理

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

        在IAP升級(jí)中,程序正常執(zhí)行即用戶代碼(這里的用戶代碼是我們所說的IAP引導(dǎo)程序),如下是IAP升級(jí)流程圖,程序?qū)㈩A(yù)留端口(這里提供有串口和CAN總線接口兩種)接收到的APP程序bin文件,將接收到的數(shù)據(jù)寫入到指定的Flash區(qū)域(例程APP地址為0x00010000),程序通過IAP命令將數(shù)據(jù)寫入到Flash里面,LPC1768提供了一系列IAP命令對(duì)片內(nèi)Flash進(jìn)行擦除編寫等。

        4、IAP命令

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

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

        5、串口IAP升級(jí)

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

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

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

        在IAP升級(jí)中,程序正常執(zhí)行即用戶代碼(這里的用戶代碼是我們所說的IAP引導(dǎo)程序),如下是IAP升級(jí)流程圖,程序?qū)㈩A(yù)留端口(這里提供有串口和CAN總線接口兩種)接收到的APP程序bin文件,將接收到的數(shù)據(jù)寫入到指定的Flash區(qū)域(例程APP地址為0x00010000),程序通過IAP命令將數(shù)據(jù)寫入到Flash里面,LPC1768提供了一系列IAP命令對(duì)片內(nèi)Flash進(jìn)行擦除編寫等。在IAP升級(jí)中,程序正常執(zhí)行即用戶代碼(這里的用戶代碼是我們所說的IAP引導(dǎo)程序),如下是IAP升級(jí)流程圖,程序?qū)㈩A(yù)留端口(這里提供有串口和CAN總線接口兩種)接收到的APP程序bin文件,將接收到的數(shù)據(jù)寫入到指定的Flash區(qū)域(例程APP地址為0x00010000),程序通過IAP命令將數(shù)據(jù)寫入到Flash里面,LPC1768提供了一系列IAP命令對(duì)片內(nèi)Flash進(jìn)行擦除編寫等。

        5、串口IAP程序分析

        例程通過按鍵對(duì)開發(fā)板進(jìn)行控制,INT0鍵擦除Flash,確認(rèn)鍵等待串口IAP,向上鍵顯示菜單,向下鍵執(zhí)行應(yīng)用程序,使用LCD來開發(fā)板狀態(tài),其主函數(shù)如下

        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;

        }

        }

        }

        當(dāng)串口接收到數(shù)據(jù)后將數(shù)據(jù)寫入到Flash,其寫入步驟是:發(fā)送準(zhǔn)備寫扇區(qū)命令,執(zhí)行RAM內(nèi)容復(fù)制到Flash最后比較復(fù)制內(nèi)容,其代碼如下:

        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;

        }

        當(dāng)程序全部寫入到Flash后,按下向下按鍵,跳轉(zhuǎn)到應(yīng)用程序,首先修改中斷向量表然后進(jìn)入應(yīng)用程序

        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)入應(yīng)用程序

        }

        7、操作步驟及實(shí)驗(yàn)現(xiàn)象

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

        2、按下按鍵INT0按鍵--擦除扇區(qū)

        3、按下方向鍵確認(rèn)鍵--等待從串口接收程序

        4、串口打印‘C’字符等待接收數(shù)據(jù)

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

        6、發(fā)送文件

        7、按下方向鍵向下鍵開始執(zhí)行應(yīng)用程序,可以用示波器測(cè)試P0.26輸出正弦波信號(hào)

        bin文件生成方法及設(shè)置:

        打開要更新應(yīng)用程序工程,這里使用“IAP升級(jí)DAC轉(zhuǎn)換”程序,設(shè)置ROM空間地址(程序下載到Flash的地址),這里也是我們應(yīng)用程序的入口地址0x10000

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

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

        8、CAN總線

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

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

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

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

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

        9、CANIAP升級(jí)

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




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

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 沁水县| 济阳县| 定南县| 临猗县| 正定县| 南宁市| 石河子市| 民和| 营口市| 芦溪县| 浦江县| 曲靖市| 夏河县| 广宗县| 股票| 肃南| 库尔勒市| 玉门市| 田阳县| 禹州市| 安国市| 博客| 万源市| 永川市| 林口县| 吉木乃县| 登封市| 横山县| 巩义市| 个旧市| 潍坊市| 富宁县| 广平县| 济南市| 沙田区| 澳门| 依兰县| 大姚县| 交城县| 徐州市| 兰考县|