hex文件是可以燒寫(xiě)到單片機(jī)中,被單片機(jī)執(zhí)行的一種文件格式,生成Hex文件的方式由很多種,可以通過(guò)不同的編譯器將C程序或者匯編程序編譯生成hex。
Hex文件如果用特殊的程序來(lái)查看(一般記事本就可以實(shí)現(xiàn))。打開(kāi)后可發(fā)現(xiàn),真?zhèn)€文件以行為單位,每行以冒號(hào)開(kāi)頭,內(nèi)容全部為16進(jìn)制碼。Hex文件可以按照如下的方式進(jìn)行拆分來(lái)分析其中的內(nèi)容:
例如:
:020000040000FA , 我把它看做 0x02 0x00 0x00 0x04 0x00 0x00 0xFA
第一個(gè) 0x02 為數(shù)據(jù)長(zhǎng)度。
緊跟著后面的0x00 0x00 為地址。
再后面的0x04為數(shù)據(jù)類型,類型共分以下幾類:
‘00’ Data Record
‘01’ End of File Record
‘02’ Extended Segment Address Record
‘03’ Start Segment Address Record
‘04’ Extended Linear Address Record
‘05’ Start Linear Address Record
然后,接著0x04后面的兩個(gè) 0x00 0x00就是數(shù)據(jù)。最后一個(gè)0xFA是校驗(yàn)碼。
HEX文件的每一行都是這樣的格式:
Intel hex 由一條或多條記錄組成,每條記錄都由一個(gè)冒號(hào)“:”打頭,其格式如下:
?。篊CAAAARR.。.ZZ
其中:
CC
本條記錄中的數(shù)據(jù)字節(jié)數(shù)
AAAA
本條記錄中的數(shù)據(jù)在存儲(chǔ)區(qū)中的起始地址
RR
記錄類型:
00 數(shù)據(jù)記錄 (data record)
01 結(jié)束記錄 (end record)
02 段記錄 (paragraph record)
03 轉(zhuǎn)移地址記錄 (transfer address record)
。。.
數(shù)據(jù)域
ZZ
數(shù)據(jù)域校驗(yàn)和
Intel hex文件記錄中的數(shù)字都是16進(jìn)制格式,兩個(gè)16進(jìn)制數(shù)字代表一個(gè)字節(jié)。CC域是數(shù)據(jù)域中的實(shí)際字節(jié)數(shù),地址、記錄類型和校驗(yàn)和域沒(méi)有計(jì)算在內(nèi)。校驗(yàn)和是取記錄中從數(shù)據(jù)字節(jié)計(jì)數(shù)域(CC)到數(shù)據(jù)域(。。.)最后一個(gè)字節(jié)的所有字節(jié)總和的2的補(bǔ)碼。
而B(niǎo)in文件是最純粹的二進(jìn)制機(jī)器代碼,沒(méi)有格式,或者說(shuō)是“順序格式”按assembly code順序翻譯成binary machine code.由于分析出來(lái)Hex文件中的數(shù)據(jù)域ASCII碼表示的十六進(jìn)制與二進(jìn)制一一對(duì)應(yīng),而且我公司DSP又是16位的,以一個(gè)word為最小單位,所以四個(gè)十六進(jìn)制ASCII碼代表一條機(jī)器指令單位或者地址。借于上面分析,編寫(xiě)了工具代碼。大體原理是用fscanf函數(shù)在每行的數(shù)據(jù)域讀入四個(gè)ASCII碼,以短整形(short int 16bit)形式儲(chǔ)存,在把這個(gè)短整形變量順序fwrite到文件流中去即可。
舉一例說(shuō)明:
表1
ORG 0000H
LJMP START
ORG 040H
START:
MOV SP,#5FH ;設(shè)堆棧
LOOP:
NOP
LJMP LOOP ;循環(huán)
END ;結(jié)束
表2
:03000000020040BB
?。?700400075815F000200431F
表3
02 00 40 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF 75 81 5F 00 02 00 43
表1為源程序,表2是匯編后得到的HEX文件,表3是由HEX文件轉(zhuǎn)換成的目標(biāo)文件,也就是最終寫(xiě)入EPROM的文件,它由編程器轉(zhuǎn)換得到,也可以由HEXBIN一類的程序轉(zhuǎn)換得到。學(xué)過(guò)手工匯編者應(yīng)當(dāng)不難找出表3與表1的一一對(duì)應(yīng)關(guān)系,值得注意的是從02 00 40后開(kāi)始的一長(zhǎng)串‘FF’,直到75 81,這是由于偽指令:ORG 040H造成的結(jié)果。
單片機(jī)程序?qū)懞弥螅覀兌家殉绦?a href="http://wenjunhu.com/soft/special/" target="_blank">下載到單片機(jī)的內(nèi)存中,單片機(jī)才會(huì)按照程序員的邏輯執(zhí)行命令實(shí)現(xiàn)功能。之前也講過(guò)下載單片機(jī)的幾種方式,比如ISP下載,JTAG下載,下載文件的格式最常見(jiàn)的是hex文件,這個(gè)格式大家都是知道的,還有一種bin文件是單片機(jī)的下載文件。下面介紹這兩種格式的區(qū)別。
HEX文件和BIN文件是我們經(jīng)常碰到的2種文件格式。下面簡(jiǎn)單介紹一下這2種文件格式的區(qū)別:
1. hex文件包含地址信息。在用ISP方式燒寫(xiě)程序時(shí),我們都有這樣的經(jīng)驗(yàn):1)選擇單片機(jī)型號(hào);2)選擇串口號(hào);3)設(shè)置波特率(或者默認(rèn));4)選擇下載的文件;5)點(diǎn)擊下載按鈕下載。如下圖所示。
經(jīng)過(guò)這幾步后,程序下載工作就完成了,在以上的步驟中我們并沒(méi)有選擇要把程序下載到單片機(jī)的哪塊內(nèi)存中,即不需要設(shè)置地址。因?yàn)镠EX文件內(nèi)部的信息已經(jīng)包括了地址。而燒寫(xiě)B(tài)IN文件的時(shí)候,用戶是一定需要指定地址信息的。單片機(jī)多下載hex文件。
2. BIN文件格式只包括了數(shù)據(jù)本身,沒(méi)有包含地址
bin文件本身只是數(shù)據(jù),沒(méi)有包含地址信息,所以在下載bin文件時(shí)需要選擇內(nèi)存的起始地址和終止地址,即要把bin文件下載到指定的內(nèi)存空間。通常需要指定程序內(nèi)存地址的芯片為ARM芯片和DSP芯片。
3、HEX文件和BIN文件大小不一樣
對(duì)于bin文件,通過(guò)右鍵屬性查看到的文件的大小就是數(shù)據(jù)的實(shí)際大小。而對(duì)HEX文件而言,你看到的文件大小并不是實(shí)際的數(shù)據(jù)的大小。一是因?yàn)镠EX文件是用ASCII來(lái)表示數(shù)據(jù),二是因?yàn)镠EX文件本身還包括別的附加信息。
評(píng)論
查看更多