首页 > 解决方案 > STM32F4:引导加载程序在运行时跳转到不同的闪存位置

问题描述

我正在使用带有 2MB 闪存的 STM32F479 定制板(每个存储库中 1MB) 我的引导加载程序位于闪存地址 0x0800000 应用程序版本 35 位于地址 0x08020000(存储在扇区 5 中,该扇区位于闪存 bank1 中) 应用程序版本 36 位于地址 0x08120000(存储在部门 17)

booloader 读取一个非易失性变量(bLastBankUsed:1:当前使用的应用程序。在扇区 5 银行 1 中,2:当前使用的应用程序。在扇区 17 银行 2 中)。

这就是我们处理应用程序更新的方式。下次我们更新应用程序(版本 37)和当前使用的银行 2 时,应用程序 37 将转到银行 1 的扇区 5。基本上,只要我们的应用程序有更新,我们就会在 2 个闪存地址之间进行 ping-pong。

当 booloader 必须跳转到 bank1 的应用程序时,没问题:工作正常。

问题:当booloader必须跳转到bank2的应用程序时,除非我通过将符号ICFEDIT_intvec_start设置为0x08120000并将符号ICFEDIT_region_ROM_start设置为 0x08120000来修改bank2应用程序的icf文件,否则它将失败

应用icf文件如下: 在此处输入图像描述

///////////////////////////////////////// ///////////////////////

我的引导程序

调用bank1的0x08020000和bank2的0x08120000

在此处输入图像描述

所以跳转到bank1(adr 0x08020000)的应用程序总是有效的。在我修改其 icf 2 符号(将符号ICFEDIT_intvec_start设置为 0x08120000 并将符号ICFEDIT_region_ROM_start设置为 0x08120000)之前,跳转到 bank2 的应用程序(Adr 0x08120000)不起作用 。

如何在运行时从软件设置需要修改的 2 个 icf 符号?如何使用在运行时更改的一些链接器设置跳转到应用程序?谢谢

标签: linkerbootloader

解决方案


推荐阅读