在STM32双Bank切换中,避免擦写中断导致固件跳转失败的核心是确保跳转代码在RAM中执行,并禁用Flash擦写期间的中断。具体实操:1) 将跳转函数(如`goto_bank`)放入RAM,使用`__attribute__((section(".ramfunc")))`或复制到SRAM,避免从Flash取指时因擦写暂停;2) 在擦写Bank前,调用`__disable_irq()`关闭全局中断,并确保NVIC中所有外设中断被挂起,擦写完成后恢复;3) 使用双Bank的硬件机制(如FMC的Bank切换寄存器),在切换前设置好向量表偏移(`SCB->VTOR`)指向目标Bank的起始地址,并验证目标Bank的栈指针和复位向量有效性(如检查`0x2FFE0000`范围);4) 擦写期间若必须响应中断,可设计中断服务程序仅置标志位,主循环在RAM中处理,但强烈建议完全禁用。此外,使用`FLASH_CR`的`LOCK`位保护,并在跳转前执行`__DSB()`和`__ISB()`确保指令流水线刷新。实测中,若擦写时间较长(如64KB),可考虑分块擦写并每块后短暂开中断,但需严格测试时序。
mcuku 阿沐 · 2026-08-27