0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何快速将BootLoader与APP固件合并

Q4MP_gh_c472c21 ? 来源:CSDN博客 ? 作者:Acuity. ? 2021-09-24 14:19 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1、前言嵌入式固件一般分为BootLoader和App,BootLoader用于启动校验、App升级、App版本回滚等功能,BootLoader在cpu上电第一阶段中运行,之后跳转至App地址执行应用程序。

因此,在发布固件的时候,会存在BootLoader固件和App固件;此时我们期望是将BootLoader固件和App固件合并成为一个固件,这样在量产时只需烧录一次即可。

2、传统方式一些传统的方法都是“土办法”,没什么毛病,但比较繁琐。项目种类增加,或者版本发布频繁时更加体现出繁琐性,且易出错,操作稍微失误可能导致固件不完整;烧录不完整的固件,机子变“砖头”。

烧录两次,分别烧录BootLoader和App固件

烧录固件到芯片后,再从芯片读取固件,另存为hex文件

手动复制、合并固件

BootLoader支持App固件传输功能的,只烧录BootLoader,后期再升级App

3、高效方式我们目标是通过自动化脚本合并生成一个发布固件,提高效率和确保固件的完整性。

3.1 合并文件

Linux下的脚本我们用得很多,其实Windows的脚本也非常优秀,利用Windows的脚本可以快速实现增、删、查、改文件。常用Windows脚本命令如下。

合并两个文件:copy /b

重命名文件:ren 《source_file》 《dect_file》

删除文件:del

很显然,我们利用其合并命令,只需一条指令即可将BootLoader和App文件合并。

假设当前目录存在Boot.bin和App.bin文件,合并后文件命名为Firmware.bin。

copy /b .Boot.bin + .App.bin Firmware.bin

?

注:Windows的目录路径为反斜杠,与Linux不同。

?3.2 bin转hex

我们知道,二进制(bin)文件是不存在地址信息的,cpu上电执行并不一定是从地址0开始执行代码,如STM32芯片起始执行地址为0x8000000。

因此不能通过串口工具烧录bin文件,只能通过J-link或者ST-link烧录,并且在烧录前指定存储起始地址。因此,将bin文件转换为hex文件是有必要的。

「bin转hex方式:」

使用jflash工具,把合并后的bin文件,使用jflash打开,另存为hex格式文件

将bin文件烧录置芯片,读取出来,另存为hex文件

自己动手写一个bin转hex工具

借助第三方bin转hex工具前两者太繁琐,效率低下;第三个比较灵活,但需要花点时间;如果使用优秀的现成工具是最快捷的办法。推荐使用“srec_cat.exe”工具,可以结合Windows脚本一起使用。

3.2.1 srec_cat工具

srec_cat一个功能非常强大的文件合并、转换工具,支持功能众多,包括:

文件合并

文件分割

bin转hex

hex转bin

数据填充

CRC校验

此外,还存在srec的系列工具,文件比较工具 srec_cmp.exe和文件信息查看工具 srec_info.exe,可以从文章后面官方网站下载使用。

「文件合并」

命令格式:

srec_cat.exe 《源文件0》 《文件类型》 《源文件1》 《文件类型》 《目标文件》 《文件类型》

例子:

srec_cat.exe source0.bin -Binary source1.bin -Binary -o merge.bin -Binary

srec_cat.exe source0.hex -Intel source1.hex -Intel -o merge.hex -Intel

如果BootLoader和App生产的文件为hex格式,可以直接使用该命令合并为一个hex文件,注意地址的连续性。

「bin转hex」

命令格式:srec_cat.exe 《bin源文件》 《-Binary》 《-offset》 《偏移地址》 《-Output》 《hex目标文件》 《-Intel》

例子:

将Boot.bin和App.bin合并的Firmware.bin转换为hex格式文件。

srec_cat.exe Firmware.bin -Binary -offset 0x8000000 -o Firmware.hex -Intel

0x8000000,是STM32的起始执行地址。

更多的srec应用和工具下载详见官方网站:

?

http://srecord.sourceforge.net/download.html

?3.3 完整示例

第一步,在需要生成固件目录新建一个txt文件。

第二步,键入如下内容(Boot固件和App固件可以指定目录)。

copy /b .Boot.bin + .App.bin Firmware.bin

srec_cat.exe Firmware.bin -Binary -offset 0x8000000 -o Firmware.hex -Intel

del Firmware.bin

第三步,重命名txt文件为“.bat”后缀文件,即是Windows可执行脚本的文件类型。

第四步,双击运行脚本,即可生成目标文件。

出现任何目标文件生成失败的情况,检查相关源文件是否存在,路径是否正确。

3.4 举一反三

以此类比,存在多个App文件的情况,可以通过该方式分别进行合并出一个固件。另外,实际项目中,经常会使用内部flash空闲扇区保存一些设备参数信息,如校准系数、设备地址、序列号等信息。

我们可以将参数信息保存为一个bin文件,通过该方式和固件合并,这样量产时将参数和固件一并写入,提高生产效率!

来源:https://acuity.blog.csdn.net/article/details/106724373

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5158

    文章

    19735

    浏览量

    318737
  • APP
    APP
    +关注

    关注

    33

    文章

    1587

    浏览量

    74444

