加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

HEX文件格式

发布时间:2020-12-15 06:35:31 所属栏目:百科 来源:网络整理
导读:HEX文件格式学习笔记 ??????? 为了编写一个可以按照自己的要求进行ISP的程序,大概学习了一下HEX文件格式。把学习笔记写出来,以为重新巩固所学习内容。 HEX文件以行为单位。每行以字符?‘:’ (0x3a)开头,以回车换行符0x0d,0x0a为结束。每行开始和结束之间

HEX文件格式学习笔记

???????为了编写一个可以按照自己的要求进行ISP的程序,大概学习了一下HEX文件格式。把学习笔记写出来,以为重新巩固所学习内容。

HEX文件以行为单位。每行以字符?‘:’ (0x3a)开头,以回车换行符0x0d,0x0a为结束。每行开始和结束之间的所有内容,都是以字符形式表现的。例如数据如果是?0x1A?,那么转换到HEX格式的行里面就是0x31 0x41。如果数据是16bit的,例如地址,则先显示高位,后显示底位。例如?0x1234,转换成HEX格式文件后变成?0x31 0x32 0x33 0x34,显示出来以后就是1234。将数据部分内容每2个字符看做一个HEX数据,例如:

:020000040000FA,?我把它看做?0x02 0x00 0x00 0x04 0x00 0x00 0xFA

第一个?0x02?为数据长度。

紧跟着后面的0x00 0x00?为地址。

再后面的0x04为数据类型,类型共分一下几类:

'00' Data Record

'01' End of File Record

'02' Extended Segment Address Record

'03' Start Segment Address Record

'04' Extended Linear Address Record

'05' Start Linear Address Record

???????然后,接着0x04后面的两个?0x00 0x00就是数据。最后一个0xFA是校验码。

???????HEX文件的每一行都是这样的格式:

<0x3a>

[数据长度1Byte]

[数据地址2Byte]

[数据类型1Byte]

[数据nByte]

[校验1Byte]

<0x0d>

<0x0a>

?

在例如:

:1000000018F09FE518F09FE518F09FE518F09FE5C0

安装上面的数据行格式分析如下:

<0x3a>

?

[数据长度1Byte]

10

[数据地址2Byte]

00 00

[数据类型1Byte]

00

[数据nByte]

18F09FE518F09FE518F09FE518F09FE5

[校验1Byte]

C0

<0x0d>

?

<0x0a>

?

?

每行中的数据并不是一定有的,第二个直接的数据长度为0,那么这行就没有数据。

由于每行标识数据地址的只有2Byte,所以最大只能到64K,为了可以保存更大数据地址数据,就有了Extended LinearAddress Record。如果这行的数据类型是0x04,那么,这行的数据就是随后数据的基地址。例如:

:020000040004F6

:1000000018F09FE518F09FE518F09FE518F09FE5C0

:1000100018F09FE5805F20B9F0FF1FE518F09FE51D

第一行,是Extended LinearAddress Record,里面的基地址是0x0004,第二行是Data Record,里面的地址值是0x0000。那么数据18F09FE518F09FE518F09FE518F09FE5要写入FLASH中的地址为(0x0004 << 16) | 0x0000,也就是写入FLASH的0x40000这个地址。同样,第三行的数据的写入地址为0x40010。当一个HEX文件的数据超过64k的时候,文件中就会出现多个Extended Linear Address Record。

End of File Record?行是每一个HEX文件的最后一行。例如:

:00000001FF

这样的一行数据内容是固定的,数据长度为0,地址为0。

?

校验值:每一行的最后一个值为此行数据的校验和。例如:

:1000000018F09FE518F09FE518F09FE518F09FE5C0?这行中的?0xC0

:1000100018F09FE5805F20B9F0FF1FE518F09FE51D?这行中的?0x1D

?

校验和的算法为:计算从0x3A?以后(不包括0x3A)的所有各字节的和模256的余。即各字节二进制算术和,不计超过256的溢出值,然后用0x100减去这个算数累加和,得出得值就是此行得校验和。

?

Byyifan?????????2006.3.16

http://yifan.blog.com


什么是Intel HEX格式?

回答:

Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录
由十六进制数组成的机器码或者数据常量,Intel HEX文件经常被用于将程序或数据传输
存储到ROM.EPROM,大多数编程器和模拟器使用Intel HEX文件.

记录格式

一个Intel HEX文件可以包含任意多的十六进制记录,每条记录有五个域,下面是一个记录的格式.

:llaaaatt[dd...]cc

每一组字母是独立的一域,每一个字母是一个十六进制数字,每一域至少由两个十六进制数字组成,下面是字节的描述.

:冒号 ? ? 是每一条Intel HEX记录的开始

ll 是这条记录的长度域,他表示数据(dd)的字节数目.

aaaa 是地址域,他表示数据的起始地址
<如果是数据记录,这表示将要烧录的这条记录中的数据在EPROM中的偏移地址,
对于不支持扩展段地址和扩展线性地址的,如89C51,这就是此条记录的起始地址>

tt 这个域表示这条HEX记录的类型,他有可能是下面这几种类型
00 ----数据记录 ?? ??
01 ----文件结束记录
02 ----扩展段地址记录
04 ----扩展线性地址记录

dd ? 是数据域,表示一个字节的数据,一个记录可能有多个数据字节,字节数目可以
查看ll域的说明

cc ? 是效验和域,表示记录的效验和,计算方法是将本条记录冒号开始的所有字母对

<不包括本效验字和冒号> 所表示的十六进制数字
<一对字母表示一个十六进制数,这样的一个十六进制数为一个字节>

都加起来然后模除256得到的余数最后求出余数的补码即是本效验字节cc.
<例如:
:0300000002005E9D
cc=0x01+NOT((0x03+0x00+0x00+0x00+0x02+0x00+0x5E)%0x100)=0x01+0x9C=0x9D

C语言描述:
UCHAR cc;
cc=(UCHAR)~(0x03+0x00+0x00+0x00+0x02+0x00+0x5E);
cc++;
>
数据记录

IntelHEX文件由若干个数据记录组成,一个数据记录以一个回车和一个换行结束
? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? <回车为0x0d换行为0x0a>

比如下面的一条数据记录
:10246200464C5549442050524F46494C4500464C33

10 ? 是此行记录数据的字节数目
2462 ? 是数据在内存<将要烧写的eprom地址>中的起始地址
00 ? ? 是记录类型00(是一个数据记录)
464C 到 464C 是数据
33 ? 是此行记录的效验和

扩展线性地址记录(HEX386)
扩展线性地址记录也可称为 32位地址记录 ? 和 ? HEX386记录,这个纪录包含高16(16-31位)位数据地址,这种扩展的线性记录总是有两个字节数据,像下面这样:

:02000004FFFFFC
02 ? ? 是记录的数据字节数目
0000 ? 是地址域这在扩展地址记录中总是0000
04 ? ? 是记录类型04(扩展地址记录)
FFFF ? 是高16位地址
FC ? ? 是记录效验和,计算方法如下:
? ? ? ? 01h + NOT(02h + 00h + 00h + 04h + FFh + FFh)

当一个扩展线性地址记录被读到后,扩展线性地址记录的数据区域将被保存
并应用到后面从Intel HEX文件中读出的记录,这个扩展线性记录一直有效,
直到读到下一个扩展线性记录.


绝对内存地址 = 数据记录中的地址 + 移位后的扩展线性地址


下面举例说明这个过程

从数据记录的地址域得到地址 ?? ? ? ? 2462
从扩展线性地址记录的地址域得到地址 ? FFFF
绝对内存地址 ? ? ?? ? ? ? ? ? ? ? ? ? FFFF2462

扩展段地址记录 (HEX86)?

扩展段地址记录也被称为 HEX86记录,? 包含 4-19位的数据地址段,
这个扩展段地址记录总是有两字节数据,如下:

:020000021200EA
02 是 ?? 记录中的数据字节数目
0000 ? ? ? ? ? 是地址域,在扩展段地址记录中,这个域总是0000
02 ? ? ? ? ? 是记录类型02(扩展段地址的标示)
1200 ? ? 是该段的地址
EA ? ? 是效验和
计算如下:
01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).

当扩展段地址记录被读后,扩展段地址将被存储并应用到以后从Intel HEX文件读出的记录,这个段地址一直有效直到读到下一个扩展段地址记录

绝对内存地址 = 数据记录中的地址 + 移位后的扩展段地址


数据记录中的地址域 ?? ? 移位后扩展段地址记录中的地址域

下面举例说明这个过程

从数据记录的地址域得到地址 ?? ? ? ? ? ? ? ? 2 4 6 2
从扩展段地址记录的地址域得到地址 ?? ? ? ? 1 2 0 0
绝对内存地址 ? ? ?? ? ? ? ? ? ? ? ? 0 0 0 1 4 4 6 2

文件结束记录(EOF)
一个Intel HEX文件必须有一个文件结束记录,这个记录的类型域必须是01,
一个EOF记录总是这样:
:00000001FF
00是记录中数据字节的数目
0000这个地址对于EOF记录来说无任何意义
01记录类型是01(文件结束记录标示)
FF是效验和计算如下
01h + NOT(00h + 00h + 00h + 01h).
========================

总结

形如 :BBAAAATTHHHH...HHHHCC BB: Byte AAAA:数据记录的开始地址,高位在前,地位在后 ? ? ? 因为这个格式只支持8bits,地址被倍乘 ? ? ? 所以,为了得到实际的PIC的地址,需要将 地址除以2 TT: Type ? ? ? ? 00 数据记录 ? ? ? ? 01 记录结束 ? ? ? ? 04 扩展地址记录(表示32位地址的前缀,当然这种只能在 INHX32) HHHH:一个字(Word)的数据记录,高Byte在前,低Byte在后 ? ? ? TT之后,总共有 BB/2 个字 的数据 CC: 一个Byte的CheckSum 因为PIC16F873A只有4K的程序空间 所以,不会有 TT=04的 Linear Address Record

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读