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