找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 32086|回復(fù): 64
收起左側(cè)

STM32F4 IAP升級 Bootloader程序+上位機(jī)下載程序源碼

  [復(fù)制鏈接]
ID:411530 發(fā)表于 2018-10-18 10:06 | 顯示全部樓層 |閱讀模式
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源碼:
  1. /*--------------------------------------------------------------------------------------
  2. @file:    IAP_Serial
  3. @version: V1.0
  4. @author:  Shanwu.5_W && Potter_lv
  5. @Introduction : Unlock flash   load_app from serial
  6. --------------------------------------------------------------------------------------*/
  7. #include "sys.h"
  8. #include "delay.h"  
  9. #include "usart.h"   
  10. #include "led.h"  
  11. #include "stmflash.h"
  12. #include "iap.h"  

  13. void Button_Switch_DFU_Init(void)    //按鍵升級初始化
  14. {
  15.   GPIO_InitTypeDef GPIO_InitStructure;
  16.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

  17.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  18.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  19.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  20.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  21. }
  22. #define  GET_BUTTON_STATE   GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3)

  23. int main(void)
  24. {
  25.         u8 t;
  26.         
  27.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級分組2
  28.         delay_init(168);  //初始化延時(shí)函數(shù)
  29.         uart_init(115200);                //初始化串口波特率為115200
  30.         
  31.         LED_Init();                                        //初始化LED
  32.         Button_Switch_DFU_Init();                //初始化跳轉(zhuǎn)APP程序接口
  33.         
  34.         while(1)
  35.         {
  36.                         t++;
  37.                         delay_ms(10);
  38.                         if(t==30)
  39.                         {
  40.                                 LED0=!LED0;                  //D6閃爍 等待更新狀態(tài)
  41.                                 t=0;
  42.                         }                        
  43.                         if(GET_BUTTON_STATE != 0x00)        //懸空進(jìn)入更新進(jìn)程
  44.                         {                                       
  45.                                 if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)   //判斷是否為0X08XXXXXX.
  46.                                 {         
  47.                                         USART_Cmd(USART2, DISABLE);                                //失能串口2 ,防止跳轉(zhuǎn)到App程序時(shí)死機(jī)                                       
  48.                                         iap_load_app(FLASH_APP1_ADDR);                             //執(zhí)行FLASH APP代碼               
  49.                                 }else
  50.                                 {
  51.                                         printf("非FLASH應(yīng)用程序,無法執(zhí)行!\r\n");           
  52.                                 }
  53.                         }
  54.                 }                        
  55. }
復(fù)制代碼

0.png

全部資料51hei下載地址:
IAP_release.rar (2.24 MB, 下載次數(shù): 1053)


評分

參與人數(shù) 3黑幣 +85 收起 理由
ag26259 + 30 絕世好帖!
hzd530 + 5 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:248421 發(fā)表于 2018-11-15 14:30 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:339245 發(fā)表于 2018-11-16 15:10 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:11509 發(fā)表于 2018-12-13 14:13 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:391224 發(fā)表于 2018-12-18 21:53 | 顯示全部樓層
贊一個,不錯
回復(fù)

使用道具 舉報(bào)

ID:87577 發(fā)表于 2018-12-21 11:52 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:460235 發(fā)表于 2019-1-2 16:51 | 顯示全部樓層
感謝分享~~
回復(fù)

使用道具 舉報(bào)

ID:116560 發(fā)表于 2019-1-8 09:47 | 顯示全部樓層

感謝分享~~
回復(fù)

使用道具 舉報(bào)

ID:105898 發(fā)表于 2019-1-17 09:59 | 顯示全部樓層
希望可以下來用用
回復(fù)

使用道具 舉報(bào)

ID:242769 發(fā)表于 2019-1-17 21:08 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:368773 發(fā)表于 2019-1-22 17:29 | 顯示全部樓層
大家有下載的嗎?可以分享一下嗎
回復(fù)

使用道具 舉報(bào)

ID:240940 發(fā)表于 2019-1-26 11:37 | 顯示全部樓層

用起來了么
回復(fù)

使用道具 舉報(bào)

ID:476008 發(fā)表于 2019-2-12 19:40 | 顯示全部樓層
學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:328121 發(fā)表于 2019-2-15 08:44 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:28367 發(fā)表于 2019-4-7 17:03 來自手機(jī) | 顯示全部樓層
好東西,學(xué)習(xí)了!
回復(fù)

