实现STM32烧写程序-(3) Hex文件结构

发布时间:2024年01月15日

简介

要对STM32进行更新动作, 就需要对程序文件进行解析, 大部分编译的生成程序文件是Hex或者Bin, 先来看看Hex的结构吧。

资料

Hex文件 简介

Hex文件格式最早由Intel公司于1973年创建。它最初是为了在Intel 8080微处理器上存储和传输二进制数据而设计的。随后,Hex文件格式成为了一种通用的标准,被广泛应用于嵌入式系统和微控制器编程中。
虽然Hex文件格式最初由Intel创建,但随着时间的推移,其他公司和组织也采用了这种格式,并对其进行了扩展和改进。因此,Hex文件格式已经成为一种行业标准,被广泛支持和使用。
需要注意的是,Hex文件格式的具体规范和细节可能会因不同的应用和实现而有所差异。因此,如果您在特定的应用或设备中使用Hex文件格式,建议查阅相关文档或规范,以确保正确解析和使用Hex文件。

Hex 文件资料

Hexadecimal (Intel-Format) File (.hex) Definition

Hex Format.pdf

这份是比较简单易了解的 : 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 = 起始线性地址记录

数据类型说明

00 数据记录

如下是两端 数据记录

:10000000A005002001010008E31400087B1400088B
:10001000E11400083D0700087D16000800000000FC

切分一下

记录行号记录标志记录长度偏移数据类型数据checksum
1:10000000A005002001010008E31400087B1400088B
2:10001000E11400083D0700087D16000800000000FC

01 文件结束记录

表示这个文件到此就是最后一段有效数据了, 例如:
在这里插入图片描述
上面展示的就是最后一行数据,:00000001FF, 切分一下

记录行号记录标志记录长度偏移数据类型数据checksum
1:00000001FF

02 扩展段地址记录

扩展段地址记录(Extended Segment Address Record):扩展段地址记录用于扩展加载地址的位数。它的记录类型为"02",地址字段表示扩展的段地址。扩展段地址记录通常与数据记录一起使用,以支持更大的地址空间。
扩展段地址记录的作用是扩展加载地址的位数,以支持更大的地址空间。在解析HEX文件时,当遇到扩展段地址记录时,可以将段地址的高16位设置为该记录中指定的扩展段地址。
请注意,扩展段地址记录通常与其他记录类型(如数据记录)一起使用,以确定程序的加载地址和执行地址。

格式:
在这里插入图片描述

03 起始段地址记录

起始段地址记录(Start Segment Address Record):起始段地址记录用于指示程序的起始执行地址。它的记录类型为"03",地址字段表示起始执行地址。
起始段地址记录的作用是指示程序的入口点,即程序应该从哪个段地址和偏移量开始执行。在解析HEX文件时,当遇到起始段地址记录时,可以将程序的执行地址设置为该记录中指定的段地址和偏移量。
请注意,起始段地址记录通常与其他记录类型(如数据记录)一起使用,以确定程序的加载地址和执行地址。

格式:
在这里插入图片描述

04 扩展线性地址记录

扩展线性地址记录(Extended Linear Address Record):扩展线性地址记录用于扩展线性地址的位数。它的记录类型为"04",地址字段表示扩展的线性地址。

格式 :
在这里插入图片描述在这里插入图片描述
切分:

记录行号记录标志记录长度偏移数据类型数据checksum
1:020000040800F2

扩展线性地址记录的作用是扩展线性地址的位数,以支持更大的地址空间。在解析HEX文件时,当遇到扩展线性地址记录时,可以将线性地址的高16位设置为该记录中指定的扩展线性地址。

请注意,扩展线性地址记录通常与其他记录类型(如数据记录)一起使用,以确定程序的加载地址和执行地址。

例如 拼接 第二行 0000 地址就是 0x0800 0000 =》 0x8000000 程序的加载地址

05 起始线性地址记录

起始线性地址记录(Start Linear Address Record):起始线性地址记录用于指示程序的起始执行地址。它的记录类型为"05,地址字段表示起始执行地址。
起始线性地址记录的作用是指示程序的入口点,即程序应该从哪个线性地址开始执行。在解析HEX文件时,当遇到起始线性地址记录时,可以将程序的执行地址设置为该记录中指定的地址。
请注意,起始线性地址记录通常与其他记录类型(如数据记录)一起使用,以确定程序的加载地址和执行地址。

格式 :
在这里插入图片描述
实例:
在这里插入图片描述
切分一下

记录行号记录标志记录长度偏移数据类型数据checksum
1:04000005080000EDFF

起始执行地址为080000ED,表示程序的起始执行地址是080000ED。

文章来源:https://blog.csdn.net/halo_hsuh/article/details/135532034
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。