在單片機開發中HEX文件和BIN文件是非常常見的燒寫文件格式,以常用開發環境Keil為例,分別創建HEX和BIN文件,比如:
1、創建HEX:在Keil里面可以通過勾選【魔法棒>Output>Creat HEX File】讓工程輸出HEX文件。
2、創建BIN:在Keil中在【魔法棒>User>After Build/Rebuild】標簽下勾選Run #1,同時在其對應的User Command文本框中輸入
fromelf --bin --output=@L.bin !L 編譯后就會輸出BIN文件。
言歸正傳,先簡單描述下HEX(左邊)和BIN(右邊)文件的區別:
1、HEX文件
HEX文件中同時包含的數據和地址信息,所以 在燒寫或下載HEX文件的時候,一般都不需要用戶指定地址。
2、BIN文件
BIN文件只有純粹的數據(代碼)信息,並不包含地址,所以燒寫BIN時就需要指定燒寫地址,一般可以在燒寫工具上修改。
下面看一個Keil下生成的HEX和BIN文件的部分代碼:
HEX文件內容都是ASCII編碼得到的,可以用本本編輯器直接打開,BIN文件不能用編輯器直接查看,可以把它轉換成16進制然后顯示(如在notepad++下裝一個插件就好:插件安裝):
很直觀的可以看到BIN文件只是HEX文件中的數據區域。
HEX格式解讀:
HEX文件每一行代表一個記錄(RECORD),其基本格式如下
RECORD MARK 冒號(:) 表示起始標志
LOAD RECLEN 數據長度 即INFO or DATA 段的數據長度
OFFSET 地址偏移 指定相對基地址的偏移量
RECTYP 記錄類型 記錄類型:“00”數據記錄 “01”文件結束記錄 '02'擴展段地址記錄 '03'起始段地址記錄 '04'擴展線性地址記錄 '05'開始線性地址記錄
INFO or DATA 數據信息 校驗值
首先要注意的時,1-byte中的byte在HEX文件中因為經過ASCII編碼的所以用兩個字符表示一個16進制即一個字節,,在BIN文件中則是直接用一個字節表示這兩字符,上面的圖很直觀
下面以HEX文件第一行為例,它的含義主要有,02表示數據段“6000”長度為2,0000表示偏移地址,04表示記錄類型為擴展線性地址的記錄,6000表示線性地址的基地址並且表示的時[16-31]區域即高位地址,[0-15]區域即低位默認為0。
最后的9A為校驗值,用0x100減去起始標志(:)后面所有字符累加對256的模值得到的結果作為校驗值:0x100-(0x02+0x00+0x00+0x04+0x60+0x00)%256=9A
其他記錄類型類似,可以參考PDF:HEX文件詳解