📌 核心概念
HEX 文件是一种 ASCII 文本格式的固件文件,常用于:
- 单片机程序烧录
- BootLoader升级
- Flash存储器写入
常见编译器:
- KEIL
- IAR
- GCC ARM
生成的目标文件经过转换后即可得到 Intel HEX 文件。
🧱 一、Intel HEX整体结构
每一行称为一个 Record(记录)。
格式如下:
:LLAAAATTDD...DDCC
例如:
:100000000C94E94B18951895189518951895189518950E
Record结构
| 字段 | 大小 | 说明 |
|---|---|---|
| MARK | 1 Byte | 起始符 ‘:’ |
| RECLEN | 1 Byte | Data长度 |
| OFFSET | 2 Byte | 偏移地址 |
| RECTYP | 1 Byte | Record类型 |
| DATA | N Byte | 数据内容 |
| CHKSUM | 1 Byte | 校验和 |
📦 二、字段详解
MARK
:
固定字符:
0x3A
表示一条 Record 开始。
RECLEN
数据长度。
例如:
:10...
表示:
0x10 = 16 Bytes
DATA部分长度为16字节。
OFFSET
记录数据相对于当前基地址的偏移。
例如:
4800
表示:
offset = 0x4800
RECTYP
记录类型。
决定当前Record用途。
DATA
真正的数据内容。
长度必须与:
RECLEN
一致。
CHKSUM
校验和。
计算方式:
checksum = 0x100 - ( sum(all bytes) % 0x100)
例如:
:020000020000FC
计算:
0x02 + 0x00 + 0x00 + 0x02 + 0x00 + 0x00 = 0x04
0x100 - 0x04 = 0xFC
🗂 三、Record Type 类型表
| Type | 名称 | 说明 |
|---|---|---|
| 00 | Data Record | 数据记录 |
| 01 | End Of File | 文件结束 |
| 02 | Extended Segment Address | 扩展段地址 |
| 03 | Start Segment Address | 开始段地址 |
| 04 | Extended Linear Address | 扩展线性地址 |
| 05 | Start Linear Address | 开始线性地址 |
📡 四、扩展线性地址记录(Type=04)
用于32位地址空间。
结构:
:02000004ULBACC
字段:
| 字段 | 值 |
|---|---|
| RECLEN | 02 |
| OFFSET | 0000 |
| RECTYP | 04 |
| DATA | ULBA |
示例:
:020000040800F2
解析:
ULBA = 0x0800
得到:
LBA = ULBA << 16
= 0x08000000
📡 五、扩展段地址记录(Type=02)
结构:
:02000002USBACC
地址计算:
SBA = USBA << 4
示例:
USBA = 0x1000
得到:
SBA = 0x10000
🎯 六、数据记录(Type=00)
结构:
:LLAAAATTDD...DDCC
其中:
TT = 00
解析:
RECLEN = 0x10
OFFSET = 0x4800
TYPE = 00
数据:
9004002055940008599200085B920008
📍 七、数据地址计算
Linear模式
地址:
Address = LBA + OFFSET + Index
即:
(LBA + DRLO + DRI) MOD 4G
Segment模式
地址:
Address = SBA + OFFSET + Index
即:
(SBA + DRLO + DRI) MOD 64K
🚀 八、开始线性地址记录(Type=05)
用于指定程序入口地址。
结构:
:04000005EIPCC
示例:
:0400000508009465F6
入口地址:
0x08009465
🚀 九、开始段地址记录(Type=03)
用于8086架构。
结构:
:04000003CSIPCC
其中:
前16位 -> CS
后16位 -> IP
🏁 十、文件结束记录(Type=01)
结构:
:00000001FF
固定格式:
| 字段 | 值 |
|---|---|
| RECLEN | 00 |
| OFFSET | 0000 |
| TYPE | 01 |
| CHKSUM | FF |
表示:
HEX文件结束
🧠 开发重点记忆
① STM32最常见
Type 04 + Type 00 + Type 01
② 真正的数据都在
Type 00
③ Flash地址计算
实际地址 = ULBA << 16 + OFFSET
④ STM32程序入口
通常:
0x08000000
开始执行。
