文章目录
前言
做过嵌入式产品软件在线升级的朋友,肯定对 .hex 文件比较熟悉(当然也有可能是 .bin)。
那么 hex文件 内存储的数据是怎么样的呢?个人认为了解它可避免设计处冗余的升级协议。
为此,我生成了两个 .hex 文件,通过 Sublime Text
查看其存储格式。
存储格式
*.hex 文件 节选
可以发现其存储非常有规律,且以 行 为单位。
我们以 :02 0000 04 08 00 F2
为例,可以发现其:
-
以
:
开头;以 换行 表示结束 -
“
02
”为16进制数据,表示该帧的 数据长度 为2 -
“
0000
”表示0x0000
,是该帧数据的 起始地址; -
“
04
”为 功能码 ,用来标识扩展线性地址的记录。功能码主要有:
-
00
- Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录 -
01
- 文件结束标志:用来标识文件结束,放在文件的最后,标识HEX文件的结尾 -
02
- 扩展段地址记录:用来标识扩展段地址的记录 -
03
- 开始段地址记录:开始段地址记录 -
04
- 扩展线性地址记录:用来标识扩展线性地址的记录 -
05
- 开始线性地址记录:开始线性地址记录
-
-
数据内容,这里有两位数据,分别是
0x80
和0x00
-
数据校验位,
F2
为除去:
外其他各位的 校验和校验实现示例:
/*校验和校验 */ public static byte CheckSum(byte[] frame){ byte re = 0; for(int i = 0; i < frame.length; i++){ re += frame[i]; } return (byte) (~re + 1); }
小结
至此,总结一下其数据格式,若以行读取,则以换行标记作为结束标志。
每行为一帧数据,数据格式如下:
: | Datalen( 1 byte ) | Addr (2 byte) | Cmd( 1 byte ) | Data( n * byte) | CheckSum( 1 byte ) |
---|
解析
:02 0000 04 08 00 F2
那么,:02 0000 04 08 00 F2
代表的是意思是什么呢?
由于我们的地址位只有 2byte,那么可表示的范围为0x0000
~ 0xFFFF
,即64KB
。
在STM32中,若Flash大于64KB
怎么办?
为此,引入了 线性地址 的概念。
Flash烧写地址 = (线性地址 << 16 ) | 偏移地址
而这条04
指令,就是设置基地址的指令。
所以,:02 0000 04 08 00 F2
的作用是 将基地址设置为0x8000
。
:02 0000 02 12 00 EA
解决地址问题的另一个方法是 扩展段地址 ,即02
指令。
而其地址计算方法为:
Flash烧写地址 = 段地址 + 偏移地址
:10 0000 00 78040020B90A0008F90A0008FB0A0008 71
这是一条数据记录指令。
10
表示这里记录了16byte
的数据;- 偏移地址为
0x0000
; - 指令类型为
00
; - 接着是
16byte
的数据; - 最后一位是校验。
:00 0000 01 FF
这是文件结束指令。
00
表示当中的数据字节数量;0000
表示地址,文件结束记录中的地址是没有意义的;01
表示文件结束;FF
表示校验和。
若有错漏;还望指正。