stm32利用bootloader与app实现远程升级

1、flash空间分配:

事先在flash开辟好空间,假设flash为128k,我这边给它分为五个区,分别为bootloader、标志位、application、application backup、标签ID。

(注:升级之前,app的代码烧录于application的flash存储区域内。用于app升级的bin文件大小一定要小于自己开辟的flash空间大小)

2、 升级流程(以标签板为例):

上位机发送一个升级指令bootloader先判断是否收到升级指令,若收到升级指令,则进入升级状态。此时,将application backup的flash数据擦除,application backup区域开始接收app升级文件(即升级后的app代码)的数据包。若接收数据包失败,返回上位机一个接收失败的标志位,上位机再下发一个退出升级的标志位给bootloader,退出升级,然后(标签板)重启,(即从bootloader跳转到application的区域,读application的代码);若数据包全部成功接收,上位机判断app升级文件里边的版本号跟bin文件的文件名是否一致,若不一致,上位机返回标签板ID;若一致,则app升级成功,返回一个升级成功标志位给bootloader(与此同时,将application区域作为下次储存app升级文件的备用区),退出升级(跳出bootloader,跳转到application backup),代码从application backup区域开始执行。

若下次还要升级,则擦除的是application区域的存储数据,然后接收数据包,在执行上述的操作。(Application与application backup的存储区域是交替使用的)

升级机制:

上位机发送一个升级指令,APP先判断是否收到升级指令,若收到升级指令,将擦除事先划分好的flash的特定区域,然后把升级指令的标志位写入该区域,然后执行系统复位;接着程序从bootloader开始执行,bootloader读存放升级指令标志位的flash的信息,若为升级指令的标志,则进入升级状态。

此时,将application backup的flash数据擦除,application backup区域开始接收app升级程序的数据包。1、若接收数据包失败,返回上位机一个接收失败的标志位,上位机再下发一个退出升级的指令给标签板,若bootloader成功收到退出升级指令,退出升级,然后(标签板)重启(即从bootloader跳转到application的区域,运行application的代码)﹔若无收到退出升级指令,则标签板死机;2、若数据包全部成功接收,上位机判断app升级文件里边的版本号跟bin文件的文件名是否一致,若不一致,上位机返回标签板ID;若一致,则app升级成功,返回一个升级成功标志位给标签板的bootloader (与此同时,将application区域作为下次储存app升级文件的缓存区),退出升级(跳出bootloader,执行application backup代码)。

3、注意事项:app升级文件的中断向量表的偏移地址需要修改;app的起始地址需要修改。

若app一开始烧录于flash的application区域时,IROM1需要修改为0x80004000,size根据代码大小来定。

