STM32的hex文件格式的分析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32的hex文件格式的分析

日常开发工作中hex文件是经常要接触到的一种文件格式,就算平时你的开发是各种link直接下载,但如果你的项目批量量产了,那么一种生成文件(.bin或hex...)交给生产部门或是你的终端产品需要支持远程升级交给平台工程师那么是不可避免要接触到的。所以还是要必须了解的。

下面开始结合stm32分析hex的文件格式:

官方定义:

<0x3a>[数据长度1Byte][数据地址2Byte][数据类型1Byte][数据nByte][校验1Byte]<0x0d><0x0a>

打开一个stm32生成的hex文件:

1)结合格式分析第一行(指定基地址)

:020*********F2

断句

: 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)分析最后两行(入口地址和文件结束)

顾名思义,我没有什么好说的了,对这块也没什么体会,就不赘述了。以后如果发现这里有什么知识点我再补充。水平有限,如有疏漏差错还请见谅

【注释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)

相关文档
最新文档