市面上大多數(shù)單片機的Hex文件都是基于Intel Hex,而dsPIC33C也不例外,dsPIC33C支持的格式為Intel HEX32(INHX32)。
hex文件以ascii形式,按照行來記錄數(shù)據(jù)。
Hex文件的基本格式為:
:BBAAAATTHHHH....HHHHCC
每個數(shù)據(jù)記錄都是以9字符前綴開始,并總是以2字符校驗和結束。無論格式如何,所有記錄都是以“:”開始。以下介紹了其中的各個元素。
- BB -- 16進制,表示此行數(shù)據(jù)長度字節(jié)數(shù),表示HH的數(shù)目
- AAAA -- 16進制,表示數(shù)據(jù)記錄的起始地址,若此行是數(shù)據(jù)記錄,則表示偏移地址,其它無意義
- TT -- 16進制,表示記錄類型
00-數(shù)據(jù)記錄(Data Record);
01-文件記錄結束(End of File record);
02-擴展段地址記錄(Extend Segment address record);后面所有數(shù)據(jù)地址+段地址左移4位;
03-擴展線性地址記錄(Extend Linear address record);后面所有數(shù)據(jù)地址+線性地址左移16位
- HH...HH -- 16進制,低字節(jié)/高字節(jié) 結合數(shù)據(jù),高字節(jié)在后;注意,若是偏移地址,則都是2字節(jié),高字節(jié)在前,低字節(jié)在后 ;
CC -- 16進制,校驗碼,除冒號和自身以外的其他字節(jié)數(shù)據(jù)加起來模除256的余數(shù)的補碼。
例如: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文件格式是針對字節(jié)的,而16位程序計數(shù)器不是,所以程序存儲器段需要特殊的處理。每個24位程序字都通過插入所謂的“虛擬字節(jié)”而擴展為32位。每個程序存儲器地址都乘以2來獲得字節(jié)地址。
下面是編譯后生成的Hex代碼示例。
第一條紅色框:02 0000 04 0000 fa
表示這條記錄有2個字節(jié)的數(shù)據(jù),起始地址為0000,類型為04,表示為擴展地址,具體數(shù)據(jù)為0000,校驗和為fa。
第二條紅色框: 10 3008 00 0000fa00007c80000080fa0000000600 42
表示這條記錄有10(HEX)個字節(jié)的數(shù)據(jù),起始地址為2400,類型為00,具體數(shù)據(jù)為0000fa00007c80000080fa0000000600,校驗和為42。
第三條紅色框:00 0000 01 FF - 結尾標志行
表示文件結束。
請注意,數(shù)據(jù)記錄的第二條紅框的裝入地址為3008,而源代碼指定的地址為0x1804。
Microchip 16bit MCU采用字的形式存儲指令代碼,每個字的長度為24位,共3個字節(jié)。指令的地址按2往上增加,地址的尾數(shù)都為偶數(shù)。在HEX文件中每條指令對應有4個字節(jié),即在最高位進行了補0操做,在HEX文件中插入了00“虛高字節(jié)”。數(shù)據(jù)是以“小數(shù)位”格式表示的,表示最低有效字節(jié)(LSB)先出現(xiàn)。虛擬字節(jié)后出現(xiàn),正好位于校驗和之前。
MCU另外的一種傳輸文件格式為BIN文件,BIN文件采用數(shù)據(jù)流的形式,從第一條有效數(shù)據(jù)開始,直到最后一個字節(jié)的數(shù)據(jù)均會包含。
HEX文件特點:優(yōu)點是整個文件小,有有效數(shù)據(jù)時才會產生記錄。缺點是傳輸時包含了起始符,地址,數(shù)據(jù)類型校驗和等數(shù)據(jù),數(shù)據(jù)的有效負荷率低。對數(shù)據(jù)幀的解析復雜。BIN文件特定:優(yōu)點是數(shù)據(jù)傳輸時簡單,傳輸?shù)亩际菙?shù)據(jù)。缺點是整個文件大,包含了全FF這種無效的數(shù)據(jù)。
HEX文件到BIN文件轉換,采用軟件H-Converter bin to hex可實現(xiàn)HEX和BIN之間的相互轉換。
下面以CAN Bootloader來傳輸數(shù)據(jù)(可以采用具有CAN外設的MCU,比如PIC18F46K80),實現(xiàn)對目標板應用程序的升級。
Bootloader程序流程圖如下,Appstate ==0x55,表示應用程序已升級到Flash空間。
Application程序流程圖。
至此,本專題初步介紹了Bootloader的原理、Flash空間分配、中斷重映射以及Hex解析,關于更深入的討論不作為本專題的討論范圍,感謝大家支持。如果覺得本專題對你有幫助,歡迎關注,點贊,轉發(fā),收藏!最后,由于本人認識水平有限,某些內容也認識不全面,望各位大佬賜教。