原文标题:一个高效的BootLoader与APP固件合并方法

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    tc377 BootLoader跳转到app后只运行core0是怎么回事?

    我这边有个工程,已经可以从BootLoader跳转到app中去运行了。BootLoader中只是core0有任务,core1,2也有启动。跳转到app后,只有
    发表于 07-30 06:58

    求助,关于TC275 bootloader+app开发的问题求解

    您好 目前想做一个简单的boot跳app的升级功能,采用的是autosar架构,现在的程序默认是从0xa0000000也就是PF0的位置开始,我把这个当做boot程序。我现在想制作一个从PF1
    发表于 07-15 06:48

    AT32 IAP using the USART

    对于AT32 MCU,除了出厂固化的bootloader,用户也可以在应用程序中编写自己的bootloader程序,用于最终产品的固件更新。此功能称为应用程序内编程(IAP)。 本应用笔记的目的
    发表于 07-11 10:51

    为什么无法加载DLL“Bootloader_Utils.dll”?

    最近我安装了新版本的EZ-PD?协议分析仪版本“4.1.0” 版本:147。 当我连接设备时,它提示我使用 EZPD_Firmware_Update_Tool 进行升级,而在更新固件时,我看到错误
    发表于 05-09 08:11

    【道生物联TKB-620开发板试用】TK8620自编译固件烧录注意事项

    接上一报告,我向TK8260模组烧录了自己编译的固件,结果无法正常运行,联系厂家,厂家说没有烧录bootloader所致,bootloader在以下位置: 如果只烧录应用,不烧录bootloa
    发表于 04-28 21:06

    mpc5744 bootloader怎么修改启动文件让RAM中的指定位置不清零?

    我在开发一个bootloader,当APP跳转bootloader时,我写了一个标志在ram的固定地址,然后进行非掉电复位;问题是进入Bootloader之后,这个标志会丢失,请问如何
    发表于 04-08 08:28

    求助,关于STM32串口Bootloader的两个问题求解

    串口Bootloader两个问题: 1.APPBootloader中对于串口的初始化以及中断处理函数的定义是否需要保持一致,特别是有关接收和发送的缓冲区? 2.Bootloader
    发表于 03-12 07:17

    自定义RISC V的bootloader-v3

    在生成SoC时,会生成一个预定义bootloader .bin文件,用于指定soc的工程运行的地址,这包括在flash的存储地址 ,加载到外存中的运行地址及在外存中分配的存储空间的大小 。下面我们
    的头像 发表于 03-10 09:05 ?1111次阅读
    自定义RISC V的<b class='flag-5'>bootloader</b>-v3

    如何快速创建用户自定义Board和App工程

    概述自HPM_SDKv1.7.0发布开始,在HPM_ENV中新增了user_template文件夹,以方便用户快速创建自定义的Board和App工程。user_template是用户模板工程,用户
    的头像 发表于 02-08 13:38 ?582次阅读
    如何<b class='flag-5'>快速</b>创建用户自定义Board和<b class='flag-5'>App</b>工程

    基于迅为RK3568开发板全国产平台,快速实现APP开机自启动技术分享

    基于迅为RK3568开发板全国产平台,快速实现APP开机自启动技术分享
    的头像 发表于 11-21 13:58 ?1000次阅读
    基于迅为RK3568开发板全国产平台,<b class='flag-5'>快速</b>实现<b class='flag-5'>APP</b>开机自启动技术分享

    自定义RISC V的bootloader-v2

    在生成SoC时,会生成一个预定义bootloader .bin文件,用于指定soc的工程运行的地址,这包括在flash的存储地址 ,加载到外存中的运行地址及在外存中分配的存储空间的大小 。下面我们
    的头像 发表于 10-31 12:37 ?1200次阅读
    自定义RISC V的<b class='flag-5'>bootloader</b>-v2

    如何做一个hpm6750evk2的bootloader

    我正在做一个hpm6750evk2的bootloader。设计很简单,boot工程代码只做跳转到1M后的APP工程代码处,APP工程就是做的一个点灯的程序而已,boot、APP工程都是
    发表于 10-23 19:01

    HPM6750 Bootloader设计

    我正在做一个hpm6750evk2的bootloader。设计很简单,boot工程代码只做跳转到1M后的APP工程代码处,APP工程就是做的一个点灯的程序而已,boot、APP工程都是
    发表于 10-23 18:59

    低功耗4G模组Air780E快速入门:固件的远程升级

    ?今天我们学习Air780E快速入门之固件的远程升级,小伙伴们,学起来吧! 一、生成差分包 合宙的远程升级支持使用合宙云平台和自建服务器,此例程使用的是合宙云平台。 1.1 准备新旧版的core
    的头像 发表于 10-17 07:14 ?802次阅读
    低功耗4G模组Air780E<b class='flag-5'>快速</b>入门:<b class='flag-5'>固件</b>的远程升级

    Gokit二次开发:云端快速APP生成

    云端快速自定义生成APP。机智云远程控制的种类机智云远程控制设备有以下几种方式:1、机智云产品调试APP
    的头像 发表于 08-30 12:15 ?707次阅读
    Gokit二次开发:云端<b class='flag-5'>快速</b><b class='flag-5'>APP</b>生成