STM32H743ZI2 Flash bank交换后触发0x81006fe地址断点问题咨询
核心问题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

