在單片機(jī)的開(kāi)發(fā)過(guò)程中,經(jīng)常需要將兩個(gè)單獨(dú)的BIN文件合并成一個(gè)文件,方便燒寫和生產(chǎn)。
超好用的一個(gè)工具,可以實(shí)現(xiàn)兩個(gè)二進(jìn)制bin文件的合并,任一指定偏移量合并。使用它可以直接將編譯好的兩個(gè)bin文件按照程序員需要合并,而不需費(fèi)力去重建工程重新編譯。有興趣的朋友可以試試。
方法:
首先簡(jiǎn)單介紹一下STM32的IAP。IAP(In-application-programming),即在應(yīng)用中編程。有了它,產(chǎn)品發(fā)布之后,仍然可 以方便的升級(jí)固件,而不需要拆機(jī)并用JTAG等方式更新程序。IAP系統(tǒng)的固件一般有兩部分組成,IAP BootLoader Code和Application Code,如下圖所示。
系統(tǒng)啟動(dòng)時(shí),首先運(yùn)行IAP BootLoader Code,并檢測(cè)相應(yīng)狀態(tài),判斷是執(zhí)行升級(jí)的流程還是直接運(yùn)行本地的Application Code。 一般來(lái)說(shuō),BootLoader和Application是分別編譯的,會(huì)生成兩個(gè)二進(jìn)制文件。在工廠生產(chǎn)時(shí),如果分別燒寫這兩個(gè)文件,顯然有些麻煩。這 時(shí),我們就可以將兩個(gè)BIN文件合并成一個(gè),直接燒寫。假設(shè)Application Code的偏移地址為0x1000,IAP固件在Flash中的分布如下圖所示。
下面介紹第一種方法,使用二進(jìn)制文件合并工具(UBIN.exe),這個(gè)小工具是以前在S3C2410上開(kāi)發(fā)uCOS時(shí)做的,功能比較簡(jiǎn)單,滿足一般的需求。
首先,添加第一個(gè)文件1.bin,其地址為0x0000,所以,偏移量設(shè)置為0x00000000,設(shè)置完偏移量后點(diǎn)擊“添加”按鈕。
然后添加第二個(gè)文件,偏移量根據(jù)需要設(shè)置為0x00001000,如下圖所示。
設(shè)置目標(biāo)文件為C:\dst.bin,然后點(diǎn)擊“合并”按鈕。
正常情況下,會(huì)成功生成目標(biāo)文件,并有如下圖所示的提示信息。
這種方法相對(duì)比較靈活,對(duì)合并文件的個(gè)數(shù)和偏移地址沒(méi)有限制。缺點(diǎn)是不支持配置文件,不能保存所設(shè)的配置,所以,每次合并都得手動(dòng)做很多重復(fù)工作。在調(diào)試階段會(huì)比較浪費(fèi)時(shí)間。
下面介紹一種通過(guò)命令行工具合并兩個(gè)文件的方法。該方法需要用到fsutil.exe、cat.exe和hbin.exe。寫一個(gè)批處理文件,分別調(diào)用這三個(gè)工具,最終將1.bin和2.bin合并成dest.bin。批處理文件的內(nèi)容如下:
fsutil file createnew dest.bin 4096
cat 2.bin >>dest.bin
hbin 1.bin dest.bin
批處理文件各行的簡(jiǎn)單說(shuō)明,
- del dest.bin,刪除原來(lái)的目標(biāo)文件
- fsutil file createnew dest.bin 4096,創(chuàng)建一個(gè)大小為4096字節(jié)的空白文件dest.bin,該值的大小由偏移地址0x1000決定
- cat 2.bin >>dest.bin,將2.bin追加到空白文件dest.bin之后
- hbin 1.bin dest.bin,將1.bin放到dest.bin的頭上,填充dest.bin頭上4KB的空白
dest.bin就是我們最終需要的合并完成的文件。將它與第一種方法合并的文件dst.bin對(duì)比一下,如下。
可以看到兩種方法合并出的文件,完全一樣。
第二種方法的好處在于,可以在集成開(kāi)發(fā)環(huán)境中設(shè)置編譯選項(xiàng),在編譯完成之后自動(dòng)執(zhí)行該批處理,這樣,編譯完成后即得到能夠直接固化到Flash中的二進(jìn)制文件,節(jié)省了一些時(shí)間。