你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

在 Flash 内两个固件程序间跳转的地址切换

[复制链接]
patch1582 提问时间:2026-8-12 20:20 / 未解决

在 STM32F106RDT上开发 Bootloader 引导程序,Flash 空间划分如下:

0x08000000 ~ 0x0802DFFF:主固件(固件 1)

0x0802F000 ~ 0x08030FFF:预留分区

0x08031000 ~ 0x0805FFFF:备用临时固件(固件 2)

Bootloader 跳转函数存放于 Flash 中。

上电后程序进入启动文件 startup_stm32f10x_hd.s 的复位中断服务函数,我通过导入符号调用自己的 Bootloader 函数,修改复位处理代码如下:

EXPORT  Reset_Handler             [WEAK]
            IMPORT  __main
            IMPORT  SystemInit
            IMPORT  FLASH_Bootloader       ; 自定义导入引导函数
            LDR     R0, =SystemInit
            BLX     R0            
            LDR     R0, =FLASH_Bootloader  ; 载入Bootloader地址
            BLX     R0                                       ; 执行Bootloader
            ;LDR     R0, =__main
            ;BX      R0
            ENDP

我需要根据条件二选一启动两个固件。该如何获取目标固件main()函数的入口地址? 我直接跳转到第一个固件起始地址偏移 4 字节(0x08000000+4),程序没有任何反应。 有没有规范的方法实现两个应用固件的选择与跳转运行?

收藏 评论2 发布时间:2026-8-12 20:20

举报

2个回答
xmshao 回答时间:2026-8-13 15:59:02

跳转跟系统里有几块固件没多少关系,反正每次只能跳到一个地方。

跳转前把环境整理干净,新的中断矢量表准备好,获取MSP,跳转地址正确即可。

这种IAP示例很多,你尽可以参考。

STM32 IAP应用中的几个常见问题

wlp向日葵 回答时间:2026-8-13 19:50:04

先写个bootloard,里面规定一个固定的地址,代表要跳转A区还是B区,

你升级的时候,自己去先读这个地址的数据,是A就改为B,是B就改为A,要注意先进行OTA 升级包校验,校验过来再设这个地址,再重启

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版