1、 文檔目標
解析MDK生成的HEX文件中的各個數據所代表的內容是什么,了解HEX文件中各個數據段的組成。并且通過計算校驗和的結果確認hex文件是否正確。
2、 問題場景
在項目開發過程中通常會根據項目需求去生成對應工程的HEX文件進行使用。而通常情況下,工程師拿到Hex文件都是用于燒錄或者調試使用的。那么其實對于Hex文件中各個數據段代表的意義都不太清楚(如圖2-1),每個數據的得到方式也不清楚。

圖 2-1
3、軟硬件環境
1)、軟件版本:Keil MDK 5.38a
2)、電腦環境:Windows 11
3)、外設硬件:無
4、解決方法
1)、首先,Intel HEX文件是一個ASCII文本文件,其中的文本行遵循Intel HEX文件格式。Intel 十六進制文件中的每一行包含一條十六進制記錄。這些記錄由表示機器語言代碼和/或常量數據的十六進制數組成。Intel十六進制文件通常用于傳輸將存儲在ROM或EPROM中的程序和數據。大多數EPROM程序員或模擬器可以使用Intel十六進制文件。
2)Hex文件的數據格式為:“:LLAAAATTDDDDDDDD...DDCC”
(1)“:”:表示開頭,每一行數據都會用冒號進行開頭,表示一個新的內存地址數據開頭
(2)“LL”:表示數據長度,L是4位的十六進制,LL表示一個字節。
(3)“AAAA”:表示偏移量,基于起始地址的偏移量是多少
(4)“TT”:表示這一行數據類型或數據標識是什么。
a) 00:表示數據標識;
b) 01:表示文件結束標識,通常的hex文件的最后一行數據中;
c) 02:表示擴展段的地址;
d) 04:表示線性地址;
e) 05:表示線性起始地址
(5)“DDD.....DDD”:這里就表示數據。每一個數字都是占4位,2個數字就是一個字節。
(6)“CC”:表示校驗碼。校驗碼是通過下面的公式進行計算出來的。
CheckSum = 0x100 - (Sum & 0xFF)
其中Sum是由這一行的所有字節進行相加所得,Sum與上0xFF后即保留Sum的后8位數據,然后再減去0x100。
3)例子:
(1)、HEX文件的開頭第一行(如圖4-3-1):“:020000040040BA”
(a)、“:”:表示開頭
(b)、“02”:表示數據長度,02是十六進制,單位的byte,即表示這一行的數據長度是2個字節。
(c)、“0000”:基于起始地址的偏移量是0x0000
(d)、“04”:表示這一行是線性地址
(e)、“0040”:這里就表示段地址信息。每一個數字都是占4位,這一行中4個數字,則16位即2bytes,和前面的第二部分的“10”進行對應。地址是0x0400000,是內存的起始地址即基地址
(f)、“BA”:表示校驗碼。校驗和的計算過程如下:
Sum = 0x02+0x00+0x00+0x04+0x00+0x40=0x46
CheckSum = 0x100-0x46&0xFF=0x100-0x46=0xBA

4-3-1
(2)、HEX文件的中間的數據行(如圖4-3-2):“:1000A0009B0340009B0340009B0340009B034000D8”
(a)、“:”:表示開頭
(b)、“10”:表示數據長度,這一行的數據長度是16個字節。
(c)、“00A0”:基于起始地址的偏移量是0x00A0
(d)、“00”:表示這一行是數據
(e)、“9B03......4000”:這里就表示數據。每一個數字都是占4位,這一行中32個數字,則128位即16bytes,和前面的第二部分的“10”進行對應。
(f)、“D8”:表示校驗碼。校驗和的計算過程如下:
Sum = 0x10+0x00+0xA0+0x00+0x9B+0x03+0x40+0x00+0x9B+0x03+0x40+0x00+0x9B+0x03+0x40+0x00+0x9B+0x03+0x40+0x00=0x428
CheckSum = 0x100-0x428&0xFF=0x100-0x28=0xD8

圖 4-3-2
(3)、Hex文件的倒數第二行數據(如圖4-3-3-2):“:040000050040014175”
(a)、“:”:表示開頭
(b)、“04”:表示數據長度,這一行的數據長度是4個字節。
(c)、“0000”:基于起始地址的偏移量是0x0000,這個偏移地址是無效數據,無需關注
(d)、“05”:表示這一行是線性起始地址
(e)、“00400141”:這里就表示線性起始地址。地址為0x00400141,是指令集執行的起始地址,這個地址指向的是__scatterload函數,該函數用于將程序代碼和數據從鏈接文件中加載到內存中,是由編譯器提供的。(如圖4-3-3-1)

圖4-3-3-1
(f)、“75”:表示校驗碼。校驗和的計算過程如下:
Sum = 0x04+0x00+0x00+0x05+0x00+0x40+0x01+0x41= =0x8B
CheckSum = 0x100-0x428&0xFF=0x100-0x8B=0x75

圖4-3-3-2
(4)、Hex文件的最后一行數據:“:00000001FF”
(a)、“:”:表示開頭
(b)、“00”:表示數據長度。
(c)、“0000”:基于起始地址的偏移量是0x0000,這個偏移地址是無效數據,無需關注
(d)、“01”:表示文件結束標識
(e)、“FF”:校驗和

圖4-3-4

首頁 > 資源中心 > FAQ
