前言
最近有个需求,需要把单片机中的两个bin文件合并成一个bin文件,方便板子在生产烧录代码阶段可以节约烧录次数,这两个文件一般指的是BOOT+APP文件,bin文件里面没带有地址信息,但是在单片机中的烧录文件需要定位起始地址,所以就需要特别注意它们的偏移地址。因为可能会涉及到进制的转换,用了好几个工具都以失败告终,然后就总结两个简单的方法,哈哈。
两种方法
为了避免无硬件在手的情况,两种方法分别是有单片机和无单片机的情况下实现。
下图中main.c是存放脚本代码的文件,binMerge.exe是main.c运行后的执行文件,out_boot.bin是第一个文件,设起始地址为0x00,out_app.bin是第二个文件,设起始地址为0x4000,out.bin为两个bin合并文件。
一、有硬件
该方法需要单片机和jflash+ARM仿真器配合,以n32单片机为例。
过程:把两个bin文件导进单片机,然后再一起导出来一整个bin文件。
1、点击jflash.exe进入软件,创建自己的项目或者打开已有项目
2、导入out_boot.bin,注意设置该文件的单片机起始地址和查看该bin文件的起始地址
3、分别点击连接单片机,连接成功后,点击产品编程
4、导入out_app.bin,设置该文件的单片机起始地址和查看该bin文件的起始地址
5、导入全部的bin文件后,点击手动编程,读出整片数据,然后点击保存就可以得到合成后的bin文件
二、无硬件
无硬件的方法需要用到一个脚本代码,这个代码用到网上的一个开源代码,涉及到C语言的一些文件管理,表示看不懂,感兴趣的可以去阅读一下源码,也可以拿来直接用。
执行步骤:
1、WIN+R输入cmd进入Windows命令框。
2、cd Desktop\bin_C 回车进入自己创建的C文件夹
3、gcc main.c -o binMergeb编译可执行文件
4、.\binMerge.exe out_boot.bin out_app.bin 0x00 0x4000 out.bin
命令行执行结果:执行binMerge.exe之后会显示各个bin文件的起始地址
验证:可以看到,在0x00地址显示的是out_boot起始地址,在0x4000地址显示的是out_app.bin的起始地址,中间用0xFF填充,,如果需要修改填充值为0x00,可以到main.c函数中修改下面的宏。
#define FILL (uint8_t)0xff //空白地址填充值
总结
本次使用的两种方法感觉还是不够灵活,不能在keil5里面一起实现,但好歹也是自己找了一下午的方法,据说也可以通过winhex工具来实现,但是我没成功,方法千万种,学海无涯,以后再来探索了。
引用
1、可通过下载winhex或者jflash查看bin文件数据是否正确
官方下载地址:http://www.x-ways.net/winhex/index-m.html
2、Gitee资源下载链接(引用他人):https://gitee.com/sharkisyou/bin-merge.git
3、Gitee资源下载链接(本人):https://gitee.com/huang_ze_rong/bin-merge_-c.git
标签:bin,文件,起始,合并,单片机,地址,keil5,out From: https://blog.csdn.net/weixin_49030685/article/details/139690459