市面上大多数单片机的Hex文件都是基于Intel Hex,而dsPIC33C也不例外,dsPIC33C支持的格式为Intel HEX32(INHX32)。
hex文件以ascii形式,按照行来记录数据。
Hex文件的基本格式为:
:BBAAAATTHHHH....HHHHCC
每个数据记录都是以9字符前缀开始,并总是以2字符校验和结束。无论格式如何,所有记录都是以“:”开始。以下介绍了其中的各个元素。
- BB -- 16进制,表示此行数据长度字节数,表示HH的数目
- AAAA -- 16进制,表示数据记录的起始地址,若此行是数据记录,则表示偏移地址,其它无意义
- TT -- 16进制,表示记录类型
00-数据记录(Data Record);
01-文件记录结束(End of File record);
02-扩展段地址记录(Extend Segment address record);后面所有数据地址+段地址左移4位;
03-扩展线性地址记录(Extend Linear address record);后面所有数据地址+线性地址左移16位
- HH...HH -- 16进制,低字节/高字节 结合数据,高字节在后;注意,若是偏移地址,则都是2字节,高字节在前,低字节在后 ;
CC -- 16进制,校验码,除冒号和自身以外的其他字节数据加起来模除256的余数的补码。
例如:10 A6B0 00 0000EB00D4FD0700000F78001E007800 BA
CC=01+~(10+A6+B0+00+00+00+EB+00+D4+FD+07+00+00+0F+78+00+1E+00+78+00)=BA
由于Inter hex文件格式是针对字节的,而16位程序计数器不是,所以程序存储器段需要特殊的处理。每个24位程序字都通过插入所谓的“虚拟字节”而扩展为32位。每个程序存储器地址都乘以2来获得字节地址。
下面是编译后生成的Hex代码示例。
第一条红色框:02 0000 04 0000 fa
表示这条记录有2个字节的数据,起始地址为0000,类型为04,表示为扩展地址,具体数据为0000,校验和为fa。
第二条红色框: 10 3008 00 0000fa00007c80000080fa0000000600 42
表示这条记录有10(HEX)个字节的数据,起始地址为2400,类型为00,具体数据为0000fa00007c80000080fa0000000600,校验和为42。
第三条红色框:00 0000 01 FF - 结尾标志行
表示文件结束。
请注意,数据记录的第二条红框的装入地址为3008,而源代码指定的地址为0x1804。
Microchip 16bit MCU采用字的形式存储指令代码,每个字的长度为24位,共3个字节。指令的地址按2往上增加,地址的尾数都为偶数。在HEX文件中每条指令对应有4个字节,即在最高位进行了补0操做,在HEX文件中插入了00“虚高字节”。数据是以“小数位”格式表示的,表示最低有效字节(LSB)先出现。虚拟字节后出现,正好位于校验和之前。
MCU另外的一种传输文件格式为BIN文件,BIN文件采用数据流的形式,从第一条有效数据开始,直到最后一个字节的数据均会包含。
HEX文件特点:优点是整个文件小,有有效数据时才会产生记录。缺点是传输时包含了起始符,地址,数据类型校验和等数据,数据的有效负荷率低。对数据帧的解析复杂。BIN文件特定:优点是数据传输时简单,传输的都是数据。缺点是整个文件大,包含了全FF这种无效的数据。
HEX文件到BIN文件转换,采用软件H-Converter bin to hex可实现HEX和BIN之间的相互转换。
下面以CAN Bootloader来传输数据(可以采用具有CAN外设的MCU,比如PIC18F46K80),实现对目标板应用程序的升级。
Bootloader程序流程图如下,Appstate ==0x55,表示应用程序已升级到Flash空间。
Application程序流程图。
至此,本专题初步介绍了Bootloader的原理、Flash空间分配、中断重映射以及Hex解析,关于更深入的讨论不作为本专题的讨论范围,感谢大家支持。如果觉得本专题对你有帮助,欢迎关注,点赞,转发,收藏!最后,由于本人认识水平有限,某些内容也认识不全面,望各位大佬赐教。