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文件是以行为单位来存储数据,每一行的格式如下:
- 第1个字节表示后面记录的是数据
- 第2和3个字节表示该行的起始地址
- 第4个字节表示数据段的类型
值 | 含义 |
---|---|
00 | 表示后面记录的是数据 |
01 | 表示文件结束 |
02 | 表示扩展段地址 |
03 | 表示开始段地址 |
04 | 表示扩展线性地址 |
05 | 表示开始线性地址 |
- 第5~N-1个字节是数据部分
- 第N个字节是数据校验部分,校验值为:0x100 - (从0到N-1个字节相加的和)
4 扩展地址段
从上面可以看到地址部分只有两个字节,可以表示的地址范围为0x0000到0xFFFF,如果地址超过0xFFFF,这个时候就需要使用扩展地址来表示了,如下面的数据:
c
:020000040800F2
:10033800040000001000000005000000474E5500B2
:10034800020000C0040000000300000000000000DC
- 其中第1行中每4个字节为0x04,表示扩展地址开始,那么下面所有行的地址都要使用该行数据部分左移16位来作为基地址 也就是
0x0800 << 16
也就是0x0800 0000
- 第2行的地址就是
0x0800 0000 + 0x0338
- 第3行的地址就是
0x0800 0000 + 0x0348
提示
欢迎评论、探讨,如果发现错误请指正。转载请注明出处! 探索者