Intel HEX文件格式

1 篇文章 0 订阅

Intel HEX文件格式

HEX文件格式说明

微控制器上加载和运行的代码均为二进制的bin数据序列,是纯粹的机器码。将bin数据序列存成文件后,由于没有地址信息,且内容包含字节0x00~0x255的所有值,其中大部分为控制和不可显示字符,不能使用记事本直接打开,而且如果使用bin文件烧录程序时,还需要指定下载地址。
Intel hex文件是记录文本行的ASCII文本文件,是一种通用的二进制文件描述格式,以十六进制编码表示,用于存储数据和地址信息。它允许将数据和地址信息组织成易于理解和存储的形式,适合于在微控制器上编程和加载代码。一个数据记录以一个回车和一个换行结束<回车为0x0d换行为0x0a>。一个Intel HEX文件可以包含任意多的十六进制记录,每条记录有五个域,下面是一个记录的格式:

: LL AAAA TT [DD…] CC

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

说明
:每一条Intel HEX记录的开始
LLData Length,记录的长度域
表示数据(DD)的字节数目
AAAAAddress,地址域,表示数据的起始地址
TTRecord Type,HEX记录的类型[^1]
DDData,数据域,数据字节数由LL域指定,
每个数据字节用两个十六进制数字表示
CCCheck Sum,数据和校验域[^2]

[^1] 记录类型有以下几种:

类型说明
00数据记录实际的数据,起始地址由地址字段表示
01文件结束记录文件的结束,通常出现在文件的最后一条记录
02扩展段地址记录指定后续数据记录的起始地址向左移4位
03开始段地址记录指定程序的起始执行地址
04扩展线性地址记录指定后续数据记录的起始地址的高16位
05开始线性地址记录指定程序的起始执行地址

[^2]数据和校验,计算记录中所有十六进制编码数字对<一对字母表示一个十六进制数,不包括效验字本身和冒号>的值的和,然后模除256得到的余数,最后求出余数的补码(256减余数)即为校验和,校验和计算如下:
例如:

: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++;

HEX文件记录类型示例

一个HEX文件将代码在控制器里的位置描述清晰。从HEX的记录格式中地址字段来看,仅有两字节,可表示的地址范围为64K,当代码大于64K时将无法表示,此时需要通过扩展地址进行表示。扩展线性地址表示数据记录起始地址的高16位。在HEX文件中,通过扩展线性地址和数据起始地址,可以表示32位宽度的地址,此时可以表示足够大的地址范围[0~4G]。
一个HEX文件,一般按照代码从开始到结束进行描述。所以在文件最开始描述程序的扩展线性地址,然后再逐行描述程序的代码数据。当描述的代码数据超过64K长度时,需要再次调整扩展线性地址值,然后再次逐行描述程序的代码,直至代码程序描述结束。
当代码数据比较小,代码不大于64K时,一般只需要04,00,01三种类型的记录就可以。
如下为一个单片机程序描述,其中数据字段仅保留第一条和最后一条。
暂以下数据描述三种记录类型格式(由于不支持各域按不同颜色显示,原始MD文件可下载资源查看):

:02000004800179
:204000005AA38000920000406E8C6E0C2800A201E800C00166368C0066360C00000080E039
:…
:1846000000000000040000007CA380110000E10100000000000000000C
:204618005B050000609B801100002110422063308440A550C660E770088129914AA16BB1F0

:204B5800303132333435363738396162636465663031323334353637383941424344454639
:044B78000025000014
:184B7C0010000000AC4B8011404C8011544C8011844C8011B24C80114B
:204B9400A03F0000C04B80112880000262A38C00F694BC0165EC45DCF4223C02DA1A180032

:208B1400000000000000000062A38C000000000000000000000000000000000000000000B0
:088B3400000000000000000039
:208B3C000002000000008011F6303C002AD044006AC0080062030000E6363C006E2C6E0CE3

:208D1C0000000000000000E4F6303C002A9045006AC0080062030000E6363C006E2C6E0CEF
:0C8D3C0000000000000000E40000000047
:00000001FF

扩展线性地址记录

扩展线性地址一般在HEX文件的第一行,用于表示程序的起始地址高16位。一般单片机的程序地址空间定义在0地址,此时对应的扩展线性地址为0x0000。
当一个扩展线性地址记录被读到后,扩展线性地址记录的数据区域将被保存,并应用到后面从Intel HEX文件中读出的记录,这个扩展线性记录一直有效,直到读到下一个扩展线性记录。
上述示例代码地址描述如下:

:02000004800179

: :HEX记录的开始
02 :记录的长度,2个字节
0000 :数据的起始地址,此记录中无实际意义
04 :记录类型,指定后续数据记录的起始地址高16位
8001 :数据,表示后续起始地址为为 0x8001xxxx
79 :记录校验

数据记录

用于记录程序代码数据,一般数据可以为8位,16位,32位宽,由处理器的位宽确定。
由于数据记录一条一条相连接构成所有代码。当代码中有部分地址代码未定义,可直接调整数据的起始地址跳过。如上述数据中,存在多个数据记录的长度不为0x20。当程序中未定义代码区域较大时,可能需要增加扩展线性地址记录进行地址的变化。

:204000005AA38000920000406E8C6E0C2800A201E800C00166368C0066360C00000080E039

: :HEX记录的开始
20 :记录的长度,0x20 = 32个字节
4000 :数据的起始地址
00 :记录类型,代码数据
5AA38000920000406E8C6E0C2800A201E800C00166368C0066360C00000080E0 :数据,共32字节,存储在从 0x80010000 + 0x4000 = 0x80014000 位置开始的32字节位置
39 :记录校验
地址 = 数据记录中的地址 + 移位后的扩展线性地址
上述示例数据:
从数据记录的地址域得到地址 0x4000
从扩展线性地址记录的地址域得到地址 0x8001
绝对地址 0x80014000

文件结束记录

一般在HEX文件的最末尾,用于表示文件结束。

:00000001FF

: :HEX记录的开始
00 :记录的长度,无数据
0000 :数据的起始地址,无实际意义
01 :记录类型,文件结束
FF :记录校验

其它记录描述

一般情况下Intel HEX文件中包含上述三种记录已足够。
Intel HEX文件的格式详细情况请参看Wikipedia(打开比较慢):https://en.wikipedia.org/wiki/Intel_HEX

扩展说明

Xilinx 用于程序固化的MCS文件虽然是以.mcs后缀命名,但其本质是hex文件,把后缀改成.hex后,可以直接使用文件工具打开,完全符合Intel-HEX文件格式。
早期的微控制器仅有一个运行代码,且代码存储地址和运行地址一致。
由于技术发展,现在大部分的微控制器都有一个BOOT程序,然后有一个或者多个APP程序。在代码分别编译完成后,需要将多个HEX文件合并为一个HEX文件后再进行烧录。
目前对于STM32系列控制器有开源工具,工具采用C#所编写,git地址为:https://github.com/SmartElec/STM32-IAP-HEX-Merge
软件启动后界面如下,请自行下载使用。 Hex代码合并界面

  • 16
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值