格式
Intel Hex文件是遵循Intel Hex文件格式的ASCII文本文件。
文件的每一行中都包含了一个由16进制数据组成hex记录。
标识符 | 数据长度(1Byte) | 偏移地址(2Byte) | 数据类型(1Byte) | 数据(nByte) | 校验码(1Byte) |
---|---|---|---|---|---|
: | 02 | 0000 | 04 | 0800 | F2 |
说明
Intel Hex标识符以’:’开头
数据类型
00–数据记录
(8bit/ 16bit/ 32bit)
:020000040800F2//(: 02 0000 04 0800 F2)基地址为0x08000000
:104800009004002055940008599200085B9200081B//(: 10 4800 00 09004002055940008599200085B920008 1B)数据存放地址为0x08000000+0x4800,数据长度为0x10,数据内容为:09004002055940008599200085B92000801–文件结束记录
(8 bit/ 16 bit/ 32 bit)02–扩展段地址记录
(16 bit/32 bit)
16位的扩展段地址记录用于SBA(segment Base Address)的4-19bit,也被当作USBA(Upper Segment Base Address),其SBA的0-3bit为0,即该记录定义了数据存放的基地址(USBA << 4)。
:020000040800F2//(: 02 0000 02 0800 F2)USBA为0800,即基地址为0x0800 << 4,即等于0x8000。03–开始段地址记录
(16 bit/ 32 bit)04–扩展线性地址记录
(32 bit)
32位的扩展线性地址记录用在LBA(Linear Base Address)的16-31bit,也被当作ULBA(Upper Linear Base Address),其LBA的0-15bit都是0,即该记录定义了数据存放的基地址(ULBA << 16)
:020000040800F2//(: 02 0000 04 0800 F2)ULBA为0800,即基地址为0x0800 << 16,即等于0x08000000。05–开始线性地址记录
(32 bit)
:0400000508009465F6//(: 04 0000 05 08009465 F6)程序从0x08009465开始执行
校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行补足
检验和 = 0x100 - 累加和
详细说明
数据记录”00”
Intel HEX文件由任意数量以回车换行符结束的数据记录组成数据记录外观如下:
: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;
文件结束(EOF)”01”
Intel HEX文件必须以文件结束(EOF) 记录结束这个记录的记录类的值必须是01.EOF 记录 外 观总是如下:
:00000001FF
其中:00 是记录当中数据字节的数量.
0000 是数据被下载到存储器当中的地址. 在文件结束记录当中地址是没有意义,被忽略的.0000h 是典型的地址;
01 是记录类型 01( 文件结束记录)
FF 是这个记录的校验和, 计算方法如下: 256D-(00H+00H+00H+01H)=FFH;
扩展线性地址记录(HEX386) ”04”
由于每行标识数据地址的只有2Byte,所以最大只能到64K,为了可以保存高地址的数据,就有了Extended Linear AddressRecord。如果这行的数据类型是0x04,那么,这行的数据就是随后数据的基地址。
扩展线性地址记录也叫作32位地址记录或HEX386记录.这些记录含数据的高16位扩展线性地址记录总是有两个数据字节,外观如下:
:02000004FFFFFC
其中:02 是这个记录当中 数 据字 节 的 数量.
0000 是地址域, 对于 扩 展 线 性地址 记录 , 这个 域 总是0000.
04 是记录类型 04( 扩 展 线 性地址 记录)
FFFF 是地址的高16 位.
FC 是这个记录的校 验 和, 计算如下: 256D-(02H+00H+00H+04H+FFH+FFH)/100H=FFH;
当一 个扩展 线 性地址记录被读 取, 存 储于数据域的扩展线性地址被保存,它被应于
从 Intel 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。
扩展段地址记录(HEX86)“02“
扩展段地址记录也叫HEX86 记录 , 它包括4-19 位数据地址段. 扩展段地址记总是有两
个数 据字节 , 外观如下:
:020000021200EA
其中:02 是记录当中 数 据字 节 的 数量;
0000 是地址域. 对于 扩 展段地址 记录 , 这个 域 总是0000;
02 是记录类型 02( 扩 展段地址 记录);
1200 是地址段;
EA 是这个记录的校 验 和;
当一 个扩 展段地址 记录 被 读 取, 存 储 于 数 据域的 扩 展段地址被保存, 它 被 应 用于 从 Intel HEX 文件 读 取 来的 随 后的 记录 . 段地址保持有效, 直到 它 被另外一 个扩 展地址 记录 所改 变。
通 过 把 记录当 中的地址域 与 被移位的 来 自 扩 展段地址 记录 的地址 数 据相加 获 得 数 据 记录 的 绝对 存 储器地址。
以下的例子演示了这个过 程..
来自 数 据 记录地址域的地址 2462 + 1200 << 4 = 00014462