在單片機編譯中,我們經常使用hex文件進行燒錄,那么hex文件到底是一個怎樣的文件呢?我們簡單的介紹一下:
先上圖:這是我用Notepad++ 直接打開的一個32bit的單片機編譯器編譯的一個hex文件的部分,
ASCII顯示
十六進制顯示
不難發現:HEX格式文件以行為單位,每行由“:”(16進制為:0x3a)開始,以回車鍵結束(16進制為:0x0d,0x0a)。行內的數據都是由兩個字符表示一個16進制字節,比如”08”就表示數0x08;”0a”,就表示0x0a。對于16位的地址,則高位在前低位在后,比如地址0x010a,在HEX格式文件中就表示為字符串”010a”。
我們把每一行稱之為一個Record。通常一個Record的格式如下:
- RECORD MARK (第1個字符)
為1個byte,為ASCII的“:”,十六進制為“0x3A”。
如:
- LOAD RECLEN (“:” 后的2個字符)
1個byte,表示本行包含的數據的長度。如:
0x08 :表示本行有8byte的數據。
- OFFSET(LOAD RECLEN后的4個字符)
2個byte,表示數據存儲的起始地址,如:
這里表示從0x0000地址開始存儲8個數據,其中高位地址在前,低位地址在后。
- RECTYP(OFFSET后2個字符)
1個byte,表示數據的類型。該類型總共有以下幾種:
00 ----數據記錄
01 ----文件結束記錄
02 ----擴展段地址記錄
04 ----擴展線性地址記錄
如:
這里就是0x00即為數據記錄。
- INFO or DATA(RECTYP后的4個字符)
2個byte,表示本行包含的數據。如:
該處有16個字符,每2個字符表示一個byte,故此行有8個byte數據,這和前面的LOAD RECLEN所定義的數據長度是統一的。
- CHKSUM(INFO or DATA后的2個字符)
1個byte,為校驗碼。如:
校驗和的算法為:計算0x8D前所有16進制碼的累加和(不計進位),檢驗和 = 0x100 - 累加和
即:checksum = 0x100 - (0x08+0x01+0x5A+0x10) = 0x8D。
每個HEX格式的最后一行都是固定為:(hex文件的末尾一行)
:00000001FF
01表示文件結束記錄,FF為校驗。