学习的路上,越努力越渺小。
——单片机初学者
在学习单片机的路上,
我用过
KEIL
、
CodeWarrior
、
CCS
等编译器,
但最近因一个小项目,
采用的
PIC18F25K80
芯片,使用
MPLAB
的
PICC18
编译器,在烧写代码的时候,突然意识到
自己一直在使用
.Hex
文件,但从未对该文件去研究、理解过,从而有此下文:
Hex
文件通常由编译器在项目编译链接后生成,用于传输被存储于
ROM
或者
EEPROM
的程序或数据,可在项目工程目录下查找到。用记事本或者
Notepad++
打开
hex
文件,
hex
文件由一行行“:数字”组成,每行以冒号开头,内容全部为
16
进制数字。
Hex
文件每行都是一个十六进制的记录,
该记录由
5
各部分组成:
数据长度
(
1
个字节)
、
数据起始地址(
2
个字节,高位在前,低位在后)、记录类型(
1
个字节)、数据(
n
个字
节)、校验码(
1
个字节)。
打开
Hex
文件,如下:
:02
0000
04
0800
F2
:10
1800
00
2039002055190008A1270008A3270008
47
:10
1810
00
00000000000000000000000000000000
C8
…
:10
C000
00
1A67296887689968A768B20529A40100
9A
:10
C010
00
204214021440420A0313DA0342140313
A9
:08
C020
00
0B03420A0327DB03
B6
:04
0000
05
080018BD
1A
:00
0000
01
FF
以
:101800002039002055190008A1270008A327000847
为例:
“
0x10
0x18
0x00
0x00
0x20
0x03
0x90
0x02
0x55
0x19
0x00
0x08
0xA1
0x27
0x00
0x08
0xA3
0x27
0x00
0x08
0x47
”
“:”
表示记录开始;
“
回车换行
”
表示记录结束;
“0x10”
表示数据长度是
16
,即本条记录数据是
16
个字节;
“0x18
0x00”
表示数据起始地址,即本条记录的数据起始地址为
0x1800
;
“0x00”
表示数据类型,数据类型有:
0x00
、
0x01
、
0x02
、
0x03
、
0x04
、
0x05
。
“0x00”
:数据记录;
“0x01”
:标识文件结束;
“0x02”
:标识扩展段地址记录;
“0x03”
:开始段地址记录;
“0x04”
:标识扩展线性地址记录(虚地址);
“0x05”
:开始线性地址记录(虚地址);
“0x20
--
0x08”
表示数据;
“0xA3”
表示校验码。
校验码的算法:
计算校验码前所有字节的累加和
(不进位)
,
校验码
=
0x100
-
累加和。
由此可知,上面的
hex
文件主要进行以下操作:标识扩展线性地址、记录数据、开始线
性地址记录、结束文件。
因对扩展线性地址的概念不明确,再次延伸: