热度 1
2022-6-7 08:59
2675 次阅读|
0 个评论
摘录: Intel HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。大多数EPROM编程器或模拟器使用Intel HEX文件。 Hex文件是可以烧写到单片机中,被单片机执行的一种文件格式,生成Hex文件的方式由很多种,可以通过不同的编译 器将C程序或者汇编程序编译生成hex。 一般Hex文件通过记事本就可以打开。可以发现一般Hex文件的记录格式如下: Intel HEX由任意数量的十六进制记录组成。每个记录包含5个域,它们按以下格式排列: 每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样: :(冒号) 每个Intel 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)数据记录”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 ; (2)文件结束(EOF)”01” Intel HEX文件必须以文件结束(EOF)记录结束这个记录的记录类的值必须是01.EOF记录外观总是如下: :00000001FF 其中: 00是记录当中数据字节的数量. 0000是数据被下载到存储器当中的地址.在文件结束记录当中地址是没有意义,被忽略的.0000h是典型的地址; 01是记录类型01(文件结束记录) FF是这个记录的校验和,计算方法如下: 256D-(00H+00H+00H+01H)=FFH; (3)扩展线性地址记录(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。 (4)扩展段地址记录(HEX86)“02“ 扩展段地址记录也叫HEX86记录,它包括4-19位数据地址段.扩展段地址记总是有两 个数据字节,外观如下: :020000021200EA 其中: 02是记录当中数据字节的数量; 0000是地址域.对于扩展段地址记录,这个域总是0000; 02是记录类型02(扩展段地址记录); 1200 是地址段; EA是这个记录的校验和; 当一个扩展段地址记录被读取,存储于数据域的扩展段地址被保存,它被应用于从Intel HEX文件读取来的随后的记录.段地址保持有效,直到它被另外一个扩展地址记录所改变。 通过把记录当中的地址域与被移位的来自扩展段地址记录的地址数据相加获得数据记录的绝对存储器地址。 以下的例子演示了这个过程.. 来自数据记录地址域的地址 2462 扩展段地址记录数据域 + 1200 -------------- 绝对存储器地址 00014462 来自