(注:升级app文件的IROM1需要修改为0x80011000

beyond compare软件可用于文件对比!!!

若app一开始烧录于flash的application区域时,中断向量表的偏移地址需设置为:

#define VECT_TAB_OFFSET  0x4000

(注:升级app文件的偏移地址也是需要修改的哦,根据第一张图为例,中断向量表的偏移地址需设置为:#define VECT_TAB_OFFSET  0x11000)

(下边这两张图不用管,嘿嘿)

(13条消息) STM32单片机bootloader扫盲_stm32 bootloader_不咸不要钱的博客-CSDN博客

(4条消息) STM32 内核复位 与 系统复位 区别及程序实现___disable_fault_irq_electrocrazy的博客-CSDN博客

(2条消息) STM32 从APP跳入BootLoader问题_stm32 bootloader 跳转_yhl_sophia的博客-CSDN博客

(2条消息) 【STM32学习笔记】STM32 BOOTLOADER配置以及APP跳转_stm32跳转到指定地址运行_Carry_王的博客-CSDN博客

(2条消息) STM32远程升级(IAP)_stm32远程烧写程序_我滴阿紫的博客-CSDN博客

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 合并STM32bootloaderapp程序需要两个步骤:首先是生成bootloaderapp程序的二进制文件,然后是将它们合并成一个二进制文件。 生成二进制文件有很多种方式,可以通过Keil、IAR等集成开发环境自动生成。也可以使用GCC编译生成Hex格式的文件。在这里,我们以使用Keil为例: 1. 配置bootloaderapp程序的工程文件,包括源代码、头文件和库文件等。 2. 进行编译和连接,生成.hex或.bin格式的文件。对于Keil,这些文件可以在Project\Obj目录下找到。 3. 复制bootloaderapp程序的.hex或.bin文件到一个临时文件夹中。 合并二进制文件的过程大致如下: 1. 打开一个二进制文件编辑器,例如HxD、HEXplorer等。在这里,我们以HEXplorer为例。 2. 打开要合并的bootloader.hex文件,复制其中数据的部分(从“:”到本行结束),然后打开要合并的app程序.hex文件,将该数据添加到文件的末尾。 3. 如果app程序的ENTRY地址与bootloader程序的ENTRY地址不同,则需要修改数据块中的START地址。例如,如果bootloader程序ENTRY地址为0x08000000,而app程序的ENTRY地址为0x08004000,则需要将数据块中的START地址修改为“:200000005C0000000C00000010040000D4”(0x08000000+0x4000=0x08004000)。 4. 保存文件,将其烧录到STM32芯片中即可完成合并。 总之,合并STM32bootloaderapp程序需要先生成二进制文件,然后通过二进制文件编辑器将它们合并成一个文件,并进行修改和调整。最终保存、烧录到芯片中即可。 ### 回答2: 在STM32芯片中,通常有两个不同的程序:Bootloader和应用程序(App)。Bootloader程序位于芯片的Flash中的特定地址,它是专门用于更新应用程序的程序。App程序是实际的应用程序,它在Flash中的不同地址处。 合并BootloaderApp程序可能是为了减少系统的存储器占用率,提高系统性能,增加自由度等许多因素,那么接下来,我将向您介绍如何将这两个程序合并在一起。 首先,需要确定App程序中是否有与Bootloader重叠的代码。如果有,则需要将这些代码移动到没有重叠的位置。其次,需要尝试新的链接脚本,以确保两个程序可以正确地链接在一起。 接着,将两个程序合并为单个Bin文件。确保App程序添加到Bootloader程序的完整程序中。最后,将应用程序的入口点设置为Bootloader程序的入口点,以便引导程序直接运行应用程序。 在合并BootloaderApp程序之前,需要确保所有的代码、文本、数据段、BSS段等在Linker脚本中都被合并。如果两个程序之间存在代码引用或数据引用,那么在进行合并时,可能遇到符号冲突的问题。这些问题需要根据芯片的体系结构进行仔细处理。 最后,可以使用芯片厂商提供的在线更新工具或USB接口来更新新合并的程序。同时,建议保留原始Bootloader程序副本,并留下有足够的空间用于Bootloader升级App程序更新。 在合并Bootloader和应用程序时,需要谨慎操作并正确理解程序内部的所有细节。对于初学者,建议多阅读有关Linker脚本、芯片体系结构和在线更新工具等方面的文档。只要掌握了一定的知识,合并两个程序是相对容易的。 ### 回答3: 合并STM32bootloaderapp程序可以通过以下步骤完成: 第一步:准备工作。需要在开发板上安装bootloader程序和app程序,并确保它们可以正常工作。 第二步:将app程序复制到bootloader程序空间中。要将app程序复制到bootloader程序空间中,需要使用类似于bootloaders的工具,如Jtag和swd调试工具。此时,需要打开读写权限。通过这种方式,可以将app程序的bin文件复制到bootloader程序的空间中。 第三步:在bootloader程序中添加升级代码。为实现升级功能,需要在bootloader程序的代码中添加升级代码。升级代码会扫描设备中的特定区域,找到新的app程序,并将其加载到设备中。在加载新的app程序时,需要保证其正确性。 第四步:设置跳转指令。当app程序加载到设备中时,需要跳转到app程序的入口点。这可以通过添加跳转指令或在app程序入口处添加向bootloader程序的跳转指令来完成。 综上所述,合并STM32bootloaderapp程序需要在开发板上安装bootloader程序和app程序,并确保其可以正常工作。然后,将app程序复制到bootloader程序空间中,并添加升级代码。最后,设置跳转指令以确保设备可以跳转到app程序的入口点。完成以上步骤后,实现STM32bootloaderapp程序的合并。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值