# STM32 Bootloader IAP流程:APP跳转回Bootloader的最佳实践

引言

在嵌入式系统中,Bootloader是系统启动时首先运行的程序,负责初始化硬件和加载应用程序。在STM32系统中,从应用程序(APP)跳转回Bootloader进行更新或修复是常见的操作。然而,这种跳转并非直接跳转至Bootloader地址执行,而是通过软复位来实现。

问题原因分析

  1. 外设状态未复位:APP运行期间配置的时钟、中断、DMA、定时器等外设状态可能残留,Bootloader直接执行会因外设状态异常而崩溃。
  2. 中断向量表错乱:跳转后VTOR(向量表基址寄存器)仍指向APP的向量表,导致中断无法正确响应。
  3. 栈指针(MSP)未恢复:Bootloader需要重新设置主栈指针,以确保正确执行。

解决方案

  1. 设置跳转标志位:在APP中,跳转前先写入一个标志位到备份寄存器或RAM固定地址,例如使用RTC备份寄存器。
// 使用备份寄存器(RTC域,复位后不丢失)

#define IAP_FLAG_ADDR (RTC_BKP_REG_)

IAP_FLAG_ADDR = 0x01; // 设置标志位

  1. 执行软复位:使用NVIC_SystemReset函数执行软复位。
NVIC_SystemReset();
  1. Bootloader检测标志位:Bootloader在启动时检测标志位,如果设置,则进入IAP模式。

预防建议

通过以上步骤,可以确保从APP跳转回Bootloader的过程安全可靠,避免因直接跳转导致的系统不稳定问题。