STM32
直播中

张艳

7年用户 1590经验值
私信 关注
[问答]

STM32的hex文件格式是怎样的?

STM32的hex文件格式是怎样的?

回帖(1)

吴樵

2021-11-26 16:00:08
STM32的hex文件格式的分析   日常开发工作中hex文件是经常要接触到的一种文件格式,就算平时你的开发是各种link直接下载,但如果你的项目批量量产了,那么一种生成文件(.bin或hex…)交给生产部门或是你的终端产品需要支持远程升级交给平台工程师那么是不可避免要接触到的。所以还是要必须了解的。
  下面开始结合stm32分析hex的文件格式:
官方定义:
<0x3a>[数据长度1Byte][数据地址2Byte][数据类型1Byte][数据nByte][校验1Byte]<0x0d><0x0a>
打开一个stm32生成的hex文件:

  
  

1)结合格式分析第一行(指定基地址)
:020000040800F2
断句
: 02 0000 04 0800 F2
  我们已经按格式说明分割开
  “:” 对应格式中的<0x3a>,0x3a就是冒号的ASCII码
  “02”对应的就是长度,这里就如所见,就是长度为2
  “0000”对应数据地址,长度为2个字节。Stm32一个32位的芯片两个字节肯定不足以表示地址(要四个),所以这里地址的具体用法要结合后面的数据类型分析。这里为4指定基地址,所以这两个字节并没有什么用。
  “04”对应的数据类型,具体的含义见【注释1】,这里的4是指定基地址。
  “0800”对应的是数据,长度是浮动的,这里是2个字节,和前面的长度相呼应。这里指定的是基地址。当然指定的是高16的地址,如常见的0x0800 0000 ,所以这个基地址<<16使用。
  “F2”对应的是校验结果,result = 256 - (date[0] + … +date[n])% 256 ,这一行数据比较少,我就给大家带入一下 0xF2 = 0x100 - (0x02 +0x00 + 0x00 + 0x04 + 0x08 + 0x00)%0x100。
校验范围大家都看见了,是从长度到数据结束字节的这么一个范围,不少同学以为只是校验数据段,那是错误的,你的意思是长度和类型不重要可以存储出错吗?
  “”对应<0x0d><0x0a>,就是回车和换行,这个东西大家应该很熟悉,因为stm32串口发送例程中,串口数据的结束用的就是这两个符号做标识。
  2)结合格式分析第二行(数据)
第二行开始到文件快结束的绝大部分内容都是对应的数据,我个人认为就相当于bin文件中所携带的内容,其他例如基地址,文件起始,文件结束等内容是hex文件才有的附加信息。这里我只是试着分析一下其特殊部分,和第一行中相同且没变化的部分就不再赘述了。
  :10000000600700200D0C0008050400080704000824
断句:
:10 0000 00 60 07 00 20 0D 0C 00 08 05 04 00 08 07 04 00 08 24
  “10”对应数据长度16,即60 07 00 20 0D 0C 00 08 05 04 00 08 07 04 00 08这16个字节。
  “0000”对应地址,这里类型是数据,准确的说是低16位,高十六位由第一行的04基地址类型指定,上面指定的是0800 这里指定的是0000,那么后面的16个字节的目标位置就是addr = 0x800 << 16 + 0x0000, 就是0x0800 0000,是不是很熟悉?不熟悉的看下图,帮助回忆一下

  

  

我修改一下给大家看一看。
修改为0x0800 1000:

  

  

再来看一下生成的hex文件,上图为0x800 0000 下图为0x800 1000

  

  


  

  

大家看到了,数据类型(0)中的地址都改变了,比原来大了0x1000,当然数据段中有绝对地址还有hex文件校验数据也都会因为这个数据的修改有所改变。
  “600700200D0C00080504000807040008”对应的是数据,这里的数据也就是我们实实在在要写入到产品flash中的东西,这里我放一张同一工程中bin文件,大家对比着看一下就清楚多了。

  

  


  

  

3)分析最后两行(入口地址和文件结束)

  
  

顾名思义,我没有什么好说的了,对这块也没什么体会,就不赘述了。以后如果发现这里有什么知识点我再补充。水平有限,如有疏漏差错还请见谅
  【20190407补充】
每行数据的地址是两个字节,可以携带64K的数据,但是如果生成的hex准确的说bin数据大于64k,这时候hex会有如何的变化呢,我用内联函数扩大了生成文件的大小,让生成hex远大于64K,结果hex文件的处理如下图所示:
  
  

  

我们看到了,是重新的指定了基地址,新开辟了64K字节的空间,00类型中的数据的<地址>又开始由0000开始累加了,当我们日常自己要处理hex文件,例如自己写离线下载上位机程序,或是IAP目标板程序,这一点要明确,基地址不仅是只会有一条。
  【注释1】
‘00’ Data Record 数据
‘01’ End of File Record 文件结束标志
‘02’ Extended Segment Address Record 延伸段地址
‘03’ Start Segment Address Record 起始延伸地址
‘04’ Extended Linear Address Record 扩展线性地址 也就是基地址
‘05’ Start Linear Address Record 程序起始地址也就是程序入口地址(main)
举报

更多回帖

发帖
×
20
完善资料,
赚取积分