You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32H743ZI2 Flash bank交换后触发0x81006fe地址断点问题咨询

STM32 H743ZI2 Bank交换功能异常问题排查点

核心问题1:地址映射与链接脚本逻辑不匹配

STM32 H7的Bank交换功能开启后,会将物理Bank的地址映射反转:

  • 默认未交换时:物理Bank1映射到0x08000000,物理Bank2映射到0x08100000
  • 开启交换后:物理Bank2映射到0x08000000,物理Bank1映射到0x08100000

你当前的Bank2固件链接地址固定为0x08100000,当交换开启后,物理Bank2被映射到0x08000000地址空间,CPU从0x08000000取到的复位向量指向的是0x081xxxx的链接地址,此时访问的是被映射到0x08100000的物理Bank1,自然会跑飞。
解决方案:两个Bank的固件都统一链接到0x08000000地址,烧录时分别写入物理Bank1(0x08000000)和物理Bank2(0x08100000)的实际物理地址即可,不需要修改链接脚本的Flash起始地址。

核心问题2:选项字节读取逻辑错误

SWAP_BANK是全局选项字节配置,不属于单个Bank的配置项,你代码中读取配置时强制指定OBInit.Banks = FLASH_BANK_1,会导致读取到的SWAP_BANK位值错误,判断逻辑失效,进而出现只能交换一次、触发逻辑不受按键控制的问题。
解决方案:读取USER配置前将OBInit.Banks设置为FLASH_BANK_BOTH,保证读取到全局的SWAP_BANK配置值。

核心问题3:OB加载后代码执行逻辑错误

HAL_FLASH_OB_Launch() 函数执行时会自动触发系统复位,你写在该函数后的SCB_InvalidateICache()、HAL_NVIC_SystemReset()代码完全不会被执行,缓存无效化操作没有生效也会导致程序跑飞。
解决方案:

  • 删除HAL_FLASH_OB_Launch()后的所有代码,不需要手动调用复位
  • 在系统启动的SystemInit()函数最开头添加SCB_InvalidateICache()、SCB_InvalidateDCache()操作,保证每次复位后缓存内容都是干净的

核心问题4:向量表偏移配置错误

需确认两个Bank的固件中,SystemInit()里的SCB->VTOR配置为当前Flash的映射起始地址0x08000000,不要固定为0x08100000,否则中断触发时会跳转到错误地址。

内容的提问来源于stack exchange,提问作者scheinwerfer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:54:05