嵌入式编译生成的HEX文件和BIN文件内容详解

2023-08-22 09:50发布

HEX文件就是以*.hex为后缀的文件。hex是intel规定的标准,hex的全称是Intel HEX,此类文件通常用于传输将被存于ROM或EEPROM中的程序和数据。是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。
HEX的英语原始意思是16进制。这种文件格式主要用于保存单片机固件。
整个文件以行为单位,每行以冒号开头,内容全部为16进制码,2个ASCII码字符表示1个Hex字节
1. Hex/bin文件如何生成
        如果是IAR,那么可以在output 处设置选择生成hex还是bin文件。如果是Keil,生成Hex文件用同样的设置方法,但是生成bin文件需要借助相应工具。
2. Hex文件解析
      Intel HEX 文件是由一行行符合Intel HEX 文件格式的文本所 构 成的ASCII 文本文件。在Intel HEX 文件中,每一行包含一 个 HEX 记录 。 这 些 记录 由 对应 机器 语 言 码 和/ 或常量 数 据的十六 进 制 编码数 字 组 成。Intel HEX 文件通常用于 传输将 被存于ROM 或者EPROM 中的程序和 数 据。大多 数 EPROM 编 程器或模 拟器使用Intel HEX 文件。 这里说的Hex文件单指STM32的固件,以.hex为后缀,比如下面为部分Hex文件的内容:

                                                图一
         整个文件以行为单位,每一行为一个记录。每行以冒号开头,内容全部为16进制码,2个 ASCII码字符表示1个Hex字节。
1、每行以冒号开头,":" (0X3a),每一行结尾都是以回车换行结尾((0x0D,0x0A)
2、第1字节0x02表示数据区的字节个数,用ASCII表示就是4个ASCII字符。
3、第2、3字节0x0000 表示偏移地址或无用填0
4、第4字节0x04表示本行记录的类型
'00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录
'01' End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾
'02' Extended Segment Address Record: 用来标识扩展段地址的记录
'03' Start Segment Address Record: 段地址 STM32不用
'04' Extended Linear Address Record: 用来标识扩展线性地址
'05' Start Linear Address Record: 程序启动运行的地址
5、5-6字节表示数据区
6、最后1个字节是校验字节。所有16进制码的累加和(不计进位),检验和 = 0x100 - 累加和
   如何用notepad++打开hex文件,如果每一个记录的最后一个字节即校验和不在notepad中显示为绿 {MOD},那么代表校验失败。
       第一行的0800标识烧写地址的高字节,第二行的第2,3个字节0000标识该行的数据烧写的地址的低字节。即第二行烧写到0x08000000,第三行烧写到0x08000100。


BIN是binary的缩写,译为“二进制”。binary file二进制文件是一个非text file文本文件的计算机文件。binary file是一种计算机文件格式,它以二进制编码表示文件的内容,见图1-1。这些文件通常包含计算机程序或数据,例如软件/固件、操作系统、文档、图像、音频和视频等。
在嵌入式软件开发中,binary file通常是软件固件或操作系统的映像文件,binary file通常用于将代码和数据加载到嵌入式系统的nonvolatile memory非易失性存储器(如flash memory)或其他存储器中。此外,binary file还可以用于将数据从一个嵌入式系统传输到另一个嵌入式系统。
BIN文件只有纯粹的数据(代码)信息,即图一Hex文件中黑 {MOD}数据区(没有地址、校验等信息)。它并不包含地址信息,所以烧写BIN时就需要指定烧写地址。由于不带地址等信息,所以比上面描述的hex文件内存占用小一些。
        除开了上面描述的在线烧录bin文件外(bootloader中代码处理,一般上位机使用ymoden协议),还可以使用JLinkARM工具JFlash烧录bin文件到STM32。
        下图是bin文件用ultraedit打开,由于里面只包含程序数据,没有地址校验等信息,其内容对应图一中数据部分,可以与图一数据部分的头尾对比,会发现是一模一样的。前面的地址只是编辑器排序方便查看而已,并不是实际要烧写到FLASH的地址,不是BIN文件的一部分。

                                                                             图2