STM32 -Bin/Hex文件格式解析
文章目录
- 1. 概述
- 2. Hex文件
- 2.1 格式解析
- 2.2 数据类型
- 2.3 举例解析
- 2.4 合并两个Hex文件方法
- 3 总结(未完待续)
1. 概述
- Hex文件:它是单片机和嵌入式工程编译输出的一种常见的目标文件格式(比如keil就能编译输出hex文件),通过烧写工具把它下载到单片机中,程序就能在芯片中运行。
- Bin文件:keil就能编译输出Bin文件,当我们需要实现IAP远程升级芯片固件的时候,会通过Bootloader程序将Bin文件写到芯片的内部Flash里。
- 相关文档链接:
《用文本编辑器(记事本)合并两个Hex文件 - 详细操作步骤》
《J-Flash合并多个bin文件》
《Keil编译后生成bin文件占用内部Flash的大小,RAM,ROM,Code,RO-data,RW-data,ZI-data》
2. Hex文件
2.1 格式解析
- 每行以冒号(:)起始,后面每两个字母是一个8bit的16进制数;
- 每行的格式:BBAAAATTD……DCC:
- BB 表示本行数据的长度:
- AAAA 表示本行数据存储的地址;
- TT 表示数据类型;
- DD 是实际的数据,它的长度不定(每行以16字节对齐);
- CC 是校验和(计算方法:本行所有字节累加和(累加和只用低8位)取反再加1);
2.2 数据类型
-
数据类型一共有6种形式:
-
'00’数据记录(Hex文件的大部分记录都是数据记录);
-
'01’文件结束记录(标识Hex文件的结尾,放在文件的最后);
-
'02’扩展段地址记录;
-
'03’开始段地址记录;
-
'04’扩展线性地址记录(声明数据存储的高位地址);
-
'05’开始线性地址记录(线性起始地址指定__main(主程序前)函数的地址,通常可忽略);
-
2.3 举例解析
- 第一行 :020000040800F2
- 02 :表示本行数据的长度为2:
- 0000 :表示本行数据存储的地址;
- 04 :表示数据类型为扩展线性地址记录;
- 0800 :因为本行的数据类型为04,即0800声明了数据存储的高位地址为0x0800;
- F2 :校验和(计算方法:本行所有字节累加和(累加和只用低8位)取反再加1,即0xF2=0x01 + ∼(0x02+0x04+0x08))
- 第二行 :10300000E8740020493100085131000853310008AC
- 10 :表示本行数据的长度为16(可见数据存储以每行16字节对齐);
- 3000 :表示本行数据存储的地址低位为0x3000,即实际数据的存储地址为0x0800 3000;
- 00 :表示数据类型为数据记录;
- E…8 :因为本行的数据类型为00数据记录,DD区即为实际的数据;
- 第五行 :10FFF00004F086FA974890F82D000090954890F804
- 10 :表示本行数据的长度为16
- FFF0 :表示本行数据存储的地址低位为0x3010,即实际数据的存储地址为0x0800 FFF0;
- 第六行 :020000040801F1
- 02 :表示本行数据的长度为2:
- 0000 :表示本行数据存储的地址;
- 04 :表示数据类型为扩展线性地址记录;
- 0801 :声明了数据存储的高位地址为0x0801(当地址长度超过16bit 即0xFFFF时,就需要扩展线性地址记录再次声明新的高位地址);
- 倒数第三行 :0450900004012400F3
- 04 :表示本行数据的长度为4:
- 5090 :表示本行数据存储的地址低位为0x5090,即实际数据的存储地址为0x0801 5090;
- 00 :表示数据类型为数据记录;
- (此行长度不足0x10,只有0x04,这代表已经到了Hex文件数据的末尾了)
- 倒数第二行 :04000005080031318D
- 04 :表示本行数据的长度为4:
- 0000 :表示本行数据存储的地址;
- 05 :表示数据类型为开始线性地址记录;
- 此行内容通常可忽略,官方解释为:
- 线性起始地址指定__main(主程序前)函数的地址,但不指定启动代码的地址,启动代码通常在调用 SystemInit() 后调用__main。奇数线性起始地址表示 __main 是为 Thumb 指令集编译的。
- 线性起始地址记录可以出现在十六进制文件的任何地方。在大多数情况下,可以忽略该记录,因为它不包含闪存编程所需的信息。
- 倒数第一行 :00000001FF
- 00 :表示本行数据的长度为0:
- 0000 :表示本行数据存储的地址;
- 01 :表示文件结束记录(标识Hex文件的结尾,放在文件的最后);
2.4 合并两个Hex文件方法
- 当开发项目包含IAP升级芯片固件的功能时,需要把Bootloader和App两段代码的Hex文件合并以后再烧写,具体操作方法可参考以下内容:
- 《用文本编辑器(记事本)合并两个Hex文件 - 详细操作步骤》
3 总结(未完待续)
授人以鱼,不如授人以渔
这里只提供钓鱼方法而不是一条完整的鱼
有问题欢迎留言交流 / 指正o( *  ̄▽ ̄ * )ブ