单片机Bootloader与App的Hex文件手动合并方法

前言

对带有IAP的嵌入式软件,生产大批量加工时,研发需要提供Boot和App的合并Hex文件,这样才能加快生产进度。

Hex文件的简单说明

编译器编译出的HEX文件一般格式如下:
:020000040800F2 //烧录起始地址
:10000000C8BD0620D10100085D3B0008DD350008B1 //数据
:10001000593B0008C9040008CD6900080000000031 //数据
:100020000000000000000000000000000D49000872 //数据
… //数据
:0488D00000000000A4 //数据
:04000005080001BD31 //线性地址记录
:00000001FF //结束

Boot和App的Hex合并说明

把Boot的最后一行去掉,再把App的所有文件复制到Boot后即可。具体如下:
:020000040800F2 //boot起始地址
:10000000C8BD0620D10100085D3B0008DD350008B1 //Boot数据
:10001000593B0008C9040008CD6900080000000031 //Boot数据
:100020000000000000000000000000000D49000872 //Boot数据
…//Boot数据
:0488D00000000000A4 //Boot数据
:04000005080001BD31 //线性地址记录Boot
:020000040801F1//App起始地址
:1000000040BB0220A5EA0208E59301087F8A0308A5//APP数据
:10001000E7930108EB930108EF930108000000004B//APP数据
:10002000000000000000000000000000F3//APP数据
…//APP数据
:0C3B4000581698C821AC2D530800000056//APP数据
:04000005080101BD30//APP线性地址记录
:00000001FF//结束

多个app合并方法:

如果有两个APP,把Boot的最后一行去掉,去掉App1的Hex文件最后一行,再把App1文件复制到Boot后,然后把App2所有文件复制到刚刚合并的文件中。

boot+app+固定参数的合并方法

有时候需要在出厂程序固定地方写入特定的数据,这个时候除了boot和app的合并,需要加入固定参数区。比如,boot起始地址0x08000000,app起始地址0x08010000,特定参数1起始地址0x08073000,长度16字节,特定参数2起始地址0x08074000,特定数据长度128字节,则合并如下:
:020000040800F2 //boot起始地址
:10000000C8BD0620D10100085D3B0008DD350008B1 //Boot数据
:10001000593B0008C9040008CD6900080000000031 //Boot数据
:100020000000000000000000000000000D49000872 //Boot数据
…//Boot数据
:0488D00000000000A4 //Boot数据
:04000005080001BD31 //线性地址记录Boot
:020000040801F1//App起始地址
:1000000040BB0220A5EA0208E59301087F8A0308A5//APP数据
:10001000E7930108EB930108EF930108000000004B//APP数据
:10002000000000000000000000000000F3//APP数据
…//APP数据
:0C3B4000581698C821AC2D530800000056//APP数据
:04000005080101BD30//APP线性地址记录
:020000040807EB //地址0x08070000
:083000005627bd656c9f03001b//0x08073000地址区16字节特定数据
:10400000A4EF74000000FFFF504453535F54455326//0x08074000地址区特定数据
:10401000540000000000000000000000000000004C//0x08074000地址区特定数据
:104020000000000000000000434D4E455400000019//0x08074000地址区特定数据
:104030000000000000000000000000000000000080//0x08074000地址区特定数据
:104040000000000000000000736569626572747210//0x08074000地址区特定数据
:104050006F6E2E756269736F722E636F6D00000054//0x08074000地址区特定数据
:104060000000000000000000BB260000020001006C//0x08074000地址区特定数据
:10407000BBAAFFFF0000FFFFFFFFFFFFFFFFFFFFE7//0x08074000地址区特定数
:00000001FF//结束

Hex格式详解参考

第一个字节 表示本行数据的长度;

第二、三字节表示本行数据的起始地址;

第四字节表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05。

‘00’ Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录

‘01’ End of File Record:用来标识文件结束,放在文件的最后,标识HEX文件的结尾

‘02’ Extended Segment Address Record:用来标识扩展段地址的记录

‘03’ Start Segment Address Record:开始段地址记录

‘04’ Extended Linear Address Record:用来标识扩展线性地址的记录

‘05’ Start Linear Address Record:开始线性地址记录

然后是数据,最后一个字节 为校验和。

校验和的算法为:计算校验和前所有16进制码的累加和(不计进位),检验和 = 0x100 - 累加和

注意事项

1.合并文件时不要留有空格
2.注意Boot和App的起始地址
3.在hex文件里面添加参数域,要注意,比如写入0x080730000开始的16byte数据,写法如下:
:020000040807EB
:083000005627bd656c9f03001b
而不是
:023000040807XX
:080000005627bd656c9f0300XX

扩展知识

1.hex和bin文件只是格式不同,文件的有效data是完全一样的,因此网上有很多工具可以对两种文件进行自动转换。hex文件一般用于出厂设备生产批量烧录,出厂烧录时一般会把bootloader和app的hex合并后烧录,bin文件一般用于设备现场维护升级使用,升级使用只有app,因为bootloader一旦出厂几乎不能更改。

ST_LINK读取特定地址的数据:

打开软件:
1
显示如下:
1 连接电路板后,点击“1”,则界面3中会出现flash中的数据,在“2”中输入起始地址,大小和数据显示格式,界面“3”会从固定地址,特定格式显示flash内容,根据需要可以进行拷贝。 st_link跟电路板接线参考:https://blog.csdn.net/wxbluesun/article/details/94738272?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase