hex文件的解析- keil

在你做升级的时候你会用到hex文件的加载,所以对hex文件的解析很重要。

1,结构

.hex整个文件以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)
格式为:

<0x3a >	数据长度
1byte	数据地址
2byte	数据类型
1byte	数据
nbyte	校验
1byte	<0x0d>	<0x0a>

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

:020000040004F6
:1000000018F09FE518F09FE518F09FE518F09FE5C0
:1000100018F09FE5805F20B9F0FF1FE518F09FE51D
…
:00000001FF

将每一行与表中对应:
第一行: 第一个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是校验码。
第一行,是Extended Linear Address Record里面的数据,基地址是0x0004,

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

:00000001FF

这样的一行数据内容是固定的,数据长度为0,地址为0。
校验值:每一行的最后一个值为此行数据的校验和。例如:

:1000000018F09FE518F09FE518F09FE518F09FE5C0 这行中的 0xC0
:1000100018F09FE5805F20B9F0FF1FE518F09FE51D 这行中的 0x1D

校验和的算法为:计算从0x3A 以后(不包括0x3A)的所有各字节的和模256的余。即各字节二进制算术和,不计超过256的溢出值,然后用0x100减去这个算数累加和,得出得值就是此行得校验和。
了解hex文件的结构 那么可以在嵌入式段进行升级文件的接受传输,根据hex文件的格式对升级传输文件的校验与传输结束判断等。常用于升级设备软件。

另外,有时升级的文件可以合成一个文件最后进行解析,这种情况下可以合并hex多个文件:

2,Hex文件合并方法:

1.将由keil生成的boot.hex文件的最后2行删除,类似如下内容:

:040000050800019559
:00000001FF

2.然后,将由keil生成的app.hex文件的全部内容复制到boot.hex的最后面,这样就合并为一个hex文件了。

猜你喜欢

转载自blog.csdn.net/qq_15555275/article/details/107052224