目录
一、HEX文件概述
二、HEX文件基本结构
三、记录类型详解
1. 数据记录 (00)
2. 文件结束记录 (01)
3. 扩展段地址记录 (02)
4. 扩展线性地址记录 (04)
5. 开始线性地址记录 (05)
6. 开始段地址记录 (03)
四、地址计算示例
示例1:扩展线性地址
示例2:扩展段地址
五、校验和计算方法
六、HEX文件解析算法
七、常见HEX文件结构
典型的ARM Cortex-M HEX文件
包含数据的HEX文件
八、高级特性
1. 不连续地址
2. 最小化文件
3. 多段地址空间
九、工具支持
常用工具arm-none-eabi-objcopy -O ihex firmware.elf firmware.hexsrec_cat input.hex -intel -o output.bin -binaryhex2bin firmware.hex
Python解析库
十、注意事项
十一、实际应用示例
生成HEX文件(C语言)
解析HEX并烧录(Python)
十二、常见问题
Q1: HEX文件中的地址是物理地址吗?
Q2: 如何合并多个HEX文件?
Q3: HEX文件能包含调试信息吗?
Q4: 为什么HEX文件比二进制文件大?
一、HEX文件概述
Intel HEX(十六进制)文件是一种用于存储和传输二进制数据的文本编码格式,广泛应用于嵌入式系统、微控制器编程等领域。
二、HEX文件基本结构
每个HEX文件由多行记录组成,每行记录格式如下:
:BBAAAATTDDDD...DDCC
各字段含义:
::起始字符,每行以冒号开始BB:数据长度(1字节,十六进制),表示本行数据字节数AAAA:地址(2字节,十六进制),表示数据存储的起始地址TT:记录类型(1字节,十六进制)DD...DD:数据字段,长度由BB指定CC:校验和(1字节,十六进制)
三、记录类型详解
1. 数据记录 (00)
:102000008121122C2F4512280B4512283FDD122862
最常见的记录类型
包含要烧录到存储器中的实际数据
地址字段表示存储的起始地址
2. 文件结束记录 (01)
:00000001FF
标志HEX文件结束
数据长度必须为00
地址字段通常为0000
校验和计算:01h + NOT(00h + 00h + 00h + 01h) = FFh
3. 扩展段地址记录 (02)
:020000021200EA
用于8086/8088处理器的段地址扩展
数据字段包含2字节的段地址
后续数据记录的地址是段地址+偏移地址
段地址左移4位后与偏移地址相加
4. 扩展线性地址记录 (04)
:020000040800F2
用于32位地址空间(如ARM Cortex-M)
数据字段包含2字节的高16位地址
与后续数据记录的地址拼接形成32位地址
示例中0800表示高16位,实际地址为0x0800XXXX
5. 开始线性地址记录 (05)
:04000005000020C116
指定程序的入口地址(复位向量)
数据字段包含4字节的32位地址
用于ARM架构的EIP(入口点)
示例中000020C1是程序的入口地址
6. 开始段地址记录 (03)
:0400000300003800C7
用于x86架构的CS:IP设置
数据字段包含4字节:2字节CS + 2字节IP
较少使用
四、地址计算示例
示例1:扩展线性地址
:020000040800F2 ; 设置高地址为0x0800 :10000000B5084B... ; 实际地址 = 0x08000000 + 0x0000 = 0x08000000 :10001000F0B50A4B...; 实际地址 = 0x08000000 + 0x0010 = 0x08000010
示例2:扩展段地址
:020000021000EC ; 设置段地址为0x1000 :10000000B5084B... ; 实际地址 = (0x1000 << 4) + 0x0000 = 0x10000
五、校验和计算方法
校验和 = 0x100 - (所有字节和 mod 0x100)
计算步骤:
将冒号后的所有字节(包括长度、地址、类型、数据)相加
取和的低8位
计算补码(0x100 - 和值)
示例:
:10246200464C5549442050524F46494C4500464C33
计算过程:
字节值:0x10, 0x24, 0x62, 0x00, 0x46, 0x4C, 0x55, 0x49, 0x44, 0x20, 0x50, 0x52, 0x4F, 0x46, 0x49, 0x4C, 0x45, 0x00, 0x46, 0x4C
求和:0x10 + 0x24 + 0x62 + 0x00 + ... + 0x46 + 0x4C = 0x6CD
取低8位:0xCD
补码:0x100 - 0xCD = 0x33 ✓
六、HEX文件解析算法
def parse_hex_line(line): """解析一行HEX记录""" if line[0] != ':': return None byte_count = int(line[1:3], 16) address = int(line[3:7], 16) record_type = int(line[7:9], 16) data = bytes.fromhex(line[9:9+byte_count*2]) checksum = int(line[9+byte_count*2:], 16) # 验证校验和 calc_sum = sum(bytes.fromhex(line[1:-2])) calc_checksum = (0x100 - (calc_sum & 0xFF)) & 0xFF if calc_checksum != checksum: print(f"校验和错误: 计算值={calc_checksum:02X}, 文件值={checksum:02X}") return { 'byte_count': byte_count, 'address': address, 'type': record_type, 'data': data, 'checksum': checksum }七、常见HEX文件结构
典型的ARM Cortex-M HEX文件
:020000040800F2 ; 设置Flash地址为0x08000000 :10000000B5084B1B68184698474268D368... ; 中断向量表 :10001000F0B50A4B1B6800221A701946... ; 程序代码 ... (更多数据记录) ... :04000005000020C116 ; 入口地址 :00000001FF ; 文件结束
包含数据的HEX文件
:1001000041646472657373202020203031323334 ; ASCII数据 :1001100035363738392020202020202020202020 ; 更多数据 :00000001FF
八、高级特性
1. 不连续地址
HEX文件可以包含不连续的地址区域,用于:
跳过保留区域
仅更新部分Flash
多段数据存储
2. 最小化文件
只包含实际使用的地址空间,减少文件大小。
3. 多段地址空间
通过多次使用扩展地址记录,可以访问不同的地址空间:
Flash存储器
EEPROM
配置寄存器
九、工具支持
常用工具arm-none-eabi-objcopy -O ihex firmware.elf firmware.hexsrec_cat input.hex -intel -o output.bin -binaryhex2bin firmware.hex
Python解析库
import telhex # 读取HEX文件 ih = intelhex.IntelHex('firmware.hex') # 获取数据 data = ih.tobinarray() # 写入二进制文件 ih.tobinfile('firmware.bin')十、注意事项
字节序:HEX文件使用大端字节序(MSB first)
地址对齐:ARM Cortex-M通常要求4字节对齐
填充值:未编程区域通常为0xFF
最大长度:每行记录最多255字节数据
兼容性:确保烧录工具支持所有记录类型
十一、实际应用示例
生成HEX文件(C语言)
// 使用链接脚本指定地址 MEMORY { FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 256K RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K }解析HEX并烧录(Python)
def hex_to_binary(hex_file, bin_file): """将HEX文件转换为二进制""" ih = intelhex.IntelHex() ih.loadhex(hex_file) # 获取地址范围 start = ih.minaddr() end = ih.maxaddr() # 生成连续二进制数据 with open(bin_file, 'wb') as f: for addr in range(start, end+1): f.write(bytes([ih[addr] if addr in ih else 0xFF]))
十二、常见问题
Q1: HEX文件中的地址是物理地址吗?
A:通常是物理地址,但可以通过扩展地址记录映射到不同地址空间。
Q2: 如何合并多个HEX文件?
A:使用工具如srec_cat:
srec_cat file1.hex -intel file2.hex -intel -o combined.hex -intel
Q3: HEX文件能包含调试信息吗?
A:不能,HEX只包含二进制数据。调试信息通常存储在单独的ELF或MAP文件中。
Q4: 为什么HEX文件比二进制文件大?
A:HEX是文本格式,每个字节需要2个字符表示,加上地址和校验和等开销。
这种格式虽然看似简单,但在嵌入式开发中极其重要,是连接编译器和硬件的关键环节。