在單片機的開發過程中,經常需要將兩個單獨的BIN檔案合并成一個檔案,方便燒寫和生產。下面結合STM32的IAP Bootloader Code和Application Code的合并,介紹兩種合并BIN檔案的方法。
首先簡單介紹一下STM32的IAP。IAP(In-application-programming),即在應用中編程。有了它,產品發布之後,仍然可以方便的升級韌體,而不需要拆機並用JTAG等方式更新程式。IAP系統的韌體一般有兩部分組成,IAP BootLoader Code和Application Code,如所示。
系統啟動時,首先運行IAP BootLoader Code,並檢測相應狀態,判斷是執行升級的流程還是直接運行本地的Application Code。 一般來說,BootLoader和Application是分別編譯的,會產生兩個二進位檔案。在工廠生產時,如果分別燒寫這兩個檔案,顯然有些麻煩。這時,我們就可以將兩個BIN檔案合并成一個,直接燒寫。假設Application Code的位移地址為0x1000,IAP韌體在Flash中的分布如所示。
下面介紹第一種方法,使用二進位檔案合并工具(UBIN.exe),這個小工具是以前在S3C2410上開發uCOS時做的,功能比較簡單,滿足一般的需求。
首先,添加第一個檔案1.bin,其地址為0x0000,所以,位移量設定為0x00000000,設定完位移量後點擊“添加”按鈕。
然後添加第二個檔案,位移量根據需要設定為0x00001000,如所示。
設定目標檔案為C:\dst.bin,然後點擊“合并”按鈕。
正常情況下,會成功產生目標檔案,並有如所示的提示資訊。
這種方法相對比較靈活,對合并檔案的個數和位移地址沒有限制。缺點是不支援設定檔,不能儲存所設的配置,所以,每次合并都得手動做很多重複工作。在調試階段會比較浪費時間。
下面介紹一種通過命令列工具合并兩個檔案的方法。該方法需要用到fsutil.exe、cat.exe和hbin.exe。寫一個批次檔,分別調用這三個工具,最終將1.bin和2.bin合并成dest.bin。批次檔的內容如下:
del dest.bin
fsutil file createnew dest.bin 4096
cat 2.bin >>dest.bin
hbin 1.bin dest.bin
批次檔各行的簡單說明,
- del dest.bin,刪除原來的目標檔案
- fsutil file createnew dest.bin 4096,建立一個大小為4096位元組的空白檔案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對比一下,如下。
可以看到兩種方法合并出的檔案,完全一樣。
第二種方法的好處在於,可以在整合式開發環境中設定編譯選項,在編譯完成之後自動執行該批處理,這樣,編譯完成後即得到能夠直接固化到Flash中的二進位檔案,節省了一些時間。
文中介紹的相關工具的:http://files.cnblogs.com/we-hjb/HEBING.rar