Intel HEX格式说明
Intel HEX文件是记录文本行的ASCII文本文件。后缀为.hex
在Intel HEX文件中,每一行是一个HEX记录,它由十六进制数组成的机器码或者数据常量。Intel HEX文件经常被用于将程序或数据传输存储到ROM,EPROM。大多数编程器和模拟器使用Intel HEX文件。
1.记录详解
Intel HEX文件由若干个数据记录组成,每个字符都是ASCII字符表示。每一条数据记录以冒号开始,ASCII码为0x3A,以一个回车和一个换行结束,回车的ASCII码为0x0d,换行的ASCII码为0x0a 。
一个Intel HEX文件可以包含任意多的十六进制记录,每一行为一条记录。每条记录有六个区域。通常记录的格式如下图所示:
记录的一般结构
下面是一个记录的格式。
:]cc
字符 | : | ll | aaaa | tt | [dd…] | cc |
英文描述 | RECORD MARK | LOAD RECLEN | OFFSET | RECTYP | INFO or DATA | CHKSUM |
区域 | 冒号为 起始标志 | 长度域 length | 地址域 address | 类型域 type | 数据域 data | 校验和域 check sum |
字节长度 | 1 byte | 1 byte | 2 bytes | 1 byte | N bytes | 1 byte |
每一组字母是独立的一个域,每一个字母是一个十六进制数字,每一域至少由两个十六进制数字组成,下面是字节的描述:
: 冒号是每一条Intel HEX记录开始的标志
ll 是这条记录的长度域,它表示INFO or DATA域[dd…]的字节bytes个数
aaaa 是地址域,它表示数据的起始地址
<如果是数据记录,这表示将要烧录的这条记录中的数据在EPROM中的偏移地址,
对于不支持扩展段地址和扩展线性地址的,如89C51,这就是此条记录的起始地址>
tt 表示这条HEX记录的类型,有6种类型
00 ----数据记录 Data Record (8-, 16-, or 32-bit formats)
01 ----文件结束记录 End of File Record(8-, 16-, or 32-bit formats)
02 ----扩展段地址记录 Extended Segment Address Record(16- or 32-bit formats)
03-----起始段地址记录 Start Segment Address Record(16- or 32-bit formats)
04-----扩展线性地址记录 Extended Linear Address Record(32-bit format only)
05-----起始线性地址记录 Start Linear Address Record(32-bit format only)
dd 是数据域,表示一个字节的数据,一个记录可能有多个数据字节,长度域ll域的数值大小
说明了数据域字节数。
cc 是效验和域,表示记录的效验和。计算方法是将本条记录冒号开始后的所有字母对
(不包括本效验字本身和冒号)所表示的十六进制数字<一对字母表示一个十六进制数
以字节为单位>都加起来然后模除256得到余数,最后求出余数的补码即是本效验字节
cc.
必须注意的是,此处的补码是将余数的8bit二进制数所有位取反,然后加1。也就是
最高位不管是0还是1,都要取反。
某一条记录的校验和计算过程:
第一步,求该行各字节数字的和(不包括冒号,不包括最后一个字节即校验和本身)
第二步,模除256
第三步,各位取反
第四步,加1即得到校验和
<例如: 一条记录为 :0300000002005E9D
校验和cc=0x01+NOT((0x03+0x00+0x00+0x00+0x02+0x00+0x5E) % 0x100)
=0x01+NOT(0x63 % 0x100)
=0x01+NOT(0x63)
=8’b1+8’b1001_1100
=8’b1001_1101
=8’h9D
3.1.数据记录00 (8-, 16-, or 32-bit formats)
字符 | : | ll | aaaa | tt | [dd…] | cc |
英文描述 | RECORD MARK | RECLEN | LOAD OFFSET | RECTYP ‘00’ | DATA | CHKSUM |
区域 | 冒号为 起始标志 | 长度域 length | 地址域 address | 类型域 type | 数据域 data | 校验和域 check sum |
ASCII | : | 固定为00 | ||||
16进制 | 3A | 3030 | ||||
字节长度 | 1 byte | 1 byte | 2 bytes | 1 byte | N bytes | 1 byte |
RECORD MARK
该区域为‘:’的ASCII编码,其16进制数为8‘h3A。
RECLEN
该区域使用2个ASCII编码的16进制数字来表示数据域的字节个数。最大值为
0xFF或 H 4646 (十进制255)。
LOAD OFFSET
该区域使用4个ASCII编码的16进制数字来表示数据域的第一个数据存放的偏移
地址。
RECTYP
ASCII编码字符为00,其16进制编码为H3030,它指示该文件记录类型为数据记
录。
CHKSUM
校验和为RECLEN, LOAD OFFSET, RECTYP, 和 DATA 区域以字节为单位,求和,模除256,取反,加1。
比如下面的一条数据记录
:0C032400787FE4F6D8FD75813402036B8D
0C LOAD RECLEN是此行记录数据的字节数目,表示记录的数据域有12个字节的INFO或
者DATA。最大为0xFF或者255
0324 是本条记录的数据在内存<将要烧写的eprom地址>中的起始地址.
OFFSET只用于数据记录。其他类型的记录中,不使用这个域,应该被编码为4个ASICC
码‘0000’或者030303030H。
00 是记录类型,00表示是一个数据记录
787F 到 036B 是数据域
8D 是此条记录的效验和
校验和计算过程:
第一步,求各字节的和(不包括冒号,不包括最后一个字节即校验和本身)
0C+03+24+00+78+7F+E4+F6+D8+FD+75+81+34+02+03+6B = 11‘h673
第二步,模除256
11’h673 mod 9’h100 = 8‘h73
第三步,各位取反
not (8’h73) = not(8’b0111_0011) = 8’h1000_1100 = 8’h8C
第四步,加1即得到校验和
8’h8C + 1 = 8’h8D
3.2.文件结束记录01(8-, 16-, or 32-bit formats)
一个Intel HEX文件必须有且仅有一条文件结束记录,其类型域必须是01。没有数据即长度域为00,数据域没有。该记录必须是文件的最后一行,每个文件有且仅有一条文件结束记录。
通常一条文件结束记录除了类型域(01),校验和域,其他域都为0,例如 :00000001FF
00是记录中数据字节的数目
0000这个地址对于EOF记录来说无任何意义
01记录类型是01(文件结束记录标示)
FF是效验和计算如下01h + NOT( (00h + 00h + 00h + 01h) mod 100h).
字符 | : | ll | aaaa | tt | cc |
英文描述 | RECORD MARK | hex字符串是什么 RECLEN ‘00’ | LOAD OFFSET ‘0000’ | RECTYP ‘01’ | CHKSUM |
区域 | 冒号为 起始标志 | 长度域 length | 地址域 address | 类型域 type | 校验和域 check sum |
ASCII | : | 固定为00 | 固定为0000 | 固定为01 | FF |
16进制 | 3A | 3030 | 30303030 | 3031 | 4646 |
字节长度 | 1 byte | 1 byte | 2 bytes | 1 byte | 1 byte |
RECORD MARK
该区域为‘:’的ASCII编码,其16进制数为H3A。
RECLEN
由于文件结束记录不包含任何INFO或DATA,ASCII编码字符为00,其16进制
编码为H 3030。
LOAD OFFSET
由于文件结束记录不使用该区域,ASCII编码字符为0000,其16进制编码为
030303030H
RECTYP
ASCII编码字符为01,其16进制编码为H3031,它指示该文件记录类型为文件结
束记录。
CHKSUM
校验和为RECLEN, LOAD OFFSET, 和 RECTYP 区域以字节为单位,求和,模除256,取反,加1。由于文件结束记录各域都是静止不变的,所以CHKSUM可以静态计算出来,为HFF。
3.3.Extended Segment Address Record02 (16- or 32-bit formats)
字符 | : | ll | aaaa | tt | [dd…] | cc |
区域 | 冒号为 起始标志 | 长度域 length | 地址域 address | 类型域 type | 数据域 data | 校验和域 check sum |
ASCII | : | 02 | 0000 | 02 | ||
16进制 | 3A | 3032 | 30303030 | 3032 | ||
字节长度 | 1 byte | 1 byte | 2 bytes | 1 byte | N bytes | 1 byte |
RECORD MARK
该区域为‘:’的ASCII编码,其16进制数为H3A。
RECLEN
该区域使用2个ASCII编码的16进制数字来表示数据域的字节个数。最大值为
0xFF或 4646H (十进制255)。
LOAD OFFSET
由于扩展段地址记录不使用该区域,ASCII编码字符为0000,其16进制编码为
030303030H
RECTYP
ASCII编码字符为02,其16进制编码为H3032,它指示该文件记录类型为扩展段
地址记录。
CHKSUM
校验和为RECLEN, LOAD OFFSET, RECTYP, 和USBA区域以字节为单位,求和,模除256,取反,加1。
3.4.扩展线性地址记录(HEX386)04
扩展线性地址记录也可称为 32位地址记录 和 HEX386记录,这个纪录包含高16(16-31位)位数据地址,这种扩展的线性记录总是有两个字节数据,像下面这样:
:02000004FFFFFC
02 是记录的数据字节数目
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论