玩单片机的朋友都会使用hex文件作为烧录文件。那么当我们写一个在线升级软件要支持hex文件的升级,就需要通过hex文件转成bin文件进行传输,那么hex文件的格式和知识就必不可少了。
Intel HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。大多数EPROM编程器或模拟器使用Intel HEX文件。
1 Hex文件记录格式
以行为单位,每行以冒号开头,内容全部为16进制码,以ASCII码形式显示。
在HEX文件里面,每一行代表一个记录。记录的基本格式为如表所示:
Start code 一个字符,ASCII冒号:。
Byte count 两个十六进制数字(一个十六进制数字对),表示数据字段中的字节数(十六进制数字对)。最大字节数为 255 (0xFF)。16 (0x10) 和 32 (0x20) 是常用的字节数。
Address 四位十六进制数字,表示数据的 16 位起始内存地址偏移量。数据的物理地址是通过将此偏移量添加到先前建立的基地址来计算的,从而允许内存寻址超出 16 位地址的 64 KB 限制。默认为零的基地址可以通过各种类型的记录进行更改。基地址和地址偏移量始终表示为大端值。
Record type 两个十六进制数字,00到05,定义数据字段的含义。参考下文
Data 一个由n个字节组成的数据序列,由 2n 个十六进制数字表示。一些记录省略了这个字段(n等于零)。数据字节的含义和解释取决于应用程序。
Checksum 两个十六进制数字,一个可用于验证记录没有错误的计算值。计算校验和前所有16进制码的累加和。
2 数据记录格式
Intel HEX文件由任意数量以回车换行符结束的数据记录组成.
数据记录外观如下:
[:10246200464C5549442050524F46494C4500464C33]
其中:
10是这个记录当中数据字节的数量。
2462 是数据将被下载到存储器当中的地址。
00是记录类型(数据记录)。
464C…464C是数据。
33 是这个记录的校验和的补足码。
3 扩展线性地址记录格式(HEX386)
扩展线性地址记录也叫作32位地址记录或HEX386记录。这些记录包含数据地址的高16位。扩展线性地址记录总是有两个数据字节。
外观如下:
[:02000004FFFFFC]
其中:
02是这个记录当中数据字节的数量。
0000是地址域,对于扩展线性地址记录,这个域总是0000。
04是记录类型 04(扩展线性地址记录)。
FFFF是地址的高16位。
FC是这个记录的校验和的补足码。
当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从Intel HEX文件读取来的随后的记录。线性地址保持有效,直到它被另外一个扩展地址记录所改变。
通过把记录当中的地址域与被移位(16位)的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址。
以下的例子演示了这个过程:
来自数据记录地址域的地址 2462 扩展线性地址记录的数据域 FFFF0000 --------------------- 绝对存储器地址 FFFF2462
4 标扩展段地址记录(HEX86)
扩展段地址记录也叫HEX86记录,它包括4-19位数据地址段。扩展段地址记录总是有两个数据字节。
外观如下:
[:020000021200EA]
其中:
02 是记录当中数据字节的数量。
0000是地址域,对于扩展段地址记录,这个域总是0000。
02是记录类型 02(扩展段地址记录)。
1200是地址段。
EA是这个记录的校验和的补足码。
当一个扩展段地址记录被读取,存储于数据域的扩展段地址被保存,它被应用于从Intel HEX文件读取来的随后的记录。段地址保持有效,直到它被另外一个扩展地址记录所改变。
通过把记录当中的地址域与被移位(4位)的来自扩展段地址记录的地址数据相加获得数据记录的绝对存储器地址。以下的例子演示了这个过程:
来自数据记录地址域的地址 2462 扩展段地址记录数据域 1200 ----------------- 绝对存储器地址 00014462
5 文件结束记录(EOP)
Intel HEX文件必须以文件结束(EOF)记录结束。这个记录的记录类型域的值必须是01。EOF记录外观总是如下
[:00000001FF]
其中:
00是记录当中数据字节的数量。
0000是数据被下载到存储器当中的地址。在文件结束记录当中地址是没有意义被忽略的。0000H是典型的地址。
01是记录类型01(文件结束记录)。
FF是这个记录的校验和的补足码。
6 Intel Hex 完成例子
下面是一个完整的Intel HEX文件的例子:
:10001300AC12AD13AE10AF1112002F8E0E8F0F2244 :10000300E50B250DF509E50A350CF5081200132259 :03000000020023D8 :0C002300787FE4F6D8FD7581130200031D :10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016 :04003F00A42EFE22CB :00000001FF看了这个例子,我自己也打开了之前写的51单片机的hex文件:
:2000000002000E75210675225B75230200267B007C00900090758140758901758CF1758A45 :2000200028D28C75A882758CF1758A280BBBFA157B00EC75F00A8485F020F5210CBC64027A :200040007C00120051C0E0C0D0120051D0D0D0E032E52193F580D2A2C2A27580FED2A3C29C :20006000A3120087E52093F580D2A2C2A27580FDD2A3C2A3120087227D327E287FF81151AA :1A008000DFFEDEF8DDF4227E047FF8DFFEDEFA223F065B4F666D7D077F6FBC :00000001FF
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !