找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1665|回复: 1
打印 上一主题 下一主题
收起左侧

Hex文件格式与合并

[复制链接]
跳转到指定楼层
楼主
ID:262045 发表于 2022-6-10 11:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
什么是hex文件
hex文件格式是可以烧写到单片机中,被单片机执行的一种文件格式,生成Hex文件的方式有很多种,可以通过不同的编译器将C程序或者汇编程序编译生成hex。

Hex文件格式:

先来看一下hex文件,主要截取了三部分,开头1行



中间数据,这里只截取了一部分作为表示



结尾2行



数据少不了数据格式(协议),先来看一看hex文件的数据格式,以第一行数据(020000040002f8)为例,看一看hex文件的每一字段数据是什么意思:

020000040002f8可以分解为:

0x02 0x00 0x00 0x04 0x02 0x02 0xf8,前面4个字节和最后一个字节是有特殊含义的,中间为数据,每个字段的具体含义如下:

第一字节0x02:数据长度,即该行有多少个数据;

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

第四个字节有0x00 0x01 0x02 0x03 0x04 0x05,分别有以下含义:

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

'01’文件结束记录:用来标识文件结束,放在文件的最后,标识HEX文件的结尾

'02’扩展段地址记录:用来标识扩展段地址的记录

'03’开始段地址记录:开始段地址记录

'04’扩展线性地址记录:用来标识扩展线性地址的记录

'05’开始线性地址记录:开始线性地址记录

最后一个字节0xf8为校验和:校验和= 0x100 - 累加和

单纯看上面的介绍,好像也看不出和MCU的FLASH地址如何联系起来,接下来看看是如何跟FLASH地址对应的



第一字节表示该行的数据字节数;如第1行只有 0x08 0x00 两个字节的数据,类型是 04 ,即该行记录的是一个拓展地址(0x08 0x00 是地址信息,用法是将该地址(0x0800<<16) 后作为基地址。并且表示在下一个04类型行出现之前都要使用该地址。

例如第2行的地址信息是 0x0000,则表示该行数据从0x08000000( (0x0800<<16) | 0x0000 )开始记录。

第3行则从 0x08000010 ( (0x0800<<16) | 0x0010 )开始记录。

另外最后一个字节的校验和 0xD2 = 0xff & ( 0x100- (0x10+4*(0x00)+0x38+0x05+…+0x00+0x08) ) = 0xff & (0x100-0x2E);

然后再看结尾部分: 类型是05,有4字节数据,从上面的介绍可以知道,05是指“开始线性地址记录”,什么意思呢?

其实就是函数入口地址,从编译产生的.map文件中,可以看到Image Entry point后面跟的就是这个值

例如第2行的地址信息是 0x0000,则表示该行数据从0x08000000( (0x0800<<16) | 0x0000 )开始记录。

第3行则从 0x08000010 ( (0x0800<<16) | 0x0010 )开始记录。

另外最后一个字节的校验和 0xD2 = 0xff & ( 0x100- (0x10+4*(0x00)+0x38+0x05+…+0x00+0x08) ) = 0xff & (0x100-0x2E);

然后再看结尾部分: 类型是05,有4字节数据,从上面的介绍可以知道,05是指“开始线性地址记录”,什么意思呢?

其实就是函数入口地址,从编译产生的.map文件中,可以看到Image Entry point后面跟的就是这个值





最后的一行,01代表文件结束,以上就是关于hex文件的简单介绍。

合并hex文件的几种方法
1、传统而不优雅的直接合并法
打开我们的hex文件,就以BOOT和APP代码为例,用记事本或者其他的软件(notepad++等)打开



从上面的介绍我们可以知道,hex文件最后一行是代表文件的结束,那么我们只需要删除boot文件的最后一行代码,然后把APP的代码直接拷贝过来



这样我们就得到了最终的hex文件,直接烧录进去MCU即可

2、jflash烧录
jlink说我们必不可少的烧录调试工具之一,一起来看看怎么使用jlink自带的jflash工具合并

打开jflash,首先选择我们的第一个文件,file->open data file即可



打开之后,可以看到地址是从8000000开始的,也即是我们的MCU flash的基地址



然后再点击file->merge data file



选择我们的第二个文件,选择打开之后,第二个hex文件就拼接到了BOOT文件之后了,保存文件即可,建议另存为我们需要的文件名,否则的话,会默认为我们打开的第一个文件名

3、开源小工具
这个方法和上面jflash的方法类似,网上有很多热心网友开发的小工具,也可以自己做一个,小飞哥就找一个自己测试过得给大伙用吧

软件源码开源,非本人所编写,github地址为:https://github.com/SmartElec/STM32-IAP-HEX-Merge,源码为C#所编写。

下载下来有源码,感兴趣的就看看,不感兴趣的就直接用即可,在realese文件夹内



直接选择我们的hex文件,注意顺序



还可以同时生成bin文件,点击合并即可



文件夹内已经生成了目标hex合并文件



接下来就可以把所有文件合并之后,只烧录一个hex文件啦
————————————————
版权声明:本文为CSDN博主「Mr_Wyf」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_16519885/article/details/123744104

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶3 踩
回复

使用道具 举报

沙发
ID:476527 发表于 2022-6-13 08:45 | 只看该作者
感谢转载,虽然已经知道怎么合并两个hex文件,但对其原理还是有所疑惑,这篇文章很好的解决了我的问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表