市面上大多数单片机的Hex文件都是基于Intel Hex,而dsPIC33E也不例外,dsPIC33E支持的格式为Intel HEX32(INHX32)。
hex文件以ascii形式,按照行来记录数据
每一行从:开始,每至少2个字符表示一组16进制数据,格式为 :BBAAAATTHHHH....HHHCC
BB -- 16进制,表示此行数据长度字节数,表示HH的数目
AAAA -- 16进制,表示数据记录的起始地址,若此行是数据记录,则表示偏移地址,其它无意义
TT -- 16进制,表示记录类型,
00-数据记录(Data Record);
01-文件记录结束(End of File record);
02-扩展段地址记录(Extend Segment address record);后面所有数据地址+段地址左移4位
04-扩展线性地址记录(Extend Linear address record);后面所有数据地址+线性地址左移16位
HH...HH -- 16进制,低字节/高字节 结合数据,高字节在后;注意,若是偏移地址,则都是2字节,高字节在前,低字节在后
CC -- 16进制,校验码,除冒号和自身以外的其他字节数据加起来模除256的余数的补码。
例如:10A6B0000000EB00D4FD0700000F78001E007800BA
CC=01+~(10+A6+B0+00+00+00+EB+00+D4+FD+07+00+00+0F+78+00+1E+00+78+00)=BA
需要特别注意的是:
1、Intel hex是针对字节的,而16位程序计数器不是,需要进行特殊处理,对于dsPIC33E/PIC24E,每个程序存储器地址都是乘了一个2来获取字节地址,例如一个数据存于0x100,而在Hex中为0x200,详见dsPIC33E/PIC24E编程规范(DS70619B)扩展A中的介绍。
2、dsPIC33E/PIC24E没有扩展段地址,只有扩展线性地址
3、MPLAB X项目属性中的建设里,勾选规范会HEX文件和不勾选生成的HEX文件是不一样的,建议规范Hex
4、数据记录为little-endian,低端在前;而地址记录为bit-endian,高端在前
5、Hex文件记录中,一旦出现段地址或者线性地址,之后所有数据都要加偏移地址,直到出现一个新的段地址或者线性地址,再重新变更偏移地址。
6、对于真实地址,是 线性地址<<16 + 段地址<<4 + 偏移地址
示例:
:020000040108EA 线性偏移地址:0108
:0200000212FFBD 段偏移地址:12FF
:0401000090FFAA5502 数据地址:0100
:00000001FF 文件结束
真实地址为:0108左移16位,为01080000;12FF左移4位,为00012FF0;数据地址为00000100;加起来为010930F0
最终解析出来(8位单片机):
地址 数据
010930F0: 90
010930F1: FF
010930F2: AA
010930F3: 55
对于dsPIC33E/PIC24E,16为单片机,2个16位组成32(有效的是低24位)地址要除以2,所以真实地址解析如下:
00849878: 55AAFF90
0084987A: ......
而2个地址组成一个24位的指令字(32位的高8位为0),低端在前,所以表示实际地址应该如下:
00849878: 00AAFF90
0084987a: xxxxxxxx
以下为dsPIC33EP256MC506程序编译后的Hex文件解析,工具源码下载地址(内含Hex文件解析及Bootloader上位机):https://download.csdn.net/download/u010875635/10819828
本节Hex文件解析到此结束,下一节将数Bootloader下位机设计。