hex文件 keil输出hex文件


在之前的文章中,我们探讨了bootloader的相关知识,今天我们将进一步深入,与大家分享关于烧录文件的相关内容。由于机器仅能识别二进制文件,因此我们需要通过编译器等工具将程序从C语言或汇编语言转换为HEX或BIN格式,以便下载到芯片中,确保芯片的正常运行。

HEX文件为ASCII码文件,包含升级文件的地址和校验信息,其地址设置可不连续。相比之下,BIN文件是十六进制文件,仅包含升级数据文件,其地址则必须是连续的。在占用内存方面,HEX文件所需的内存通常大于BIN文件;而在升级时间上,HEX文件的升级时间则可能因文件大小而变化,相对不固定,而BIN文件的升级时间则较为固定。

尽管理论上因文件地址可跳跃,升级HEX文件在时间上可能更短、效率更高,但在实际运用中,由于某些芯片在跳跃地址写入数据时可能会失败,因此常常需要将HEX文件转换为BIN文件,并确保数据写入时地址是连续的。这也意味着,在实际操作中,我们可能需要借助机或主机来完成这一转换过程。

推荐大家通过编译器直接生成BIN文件,这样的代码更为精简,逻辑也更为简单。TI和ST的IAP程序也提供了生成BIN文件的官方例程,值得大家参考学习。

那么,如何将HEX文件转换为BIN文件呢?接下来我们将详细解析这一过程。

关于校验和的计算方法为:从0x3A之后(排除0x3A)的所有字节进行求和,再模256运算。之后用0x100减去这个算数累加和得出的值即为校验和。在处理过程中需注意区分基地址和偏移地址、中间跳跃的地址需补0xff、文件结束不能漏掉一两字节等细节。

具体到每一行的处理,我们需要读取一行数据并校验此行的数据格式是否正确(包括冒号、校验和、换行符等)。若数据格式正确则继续处理下一行;若错误则提示“转换失败,第x行校验失败”。对于每一行的数据,我们需根据其值进行不同的处理:若值为0x01则表示文件结束并提示“文件转换完成”;若值为0x04则更新基地址;若值为0则记录地址、数据长度及数据内容。这样逐行读取处理,最终将HEX文件转换为BIN文件。

转换过程中需注意预测地址与实际地址的关系,当预测地址大于实际地址时,需要在BIN文件中补齐相应数量的0xFF;反之则不需要补齐。整个转换过程虽工作量较大,但一旦掌握技巧后还是比较简单的。对于电脑等设备因内存大、运行速度快,处理此类工作无压力;但对于通过MCU进行解析则会比较慢且具有一定难度。

在在线升级的应用环境中,笔者还是建议大家多使用BIN文件;TI和ST也提供了简单易用的生成BIN文件的方案,希望大家能够多加参考和学习。

好了,今天的分享就到这里了。如果有任何想法或疑问,欢迎大家在评论区一起交流讨论。