最近在使用辉芒微离线烧录器烧录程序时,提示“文件格式错误”,记录一下解决方法。
一、问题现象
经过多次尝试和排查,发现以下几种情况:
-
情况一:使用离线烧录器导入固件1(boot程序),可以顺利导入到离线烧录器,且将固件烧录到芯片后可正常运行。
-
情况二:使用离线烧录器导入固件2(app程序),同样可以导入到离线烧录器。
-
情况三:使用离线烧录器导入固件3(app程序去除IAP部分,地址也更改为没有IAP的情况),可以导入到离线烧录器,且将固件烧录到芯片后可正常运行。
-
情况四:当尝试使用离线烧录器一起导入固件1与固件2时,却提示“文件格式错误”。
从以上现象可以初步判断:问题可能出在固件2中。
二、排查
为了进一步确定问题所在,我将固件1与固件2分别导入到J-Flash中进行查看。以下是导入后的hex文件显示情况:
- 固件1导入到J-Flash hex文件显示:
固件1的起始地址为0x08000000。
- 固件2导入到J-Flash hex文件显示:
固件1的起始地址为0x08003800。
在查看hex文件时,我发现了一个关键问题:起始地址为0x08003800的固件2,在地址为0x08001000的地方有数据定义。这表明固件2在0x08001000地址的数据定义会覆盖固件1在地址0x08001000的内容。
三、问题结论
经过上述排查,可以明确问题的原因:在使用离线烧录器合并两个固件时,固件2在0x08001000地址的数据定义覆盖固件1在地址0x08001000的内容,从而导致离线烧录器提示“文件格式错误”。
四、解决方案
针对这一问题:我采取了以下解决方法:
-
1、调整数据存放位置:在项目中,我将固件2中定义在0x08001000的数据存放到了其他地方,避免了地址冲突。这种方法简单直接,适用于对固件2的数据存放位置有调整空间的情况。
-
2、合并IAP与APP:另一种方法是将IAP与APP进行合并。以下是几种常见的合并方法:
- 方法一:使用专门的合并工具,按照指定的地址和格式将IAP和APP合并为一个完整的固件文件。这种方法操作相对简单,但需要找到合适的合并工具。
① 可以使用二进制文件合并工具,将IAP和APP的bin文件拖入工具界面,设置好偏移量等参数后进行合并。
②使用J-Flasj等烧录软件,先将IAP程序烧录到芯片,再将APP程序烧录到指定地址,最后统一读取出来保存为一个文件。
③使用ST-LINK Utility或STM32CubeProg等工具,先分别烧录IAP和APP程序,再读取合并后的程序文件。具体方法可参考:
STM32合并烧录IAP+APP
IAP与APP合并为一个烧写文件-STM32实测
IAP代码和APP代码合并烧录过程示范
IAP、APP程序拼接,及Hex/Bin格式互转- 方法二:手动编辑hex文件,将IAP和APP的内容按照地址顺序合并到一个文件中。这种方法需要一定的hex文件编辑经验,但可以更灵活地控制合并过程。
具体方法可参考:
合并STM32 iap的hex文件合并为一个hex文件
五、总结
遇到以上分析和解决过程,我们成功解决了辉芒微离线烧录器“文件格式错误”的问题。在实际开发过程中,遇到类似问题时,可以通过以下步骤进行排查和解决:
-
1、单独测试固件:分别测试每个固件,确定单个固件是否可以正常导入和烧录。
-
2、检查地址冲突:使用工具查看固件的hex文件,检查是否存在地址冲突。
-
3、调整或合并固件:根据实际情况,调整数据存放位置或合并固件,避免地址冲突。
希望以上经验能为遇到类似问题的开发者提供参考。