Keil HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。大多数EPROM编程器或模拟器使用Intel HEX文件。
记录格式:
Intel HEX由任意数量的十六进制记录组成。每个记录包含5个域,它们按以下格式排列:
:llaaaatt[dd…]cc
每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。每一个域由至少两个十六进制编码数字组成,它们构成一个字节,如下描述:
符号 | 符号意义 |
---|---|
: | 每个Intel HEX记录都由冒号开头. |
ll | 是数据长度域,它代表记录当中数据字节(dd)的数量. |
aaaa | 是地址域,它代表记录当中数据的起始地址. |
tt | 是代表HEX记录类型的域,它可能是以下数据当中的一个: > 00 – 数据记录 > 01 – 文件结束记录 > 02 – 扩展段地址记录 > 04 – 扩展线性地址记录 > 05 - 运行地址记录 |
dd | 是数据域,它代表一个字节的数据. 一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符. |
cc | 是校验和域,它表示这个记录的校验和.校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足. |
扩展线性地址记录(HEX386) :
扩展线性地址记录也叫作32位地址记录或HEX386记录.这些记录包含数据地址的高16位.扩展线性地址记录总是有两个数据字节,外观如下:
:02000004FFFFFC
其中:
数据 | 数据意义 |
---|---|
02 | 这个记录当中数据字节的数量 |
0000 | 地址域,对于扩展线性地址记录,这个域总是0000. |
04 | 记录类型 04(扩展线性地址记录) |
FFFF | 地址的高16位. |
FC | 是这个记录的校验和,计算方法如下: » 01h + NOT(02h + 00h + 00h + 04h + FFh + FFh). |
当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从Intel HEX文件读取来的随后的记录.线性地址保持有效,直到它被另外一个扩展地址记录所改变.
通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址.
假设:
来自数据记录地址域的地址 2462
扩展线性地址记录的数据域 + FFFF
绝对存储器地址 FFFF2462
扩展段地址记录(HEX386) :
扩展段地址记录也叫HEX86记录,它包括4-19位数据地址段.扩展段地址记录总是有两个数据字节,外观如下:
:020000021200EA
其中:
数据 | 数据意义 |
---|---|
02 | 这个记录当中数据字节的数量 |
0000 | 地址域.对于扩展段地址记录,这个域总是0000. |
02 | 是记录类型 02(扩展段地址记录) |
1200 | 1200 是地址段. |
EA | 是这个记录的校验和,计算方法如下: » 01h + NOT(02h + 00h + 00h + 02h + 12h + 00h). |
当一个扩展段地址记录被读取,存储于数据域的扩展段地址被保存,它被应用于从Intel HEX文件读取来的随后的记录.段地址保持有效,直到它被另外一个扩展地址记录所改变.
通过把记录当中的地址域与被移位的来自扩展段地址记录的地址数据相加获得数据记录的绝对存储器地址.
以下的例子演示了这个过程.
来自数据记录地址域的地址 2462
扩展段地址记录数据域 + 1200 «1
绝对存储器地址 00014462
文件结束(EOF)记录(HEX386) :
Intel HEX文件必须以文件结束(EOF)记录结束.这个记录的记录类型域的值必须是01.EOF记录外观总是如下:
:00000001FF
其中:
数据 | 数据意义 |
---|---|
00 | 这个记录当中数据字节的数量 |
0000 | 是数据被下载到存储器当中的地址.在文件结束记录当中地址是没有意义被忽略的.0000h是典型的地址. |
01 | 记录类型 01(文件结束记录) |
FF | 这个记录的校验和,计算方法如下: » 01h + NOT(00h + 00h + 00h + 01h). |
文件整体分析 :
第一行 :02 0000 04 0800 F2
第二行 :10 0000 00 7806002051040008690200086B020008 0D
注意:地址是大开端,0800+0000 = 0x08000000
78060020是MSP初始值,其实为0x20000678,是小开端。
51040008 = 08000451 reset isr地址
151: LDR R0, =SystemInit ß-----------resetHandle
0x08000450 4809 LDR r0,[pc,#36] ; @0x08000478
152: BLX R0
0x08000452 4780 BLX r0
倒数第二行 :04 0000 05 08000131 BD, 05表示开始运行地址,08000131是地址的值。
倒数第一行 :00 0000 01 FF,hex文档结束
08000131为开始地址_main(),08000451为resetHandle地址,由于resethandle里面有systeminit函数,所以以resethandle为准!这两个都不用下载。