OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8523|回复: 6

分享:hex文件格式解读

[复制链接]

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2016-3-2 11:52:22 | 显示全部楼层 |阅读模式
本帖最后由 fanghuiopenedv 于 2016-3-2 16:31 编辑

好东西来了。给大家分享下。
HEX文件格式详解:

Hex文件是可以烧录到MCU中,被MCU执行的一种文件格式。如果用记事本打开可发现,整个文件以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)。Hex文件可以按照如下的方式进行拆分来分析其中的内容:

例如 “:1000080080318B1E0828092820280B1D0C280D2854”可以被看作“0x10 0x00 0x08 0x00 0x80 0x31 0x8B 0x1E 0x08 0x28 0x09 0x28 0x20 0x28 0x0B 0x1D 0x0C 0x28 0x0D 0x28 0x54”

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

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

第四字节 0x00表示数据类型,数据类型有: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:开始线性地址记录

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

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

在上面的后2种记录,都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。对于后面的数据记录,计算地址的时候,都是以这些“基”地址为基础的。

HEX文件都是由记录(RECORD)组成的。在HEX文件里面,每一行代表一个记录。记录的基本格式为:

Record mark ‘:’

Length

Load offset

Record type

INFO or DATA

CHKSUM

1 byte

1 byte

2 bytes

1 byte

n bytes

1 byte

看个例子:

:020000040008F2

:10000400FF00A0E314209FE5001092E5011092E5A3

:00000001FF      

对上面的HEX文件进行分析:

第1条记录的长度为02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0008,校验和为F2。从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为(0x0008 << 16)。后面的数据记录都以这个地址为基地址。

第2条记录的长度为10(16),LOAD OFFSET为0004,RECTYPE为00,说明该记录为数据记录。数据为FF00A0E314209FE5001092E5011092E5,共16个BYTE。这个记录的校验和为A3。此时的基地址为0X80000,加上OFFSET,这个记录里的16BYTE的数据的起始地址就是0x80000 + 0x0004 = 0x80004.

第3条记录的长度为00,LOAD OFFSET为0000,TYPE = 01,校验和为FF。说明这个是一个END OF FILE RECORD,标识文件的结尾。

在上面这个例子里,实际的数据只有16个BYTE:FF00A0E314209FE5001092E5011092E5,其起始地址为0x0004.

这是转载的原帖地址:http://www.forwhat.cn/post-240.html




原子哥是不是又要出黑科技了呀。^_^...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
432
金钱
432
注册时间
2016-1-19
在线时间
38 小时
发表于 2016-3-2 18:11:08 | 显示全部楼层
闲暇之余还是可以消遣下
原来你也在这里
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-3-2 20:27:47 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-10-9
在线时间
4 小时
发表于 2017-11-5 19:20:13 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2017-11-24
在线时间
18 小时
发表于 2017-11-24 00:50:05 | 显示全部楼层
不错的,学习了hex的相关知识
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-21 17:03:10 | 显示全部楼层
本帖最后由 ssssssssssss 于 2018-8-23 16:05 编辑

      Hex文件合并方法:
  1.将由keil生成的boot.hex文件的最后2行删除,类似如下内容:
:040000050800019559
:00000001FF
  2.然后,将由keil生成的app.hex文件的全部内容复制到boot.hex的最后面,这样就合并为一个hex文件了。


应该是最后一行吧?


在做IAP在线升级时,往往初始化烧写程序需要将,两个hex文件进行合并(boot的hex文件和app的hex),以减少烧写步骤。boot的hex文件和app的hex文件,合并时:将bootlaoder的hex文件的最后一行删除,然后把app的hex文件直接copy在bootloader的hex删除行的后面即可(淡然,在程序设置,app的起始地址一定要设置正确!)

将 多个 HEX 文件(地址不重复,不相互覆盖)打开,然后按照地址先后的顺序复制粘贴,依次用后一个文件的内容替换掉前一个文件的最后一句,中间不留空行,最后一个文件的结尾作为新合成文件的结尾。这样生成的HEX可以直接使用。
回复 支持 反对

使用道具 举报

0

主题

454

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3773
金钱
3773
注册时间
2016-3-19
在线时间
886 小时
发表于 2021-12-22 12:25:45 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 17:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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