Skip to content
On this page

HEX文件详解


软件版本硬件版本更新内容

1 概述

HEX文件是在单片机开发量产时常用的一种编译生成的文件格式,用于烧写代码到特定的flash位置,在hex中包含地址信息和数据信息。

2 HEX文件的生成

通过在linux下使用GCC只能生成ELF文件,而不能生成HEX文件,那可以objcopy来将ELF转化为HEX文件,过程如下:

下面是一段C语言的代码,保存在test.c文件中

c
#include <stdio.h>

static int var = 1;

int main(int argc, char *argv[])
{
    printf("this is a test program. var = %d\n", var);
    return 0;
}

我们通过gcc来生成ELF文件

c
gcc test.c -o test

之后可以再通过objcopy来生成hex文件

c
objcopy -O ihex test test.hex

3 HEX文件格式

使用vim打开hex文件可以年到如下内容:

c
:100318002F6C696236342F6C642D6C696E75782D7C
:0C0328007838362D36342E736F2E3200DC
:10033800040000001000000005000000474E5500B2
:10034800020000C0040000000300000000000000DC
:10035800040000001400000003000000474E550090
:10036800FE24AC15903EE8E4AE5B8A254C1CBB51DC
:04037800622885660C
:10037C00040000001000000001000000474E550072
:10038C00000000000300000002000000000000005C

HEX文件是以行为单位来存储数据,每一行的格式如下: hex format

  • 第1个字节表示后面记录的是数据
  • 第2和3个字节表示该行的起始地址
  • 第4个字节表示数据段的类型
含义
00表示后面记录的是数据
01表示文件结束
02表示扩展段地址
03表示开始段地址
04表示扩展线性地址
05表示开始线性地址
  • 第5~N-1个字节是数据部分
  • 第N个字节是数据校验部分,校验值为:0x100 - (从0到N-1个字节相加的和)

4 扩展地址段

从上面可以看到地址部分只有两个字节,可以表示的地址范围为0x00000xFFFF,如果地址超过0xFFFF,这个时候就需要使用扩展地址来表示了,如下面的数据:

c
:020000040800F2
:10033800040000001000000005000000474E5500B2
:10034800020000C0040000000300000000000000DC
  • 其中第1行中每4个字节为0x04,表示扩展地址开始,那么下面所有行的地址都要使用该行数据部分左移16位来作为基地址 也就是 0x0800 << 16 也就是 0x0800 0000
  • 第2行的地址就是0x0800 0000 + 0x0338
  • 第3行的地址就是0x0800 0000 + 0x0348

提示

欢迎评论、探讨,如果发现错误请指正。转载请注明出处! 探索者


Released under the MIT License.