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 0xFF
if ((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博客