前言

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

hex文件的格式

1b9cb3969c8c7ec86e1445d18e726ecf.png

hex文件部分

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

如图,其中第一行: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文件数据的类型定义

656271890987af87aaa2ca372d3a9c5f.png

hex格式文件的类型定义

hex文件解析数据结构

ee7990e1c2130f0a7de731ce31963ac7.png

hex格式文件结构体

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

b4ef3f98408f54466e5fd775d8cb5a16.png

数据行结构体

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

具体的代码如下:

c966247e3d3cd6f64a62dd52e02569ed.png

hex数据转字符串

36c0c9bb70fa462bbe2ee3f00f9ed318.png

hex文件解析代码1

d09b2a68c2db44aabd9b8ff0559c1662.png

hex文件解析代码2

da91f20ba4608d6077a68816b1d957ce.png

hex文件解析代码3

84b11362e9f9911348068cf3b88615eb.png

hex文件解析代码4

2612a9d85b3bd93ad07a6702262533f6.png

hex文件解析代码5

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

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

更多推荐