?1、前言
? ? ?一成熟的量產的嵌入式產品,軟件一般分為BootLoader和App,BootLoader用于啟動校驗、App升級、App版本回滾等功能,BootLoader在cpu上電第一階段中運行,之后跳轉至App地址執行應用程序。
? ? ?因此,在發布固件的時候,會存在BootLoader固件和App固件;此時我們期望是將BootLoader固件和App固件合并成為一個固件,這樣在量產時只需燒錄一次即可。
2. HEX和bin的區別
? ? 一般而言,是將HEX文件燒入MCU中,其中BIN文件數據燒到單片機的FLASH中,STM32具體地址是0x8000000。
? ??hex指Intel標準的HEX文件,文件內容都是ASCII編碼,HEX文件中同時包含數據和地址信息,所以在燒寫或下載HEX文件的時候,不需要用戶指定地址。Hex文件如果用特殊的程序來查看(一般記事本就可以實現)。打開后可發現,整個文件以行為單位,每行以冒號開頭,內容全部為16進制碼(以ASCII碼形式顯示)
? ?HEX基本格式:
<0x3a>
[數據長度1Byte]
[數據地址2Byte]
[數據類型1Byte]
[數據nByte]
[校驗1Byte]
<0x0d>
<0x0a>
? ? ?二進制文件,一個后綴名為".bin"的文件,只是表明它是binary格式。比如虛擬光驅文件常用.bin作為后綴,但并不意味著所有.bin文件都是虛擬光驅文件。
? ? BIN文件只有純粹的數據(代碼)信息,并不包含地址,所以燒寫BIN時就需要指定燒寫地址,一般可以在燒寫工具上修改。
很直觀的可以看到BIN文件只是HEX文件中的數據區域。
3.合并bootloader app
?1、生成app bootliader的bin文件
? 配置keil或其工具生成app bootliader對應的bin文件。
? ?2.將bootloader填充到固定大小
? ? ?一般我都希望將bootloader后面的app燒寫到固定位置,但是生成的bootloader大小肯定是變化的,這是后我們需要預設bootloader的最大尺寸,將剩余的位置填充oxff,保證app燒寫在固定的flash位置。
? ?bootloader的bin文件填充分為兩部分。
#include "stdafx.h"
#include <stdlib.h>#define VERSION "V1.01.161225"int _tmain(int argc, _TCHAR* argv[])
{if (argc < 3){printf("err! argc < 3.\n");return -1;}long len = (long)strtol(argv[2], NULL, 16);printf("fz append. %s\n",VERSION);printf("file:%s, size:0x%x\n",argv[1],len);FILE *fp;long off;long append = 0;//test file is exist and calculate file size//"..\\test\\aa.bin"if ((fp = fopen(argv[1], "rb"))==NULL){printf("Can not open file\n");return -1;}fseek(fp,0,SEEK_END);off=ftell(fp);fclose(fp);if (off >= len){printf("file size is too large. %d > %d\r", off, len);return -1;}else{append = len - off;}//append data 0xFFif ((fp = fopen(argv[1], "ab+"))==NULL){printf("Can not open file\n");return -1;}fseek(fp,0,SEEK_END);printf("open sucess.append size %d append %d\r\n",off,append);while(append--){fputc('\xff',fp);}fclose(fp); return 0;
}
上面的代碼可用Microsoft Visual?Studio的IDE編譯生成AppendFixSize.exe?。為填充代碼,下面的為填充腳本。
@echo off
@AppendFixSize.exe Boot.bin 0x4000
@echo append finish
copy /b .\Boot.bin + .\App.bin Firmware.bin
srec_cat.exe Firmware.bin -Binary -offset 0x8000000 -o Firmware.hex -Intel
del Firmware.bin
@pause
后續將Fireware.hex 燒入MCU中即可
參考文檔:
??如何將BootLoader與APP合并成一個固件
??hex文件與bin文件的區別以及如何在keil中生成bin文件_bin文件hex文件-CSDN博客