IAP更新操作說明 第一個文件夾:bootloader程序 第二個文件夾:上位機(jī)下載程序源碼 第三個文件夾:需要更新下載的代碼 第四個文件:下載工具可執(zhí)行文件 第五個文件:生成的pbdr.bin文件,用于更新。 一、硬件設(shè)計(jì):升級下載程序采用外部硬件觸發(fā)的方式。 PB-20M4硬件板 預(yù)留一個IO口處理代碼下載及更新的功能。 功能簡介:開機(jī)前若將 PB4接口與GND用杜邦線(改進(jìn)硬件后可用跳帽)短接, LED6閃爍狀態(tài),即可進(jìn)入固件下載功能程序,然后等待串口輸入接收APP程序(.bin文件,生成方法見后面說明、分段接收每包2K數(shù)據(jù),進(jìn)行CRC校驗(yàn)),在接收完APP程序包后,斷開PB4與地線的連接即可進(jìn)入用戶程序。 用到的資源: - 指示燈DS6
- 一根短接線,優(yōu)化硬件后 可用跳帽
- 串口(共地)
圖一 硬件指示圖 圖二 串口連接
二、軟件設(shè)計(jì)總共涉及三部分代碼:1、Bootloader;2、Flash App;3、上位機(jī)程序 1.Bootloader; 主函數(shù)進(jìn)行任務(wù)判斷,以及IAP更新和跳轉(zhuǎn)等各項(xiàng)操作。串口中斷中運(yùn)行數(shù)據(jù)處理,數(shù)據(jù)檢測,與上位機(jī)及握手校驗(yàn)等任務(wù)。Bootloader大小僅16K左右。 2、Flash App; 需要下載的程序,設(shè)置flash起始地址偏移量,由bootloader串口中斷中寫到flash中去。在初始化的時(shí)候執(zhí)行跳轉(zhuǎn),運(yùn)行該代碼程序。 3、上位機(jī)發(fā)送校驗(yàn)程序 協(xié)議如下: /*--------------------------------------------------------------------- protocol-----|#|remainSend|#|length|data[]|CRC_check ---------------------------------------------------------------------*/ IAP不是一下子把所有BIN文件都接收過來寫入FLASH,而是根據(jù)自己硬件的RAM空間,把BIN文件分成若干包,如每1K,2K等傳送一次,傳送當(dāng)中加上幀頭,幀尾,CRC,及總共多少包,及這是第幾包等信息封裝好的數(shù)據(jù)包,每接收一包寫相應(yīng)FLASH,下一包對應(yīng)的FLASH地址++,如此完成固件更新。
三、上位機(jī)設(shè)計(jì):打開應(yīng)用程序IAP_Download_USART\IAP_Download_USART\obj\Debug中exe文件。 或直接打開附件中IAP_Download_USART.exe應(yīng)用程序 運(yùn)行界面 燒錄過程: 開發(fā)環(huán)境如下: VS2013上用C#設(shè)計(jì)的簡單的串口應(yīng)用程序,基于.net4.5。 主要代碼: 詳見附件。
四、IAP說明IAP(In Application Programming)即應(yīng)用編程,IAP是用戶自己的程序在運(yùn)行過程中對User Flash的部分區(qū)域進(jìn)行燒寫,后期可以方便的通過預(yù)留通信口對產(chǎn)品進(jìn)行更新升級。在實(shí)現(xiàn)IAP功能時(shí),需要在設(shè)計(jì)固件程序時(shí)編寫兩個項(xiàng)目的代碼,第一個項(xiàng)目程序(bootloader程序)不執(zhí)行正常的功能操作,而是只通過某種通信方式接收程序和數(shù)據(jù),執(zhí)行對第二部分代碼的更新;第二個項(xiàng)目代碼是功能代碼(APP程序)。這兩部分項(xiàng)目代碼都同時(shí)燒錄在User Flash中,在芯片上電后,首先執(zhí)行第一個項(xiàng)目的代碼,進(jìn)行如下操作: - 檢查是否需要對第二部分代碼進(jìn)行更新
- 如果不需要更新,則運(yùn)行第二部分代碼
- 若需要更新,執(zhí)行更新操
- 更新完成,執(zhí)行第二部分代碼
Bootloader代碼必須通過其他手段,如JTAG或ISP燒錄;第二部分代碼使用Bootloader程序IAP功能燒錄,也可以通過JTAG燒錄,以后需要更新時(shí)可以通過IAP代碼進(jìn)行燒錄。 兩部分代碼存放在flash不同的地址位置,從最低地址區(qū)開始存放Bootloader,在其后指定位置存放APP程序。 STM32F4的內(nèi)部閃存(flash)地址起始于0x08000000,一般情況下,程序文就從此地址開始寫入。此外STM32是基于Cortex-M4 內(nèi)核的微控制器,其內(nèi)部通過一張“中斷向量表”來響應(yīng)中斷,程序啟動后,將首先從“中斷向量表”取出復(fù)位中斷向量執(zhí)行復(fù)位中斷程序完成啟動,而這張“中斷向量表”的起始地址是0x08000004,當(dāng)中斷來臨,STM32F4 的內(nèi)部硬件機(jī)制亦會自動將PC 指針定位到“中斷向量表”處,并根據(jù)中斷源取出對應(yīng)的中斷向量執(zhí)行中斷服務(wù)程序。 IAP程序滿足的要求: - 新程序必須在IAP程序之后的某個偏移量為x 的地址開始;
- 必須將新程序的中斷向量表相應(yīng)的移動,移動的偏移量為x;
1.程序起始地址設(shè)置方法 打開pbdr_v110工程,點(diǎn)擊Options for Target /Target選項(xiàng)卡,如圖一所示: 圖一 Flash app target 選項(xiàng)卡設(shè)置 默認(rèn)條件下,圖中IROM1的起始地址(Start)一般為0x08000000,大小1M(Size)為0x100000。而我們設(shè)置APP程序起始地址為0X08010000,即偏移量為0x10000(64K字節(jié)),留給用戶flash空間(size)是1024k-64k=960K。偏移量是定義留給bootloader程序的地址空間大小。發(fā)布者可以定義bootloader空間的大小這里我定義的是64K,偏移量為0x200的倍數(shù)即可。(本設(shè)計(jì)的bootloader只有16K左右),這里留有余量,方便bootloader以后的升級修改。 1.中斷向量表的偏移設(shè)置方法 在pbdr_v110版本中在mian.c中設(shè)置如下: 完成中斷向量表偏移量的設(shè)置 MDK編譯默認(rèn)生成.hex文件,而升級程序需要生成.bin文件。MDK自帶的格式轉(zhuǎn)換工具fromelf.exe,來實(shí)現(xiàn).axf文件到.bin文件的轉(zhuǎn)換。該工具在MDK的安裝目錄\ARM\BIN40文件夾下。通過下一步設(shè)置,可以在MDK編譯成功之后,調(diào)用fromelf.exe (注意,MDK的安裝路徑,我的路徑D:\Keil_v5\ARM\ARMCC\bin),根據(jù)當(dāng)前工程pbdr.axf,生成一個pbdr.bin文件。存放在OBJ文件夾下。在得到.bin文件后,我們只需要將這個bin文件通過串口傳送給單片機(jī),即可執(zhí)行代碼的下載以及升級。
五、下載驗(yàn)證:將JTDO(PB4)與GND短接,上電后,LED燈D6開始閃爍,說明進(jìn)入下載更新狀態(tài)。 絲印見PB-20背面。 通過TTL轉(zhuǎn)usb連上電腦端串口,打開IAP更新軟件(打開應(yīng)用程序IAP_Download_USART\IAP_Download_USART\obj\Debug文件夾中IAP_Download_USART.exe文件或直接打開附件中IAP_Download_USART.exe應(yīng)用程序),打開串口即可選則發(fā)送BIN文件進(jìn)行代碼下載。 
關(guān)閉下載窗口,斷開短接線即可運(yùn)行更新后的程序。
stm32 IAP Bootloader V1.4源碼:
- /*--------------------------------------------------------------------------------------
- @file: IAP_Serial
- @version: V1.0
- @author: Shanwu.5_W && Potter_lv
- @Introduction : Unlock flash load_app from serial
- --------------------------------------------------------------------------------------*/
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "stmflash.h"
- #include "iap.h"
- void Button_Switch_DFU_Init(void) //按鍵升級初始化
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- }
- #define GET_BUTTON_STATE GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3)
- int main(void)
- {
- u8 t;
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級分組2
- delay_init(168); //初始化延時(shí)函數(shù)
- uart_init(115200); //初始化串口波特率為115200
-
- LED_Init(); //初始化LED
- Button_Switch_DFU_Init(); //初始化跳轉(zhuǎn)APP程序接口
-
- while(1)
- {
- t++;
- delay_ms(10);
- if(t==30)
- {
- LED0=!LED0; //D6閃爍 等待更新狀態(tài)
- t=0;
- }
- if(GET_BUTTON_STATE != 0x00) //懸空進(jìn)入更新進(jìn)程
- {
- if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000) //判斷是否為0X08XXXXXX.
- {
- USART_Cmd(USART2, DISABLE); //失能串口2 ,防止跳轉(zhuǎn)到App程序時(shí)死機(jī)
- iap_load_app(FLASH_APP1_ADDR); //執(zhí)行FLASH APP代碼
- }else
- {
- printf("非FLASH應(yīng)用程序,無法執(zhí)行!\r\n");
- }
- }
- }
- }
復(fù)制代碼
全部資料51hei下載地址:
IAP_release.rar
(2.24 MB, 下載次數(shù): 1053)
2018-10-18 14:39 上傳
點(diǎn)擊文件名下載附件
iap升級的例子
|