找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 32127|回復: 64
打印 上一主題 下一主題
收起左側

STM32F4 IAP升級 Bootloader程序+上位機下載程序源碼

  [復制鏈接]
跳轉到指定樓層
樓主
ID:411530 發(fā)表于 2018-10-18 10:06 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
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源碼:
  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);//設置系統(tǒng)中斷優(yōu)先級分組2
  28.         delay_init(168);  //初始化延時函數(shù)
  29.         uart_init(115200);                //初始化串口波特率為115200
  30.         
  31.         LED_Init();                                        //初始化LED
  32.         Button_Switch_DFU_Init();                //初始化跳轉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)        //懸空進入更新進程
  44.                         {                                       
  45.                                 if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)   //判斷是否為0X08XXXXXX.
  46.                                 {         
  47.                                         USART_Cmd(USART2, DISABLE);                                //失能串口2 ,防止跳轉到App程序時死機                                       
  48.                                         iap_load_app(FLASH_APP1_ADDR);                             //執(zhí)行FLASH APP代碼               
  49.                                 }else
  50.                                 {
  51.                                         printf("非FLASH應用程序,無法執(zhí)行!\r\n");           
  52.                                 }
  53.                         }
  54.                 }                        
  55. }
復制代碼



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


評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏23 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發(fā)
ID:248421 發(fā)表于 2018-11-15 14:30 | 只看該作者
謝謝分享
回復

使用道具 舉報

板凳
ID:339245 發(fā)表于 2018-11-16 15:10 | 只看該作者
感謝分享
回復

使用道具 舉報

地板
ID:11509 發(fā)表于 2018-12-13 14:13 | 只看該作者
謝謝分享
回復

使用道具 舉報

5#
ID:391224 發(fā)表于 2018-12-18 21:53 | 只看該作者
贊一個,不錯
回復

使用道具 舉報

6#
ID:87577 發(fā)表于 2018-12-21 11:52 | 只看該作者
謝謝分享
回復

使用道具 舉報

7#
ID:460235 發(fā)表于 2019-1-2 16:51 | 只看該作者
感謝分享~~
回復

使用道具 舉報

8#
ID:116560 發(fā)表于 2019-1-8 09:47 | 只看該作者

感謝分享~~
回復

使用道具 舉報

9#
ID:105898 發(fā)表于 2019-1-17 09:59 | 只看該作者
希望可以下來用用
回復

使用道具 舉報

10#
ID:242769 發(fā)表于 2019-1-17 21:08 | 只看該作者
謝謝分享
回復

使用道具 舉報

11#
ID:368773 發(fā)表于 2019-1-22 17:29 | 只看該作者
大家有下載的嗎?可以分享一下嗎
回復

使用道具 舉報

12#
ID:240940 發(fā)表于 2019-1-26 11:37 | 只看該作者

用起來了么
回復

使用道具 舉報

13#
ID:476008 發(fā)表于 2019-2-12 19:40 | 只看該作者
學習學習
回復

使用道具 舉報

14#
ID:328121 發(fā)表于 2019-2-15 08:44 | 只看該作者
謝謝分享
回復

使用道具 舉報

15#
ID:28367 發(fā)表于 2019-4-7 17:03 來自手機 | 只看該作者
好東西,學習了!
回復

使用道具 舉報

16#
ID:66915 發(fā)表于 2019-4-8 16:40 | 只看該作者
謝謝分享
回復

使用道具 舉報

17#
ID:507909 發(fā)表于 2019-4-9 15:17 | 只看該作者
非常好,感謝分享。
回復

使用道具 舉報

18#
ID:508043 發(fā)表于 2019-4-9 16:54 | 只看該作者
這是大佬!
回復

使用道具 舉報

19#
ID:29043 發(fā)表于 2019-4-14 12:35 | 只看該作者
上位機源碼沒有
回復

使用道具 舉報

20#
ID:198728 發(fā)表于 2019-5-29 18:08 | 只看該作者
謝謝分享!
回復

使用道具 舉報

21#
ID:198728 發(fā)表于 2019-5-29 18:08 | 只看該作者

有上位機的啊
回復

使用道具 舉報

22#
ID:379319 發(fā)表于 2019-7-1 16:07 | 只看該作者
謝謝分享
回復

使用道具 舉報

23#
ID:576178 發(fā)表于 2019-7-2 10:40 | 只看該作者
謝謝樓主的無私分享!
回復

使用道具 舉報

24#
ID:576178 發(fā)表于 2019-7-2 18:10 | 只看該作者
樓主你好  請問用上位機點開連接之后發(fā)現(xiàn)下位機卡死的情況
回復

使用道具 舉報

25#
ID:110942 發(fā)表于 2019-7-27 19:59 | 只看該作者
不錯,謝謝了!
回復

使用道具 舉報

26#
ID:123058 發(fā)表于 2019-8-20 15:38 | 只看該作者
謝謝 學習一下
回復

使用道具 舉報

27#
ID:531721 發(fā)表于 2019-9-12 10:20 | 只看該作者
感謝分享,研究一下分包粘包
回復

使用道具 舉報

28#
ID:531721 發(fā)表于 2019-9-12 17:38 | 只看該作者
測試時發(fā)現(xiàn),只要點擊連接,單片機就會卡死,斷開連接后單片機又恢復正常
回復

使用道具 舉報

29#
ID:188815 發(fā)表于 2019-9-26 20:27 | 只看該作者
正好需要,謝謝大神!雪中送炭!
回復

使用道具 舉報

30#
ID:618619 發(fā)表于 2019-10-4 14:21 | 只看該作者
如果需求是 這樣子如何實現(xiàn):
stm32f4單片機一檢測到某個觸發(fā)條件,即擦除相關程序區(qū)域,而不是升級它。
回復

使用道具 舉報

31#
ID:620021 發(fā)表于 2019-10-8 22:39 | 只看該作者
學習下~
回復

使用道具 舉報

32#
ID:621745 發(fā)表于 2019-10-10 15:13 | 只看該作者
謝謝分享
回復

使用道具 舉報

33#
ID:486510 發(fā)表于 2019-10-13 18:38 | 只看該作者
謝謝大佬分享
回復

使用道具 舉報

34#
ID:486510 發(fā)表于 2019-10-13 18:39 | 只看該作者
謝謝 大佬分享
回復

使用道具 舉報

35#
ID:437137 發(fā)表于 2019-10-14 13:31 | 只看該作者
沒有第三個文件夾
回復

使用道具 舉報

36#
ID:142699 發(fā)表于 2019-11-22 11:37 | 只看該作者
這個資料非常棒!
回復

使用道具 舉報

37#
ID:58625 發(fā)表于 2019-11-26 15:37 | 只看該作者
謝謝。下載學習下
回復

使用道具 舉報

38#
ID:529603 發(fā)表于 2019-12-16 20:56 | 只看該作者
看起來不錯,就是沒積分下載。
回復

使用道具 舉報

39#
ID:668475 發(fā)表于 2019-12-19 16:17 | 只看該作者
感謝分享  找了很久
回復

使用道具 舉報

40#
ID:671742 發(fā)表于 2019-12-23 20:24 | 只看該作者
正需要,謝謝樓主
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表