1 什么是HEX文件
HEX文件是由一行行符合 HEX文件格式的文本所构成的ASCII文本文件。在HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。
2 HEX文件格式
一般Hex文件通过记事本就可以打开。可以发现一般Hex文件的记录格式如下:
HEX文件由任意数量的十六进制记录组成。每个记录包含5个域,它们按以下格式排列:
每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:
:(冒号)每个HEX记录都由冒号开头 ;
LL 是数据长度域, 它代表记录当中数据字节(dd)的数量;
aaaa 是地址域, 它代表记录当中数据的起始地址;
TT是代表HEX记录类型的域,它可能是以下数据当中的一个:
00 – 数据记录(Data Record)
01 – 文件结束记录(End of FileRecord)
02 – 扩展段地址记录(ExtendedSegment Address Record)
03 – 开始段地址记录(Start Segment Address Record)
04 – 扩展线性地址记录(Extended Linear Address Record)
05 – 开始线性地址记录(Extended Segment Address Record)
dd 是数据域 , 它代表一个字节的数据. 一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符.
cc 是校验和域 , 它表示这个记录的校验和.校验和的计算是通过将记录当中所有十六进制编码数字对的值相加, 以256为模进行以下补足.
表示为:“:[1字节长度][2字节地址][1字节记录类型][n字节数据段][1字节校验和] ”
具体事例
具体根据记录类型分析如下:
(1)数据记录”00”
:10246200464C5549442050524F46494C4500464C33
其中:10是这个记录当中数据字节的数量.即0x10 ;
2462 是数据将被下载到存储器当中的地址.即0x2462 ;
00 是记录类型( 数 据 记录).即0x00 ;
464C…464C是 数据.分别代表0x46,0x4C... ;
33是这个记录的校 验和即0x33;计算方法如下:256D-(10H+24H+62H+00H+46H+4CH+55H+49H+44H+20H+50H+52H+4FH+46H+49H+4CH+45H+00H+46H+4CH)/100H=33H;
(2)文件结束(EOF)”01”:00000001FF
其中:00 是记录当中数据字节的数量.
0000 是数据被下载到存储器当中的地址. 在文件结束记录当中地址是没有意义,被忽略的.0000h 是典型的地址;
01 是记录类型 01( 文件 结 束 记录)
FF 是 这个记录 的校 验 和, 计算方法如下: 256D-(00H+00H+00H+01H)=FFH;
(3)扩展线性地址记录(HEX386) ”04”:02000004FFFFFC
其中:02 是这个记录当中 数 据字 节 的 数量.
0000 是地址域, 对于 扩 展 线 性地址 记录 , 这个 域 总是0000.
04 是记录类型 04( 扩 展 线 性地址 记录)
FFFF 是地址的高16 位.
FC 是这个记录的校 验 和, 计算如下: 256D-(02H+00H+00H+04H+FFH+FFH)/100H=FFH;
当一个扩展线性地址记录被读取, 存储于数据域的扩展线性地址被保存,它被应于
从 HEX 文件读取来的随后的记录 . 线性地址保持有效, 到它被另外一个扩址录所改变。
通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得 数据记录的绝对存储器地址。
以下的例子演示了这个过 程:
:0200000480007A //数据记录的绝对存储器地址高16位为0x8000
:100000001D000A00000000000000000000000000C9
:100010000000000085F170706F0104005D00BD00FC
第一行,是Extended Linear Address Record,里面的数据,也就是基地址是0x8000,第二行是DataRecord,里面的地址值是0x0000。那么数据
1D000A00000000000000000000000000(共16个字节)要写入FLASH中的地址为 (0x8000<< 16)| 0x0000,也就是写入FLASH的0x80000000这个地址;第三行的数据写入地址为0x80000010.当一个HEX文件的数据超过64k的时候,文件中就会出现多个Extended Linear Address Record。
(4)扩展段地址记录(HEX86)“02“:020000021200EA
其中:02 是记录当中数据字节的数量;
0000 是地址域. 对于扩展段地址记录 ,这个域总是0000;
02 是记录类型 02( 扩展段地址记录);
1200 是地址段;
EA 是这个记录的校 验 和;
当一个扩展段地址记录被读取, 存储于数据域的扩展段地址被保存, 它被应用于从HEX文件读取来的随后的记录 .段地址保持有效, 直到它被另外一个扩展地址记录所改变。
通过把记录当中的地址域与被移位的来自扩展段地址记录的地址数据相加获得数 据记录的绝对存储器地址。