在单片机设计的开发过程中,经常需要将两个独立的bin文件合并成一个文件,以便于烧录和生产制造。UBIN.exe是一款功能强大的工具,能够实现两个二进制bin文件的合并,支持任意特定偏移合并。使用它可以将编译好的两个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头部4k字节的空白dest.bin就是我们最后需要的合并完成的文件。将它与第一种方式合并的文件dst.bin比较一下,如下。可以看到两种方式合并出的文件,完全一样。第二种方式的好处在于,可以在集成化开发工具中设定编译选项,在编译完成后自动执行该批处理命令,这样编译完成后即可获得可以直接烧录到Flash中的二进制文件,节省了一些时间。