要对STM32进行更新动作, 就需要对程序文件进行解析, 大部分编译的生成程序文件是Hex或者Bin, 先来看看Hex的结构吧。
Hex文件格式最早由Intel公司于1973年创建。它最初是为了在Intel 8080微处理器上存储和传输二进制数据而设计的。随后,Hex文件格式成为了一种通用的标准,被广泛应用于嵌入式系统和微控制器编程中。
虽然Hex文件格式最初由Intel创建,但随着时间的推移,其他公司和组织也采用了这种格式,并对其进行了扩展和改进。因此,Hex文件格式已经成为一种行业标准,被广泛支持和使用。
需要注意的是,Hex文件格式的具体规范和细节可能会因不同的应用和实现而有所差异。因此,如果您在特定的应用或设备中使用Hex文件格式,建议查阅相关文档或规范,以确保正确解析和使用Hex文件。
Hexadecimal (Intel-Format) File (.hex) Definition
这份是比较简单易了解的 : What is the format of Intel Hexadecimal files (.hex)?
抄录如下:
一个示例的HEX文件如下所示:
:10008000AF5F67F0602703E0322CFA92007780C361
:1000900089001C6B7EA7CA9200FE10D2AA00477D81
:0B00A00080FA92006F3600C3A00076CB
:00000001FF
+++++++++++++++++++++++++++++++++++++++++++
该文件的格式如下:
第一个字符(:)= 记录的开始
接下来两个字符 = 记录长度(在此示例中为10h, 实际数据长度)
接下来四个字符 = 载入地址/偏移(在此示例中为0080h)
接下来两个字符 = 记录类型/本段数据的类型(00/01/02/03/04/05)(见下文)
剩余字符 = 实际数据(数据量字节数由前面记录长度 * 2, 文件存储是字符, 两个字符组成Hex)
最后两个字符 = 校验和(即所有字节的和,校验和为00)
++++++++++++++++++++++++++++++++++++++++++
文件的最后一行是特殊的,始终以上述形式结束。HEX记录类型如下所示:
00 = 数据记录
01 = 文件结束记录
02 = 扩展段地址记录
03 = 起始段地址记录
04 = 扩展线性地址记录
05 = 起始线性地址记录
如下是两端 数据记录
:10000000A005002001010008E31400087B1400088B
:10001000E11400083D0700087D16000800000000FC
切分一下
记录行号 | 记录标志 | 记录长度 | 偏移 | 数据类型 | 数据 | checksum |
---|---|---|---|---|---|---|
1 | : | 10 | 0000 | 00 | A005002001010008E31400087B140008 | 8B |
2 | : | 10 | 0010 | 00 | E11400083D0700087D16000800000000 | FC |
表示这个文件到此就是最后一段有效数据了, 例如:
上面展示的就是最后一行数据,:00000001FF, 切分一下
记录行号 | 记录标志 | 记录长度 | 偏移 | 数据类型 | 数据 | checksum |
---|---|---|---|---|---|---|
1 | : | 00 | 0000 | 01 | 空 | FF |
扩展段地址记录(Extended Segment Address Record):扩展段地址记录用于扩展加载地址的位数。它的记录类型为"02",地址字段表示扩展的段地址。扩展段地址记录通常与数据记录一起使用,以支持更大的地址空间。
扩展段地址记录的作用是扩展加载地址的位数,以支持更大的地址空间。在解析HEX文件时,当遇到扩展段地址记录时,可以将段地址的高16位设置为该记录中指定的扩展段地址。
请注意,扩展段地址记录通常与其他记录类型(如数据记录)一起使用,以确定程序的加载地址和执行地址。
格式:
起始段地址记录(Start Segment Address Record):起始段地址记录用于指示程序的起始执行地址。它的记录类型为"03",地址字段表示起始执行地址。
起始段地址记录的作用是指示程序的入口点,即程序应该从哪个段地址和偏移量开始执行。在解析HEX文件时,当遇到起始段地址记录时,可以将程序的执行地址设置为该记录中指定的段地址和偏移量。
请注意,起始段地址记录通常与其他记录类型(如数据记录)一起使用,以确定程序的加载地址和执行地址。
格式:
扩展线性地址记录(Extended Linear Address Record):扩展线性地址记录用于扩展线性地址的位数。它的记录类型为"04",地址字段表示扩展的线性地址。
格式 :
切分:
记录行号 | 记录标志 | 记录长度 | 偏移 | 数据类型 | 数据 | checksum |
---|---|---|---|---|---|---|
1 | : | 02 | 0000 | 04 | 0800 | F2 |
扩展线性地址记录的作用是扩展线性地址的位数,以支持更大的地址空间。在解析HEX文件时,当遇到扩展线性地址记录时,可以将线性地址的高16位设置为该记录中指定的扩展线性地址。
请注意,扩展线性地址记录通常与其他记录类型(如数据记录)一起使用,以确定程序的加载地址和执行地址。
例如 拼接 第二行 0000 地址就是 0x0800 0000 =》 0x8000000 程序的加载地址
起始线性地址记录(Start Linear Address Record):起始线性地址记录用于指示程序的起始执行地址。它的记录类型为"05,地址字段表示起始执行地址。
起始线性地址记录的作用是指示程序的入口点,即程序应该从哪个线性地址开始执行。在解析HEX文件时,当遇到起始线性地址记录时,可以将程序的执行地址设置为该记录中指定的地址。
请注意,起始线性地址记录通常与其他记录类型(如数据记录)一起使用,以确定程序的加载地址和执行地址。
格式 :
实例:
切分一下
记录行号 | 记录标志 | 记录长度 | 偏移 | 数据类型 | 数据 | checksum |
---|---|---|---|---|---|---|
1 | : | 04 | 0000 | 05 | 080000ED | FF |
起始执行地址为080000ED,表示程序的起始执行地址是080000ED。