l7kkzvta4q 发表于 2023-1-27 22:30:10

Hex格式文件的解析及单片机中代码实现

前言

最近在研究STM32的IAP升级功能,发现大多数的IAP升级时的文件格式都是BIN文件,可以直接烧录进FLASH中,但是BIN文件中不含FLASH的地址,这就造成了烧写程序存在一定的不严谨性,可能烧写出错后,不知道在哪块烧写的地址出错,只能全部重新烧写,为此研究了一下IAP升级时使用hex格式文件,hex格式文件每行数据都包含烧写的地址信息,可确保出错后可以方便定位到哪一段地址烧写错误。
hex文件的格式


https://p3-sign.toutiaoimg.com/pgc-image/2182ea4a62774d5997216cf96ac8462e~tplv-tt-large.image?x-expires=1990190787&x-signature=I7fIPMyuEd9QYzoeZGNhdO1UzeY%3D

hex文件部分

hex格式文件每行都必须以‘:’开头,以‘\r\n’换行。

如图,其中第一行:020000040800F2中,可以看做是0x02 0x00 0x00 0x04 0x08 0x00 0xf2,其前四个字节和最后一个字节有特殊含义。中间为数据

第一个0x02表示该行数据中有两个数据

第二个,第三个0x00 0x00表示本行数据的起始地址位,即起始地址为0x0000

第四个字节有0x00 0x01 0x02 0x03 0x04 0x05,分别有以下含义:

'00'Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录

'01'文件结束记录:用来标识文件结束,放在文件的最后,标识HEX文件的结尾

'02'扩展段地址记录:用来标识扩展段地址的记录

'03'开始段地址记录:开始段地址记录

'04'扩展线性地址记录:用来标识扩展线性地址的记录

'05'开始线性地址记录:开始线性地址记录

本行数据的第四个字节为04,即表示该行中的数据是记录扩展线性地址的,地址为0x0800,所以数据的起始地址为扩展线性地址+起始地址,即本例的起始地址为0x08000000

最后一个字节0xf2为校验和。校验和= 0x100 - 累加和

第二行数据:

:10F80000D83D002025A7010879A401087BA40108A0

该行数据0x10,表示该行有16个数据,F8 00 表示改行数据的起始地址为0xF800,00表示该行数据的类型是数据记录,D8 3D 00 20 25 A7 01 08 79 A4 01 08 7B A4 01 08表示记录的16个数据,A0为校验和。
代码实现

了解了hex文件的构成后,就需要用代码去解析该文件,在STM32中对接收到上层发下来的文件进行解析,具体代码实现过程如下:

hex文件数据的类型定义

https://p3-sign.toutiaoimg.com/pgc-image/8696dde00ab749588c84941f40ab28b1~tplv-tt-large.image?x-expires=1990190787&x-signature=%2FafFszD0iwMEwz7BZO61xn12Kck%3D

hex格式文件的类型定义

hex文件解析数据结构

https://p3-sign.toutiaoimg.com/pgc-image/67da2090f7564596931cb054348f334b~tplv-tt-large.image?x-expires=1990190787&x-signature=VhP%2Flm0mEhUmTFmrhwyuDkIAIdA%3D

hex格式文件结构体

hex文件数据行结构体,最大行需根据硬件的RAM缓存来设置,一般不超过30行。

https://p3-sign.toutiaoimg.com/pgc-image/b95e62326e7a473da8d1e60424a5b794~tplv-tt-large.image?x-expires=1990190787&x-signature=l1%2Fj%2FBQ9fhzvvFgjyE9bvn1yEAE%3D

数据行结构体

头文件定义好后,就可以着手编程了。

具体的代码如下:

https://p3-sign.toutiaoimg.com/pgc-image/1fa0da4da000485484a2498b9c8e7ad2~tplv-tt-large.image?x-expires=1990190787&x-signature=NdvCr%2BgIRK6gbYkZmMPjOyTUJDY%3D

hex数据转字符串

https://p3-sign.toutiaoimg.com/pgc-image/7a68170298bd40b98d583793f38c4d5d~tplv-tt-large.image?x-expires=1990190787&x-signature=TytmvHHeabZwV1yZh%2BPQmaZaW9c%3D

hex文件解析代码1

https://p3-sign.toutiaoimg.com/pgc-image/f31a7d41d4404a5cbe02ed1af23a52fa~tplv-tt-large.image?x-expires=1990190787&x-signature=aSZ1eJue1gEsmy3%2FGbyip6GYb30%3D

hex文件解析代码2

https://p3-sign.toutiaoimg.com/pgc-image/fe06171862114f069ac53333ac95c2ab~tplv-tt-large.image?x-expires=1990190787&x-signature=ijlVR3h%2FY69aJor19ZKAZqfFD8s%3D

hex文件解析代码3

https://p3-sign.toutiaoimg.com/pgc-image/a3416cfcb5f4467e8f5d1a09f7af8289~tplv-tt-large.image?x-expires=1990190787&x-signature=iWdQnv8ghoDI3VY9gGOajB5VD5Q%3D

hex文件解析代码4

https://p3-sign.toutiaoimg.com/pgc-image/c69cdd256bd948d4a64d53ab2b8204bb~tplv-tt-large.image?x-expires=1990190787&x-signature=0RiA3Xnig%2BIL2vJnsCSvd6SMR8A%3D

hex文件解析代码5

按此代码运行后就可以解析hex文件,实现IAP升级了。

话说头条编辑代码真的low,不像CSDN一样好用,就这样吧,凑合着看下截图的代码吧,若有源码需求的可以私信我。

高峰 发表于 2023-1-27 22:30:45

前辈,我最近也在做这个IAP,请问您这里的代码能给我分享一下吗?

lhh 发表于 2023-1-27 22:31:02

转发了

upzlkmlj9jlkuq 发表于 2023-1-27 22:31:58

转发了

uloste3sstytxp 发表于 2023-1-27 22:32:27

hex2char没有做非hex字符的判定啊,如果输入一个G,那就等于10了
页: [1]
查看完整版本: Hex格式文件的解析及单片机中代码实现