使用道具 舉報(bào)

ID:66915 發(fā)表于 2019-4-8 16:40 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:507909 發(fā)表于 2019-4-9 15:17 | 顯示全部樓層
非常好,感謝分享。
回復(fù)

使用道具 舉報(bào)

ID:508043 發(fā)表于 2019-4-9 16:54 | 顯示全部樓層
這是大佬!
回復(fù)

使用道具 舉報(bào)

ID:29043 發(fā)表于 2019-4-14 12:35 | 顯示全部樓層
上位機(jī)源碼沒有
回復(fù)

使用道具 舉報(bào)

ID:198728 發(fā)表于 2019-5-29 18:08 | 顯示全部樓層
謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:198728 發(fā)表于 2019-5-29 18:08 | 顯示全部樓層

有上位機(jī)的啊
回復(fù)

使用道具 舉報(bào)

ID:379319 發(fā)表于 2019-7-1 16:07 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:576178 發(fā)表于 2019-7-2 10:40 | 顯示全部樓層
謝謝樓主的無私分享!
回復(fù)

使用道具 舉報(bào)

ID:576178 發(fā)表于 2019-7-2 18:10 | 顯示全部樓層
樓主你好  請問用上位機(jī)點(diǎn)開連接之后發(fā)現(xiàn)下位機(jī)卡死的情況
回復(fù)

使用道具 舉報(bào)

ID:110942 發(fā)表于 2019-7-27 19:59 | 顯示全部樓層
不錯,謝謝了!
回復(fù)

使用道具 舉報(bào)

ID:123058 發(fā)表于 2019-8-20 15:38 | 顯示全部樓層
謝謝 學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

ID:531721 發(fā)表于 2019-9-12 10:20 | 顯示全部樓層
感謝分享,研究一下分包粘包
回復(fù)

使用道具 舉報(bào)

ID:531721 發(fā)表于 2019-9-12 17:38 | 顯示全部樓層
測試時(shí)發(fā)現(xiàn),只要點(diǎn)擊連接,單片機(jī)就會卡死,斷開連接后單片機(jī)又恢復(fù)正常
回復(fù)

使用道具 舉報(bào)

ID:188815 發(fā)表于 2019-9-26 20:27 | 顯示全部樓層
正好需要,謝謝大神!雪中送炭!
回復(fù)

使用道具 舉報(bào)

ID:618619 發(fā)表于 2019-10-4 14:21 | 顯示全部樓層
如果需求是 這樣子如何實(shí)現(xiàn):
stm32f4單片機(jī)一檢測到某個觸發(fā)條件,即擦除相關(guān)程序區(qū)域,而不是升級它。
回復(fù)

使用道具 舉報(bào)

ID:620021 發(fā)表于 2019-10-8 22:39 | 顯示全部樓層
學(xué)習(xí)下~
回復(fù)

使用道具 舉報(bào)

ID:621745 發(fā)表于 2019-10-10 15:13 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:486510 發(fā)表于 2019-10-13 18:38 | 顯示全部樓層
謝謝大佬分享
回復(fù)

使用道具 舉報(bào)

ID:486510 發(fā)表于 2019-10-13 18:39 | 顯示全部樓層
謝謝 大佬分享
回復(fù)

使用道具 舉報(bào)

ID:437137 發(fā)表于 2019-10-14 13:31 | 顯示全部樓層
沒有第三個文件夾
回復(fù)

使用道具 舉報(bào)

ID:142699 發(fā)表于 2019-11-22 11:37 | 顯示全部樓層
這個資料非常棒!
回復(fù)

使用道具 舉報(bào)

ID:58625 發(fā)表于 2019-11-26 15:37 | 顯示全部樓層
謝謝。下載學(xué)習(xí)下
回復(fù)

使用道具 舉報(bào)

ID:529603 發(fā)表于 2019-12-16 20:56 | 顯示全部樓層
看起來不錯,就是沒積分下載。
回復(fù)

使用道具 舉報(bào)

ID:668475 發(fā)表于 2019-12-19 16:17 | 顯示全部樓層
感謝分享  找了很久
回復(fù)

使用道具 舉報(bào)

ID:671742 發(fā)表于 2019-12-23 20:24 | 顯示全部樓層
正需要,謝謝樓主
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表