如何让STM32F429NI中的bootloader跳转到外部Nor Flash

How to make the bootloader in STM32F429NI to jump to external Nor Flash

我正在研究 STM32F429NI 评估板,我有一个使 LED 闪烁的代码。我希望闪烁的 LED 代码出现在外部闪存中,并且驻留在内部闪存中的引导加载程序必须将控制权转移到 STM32F429NI 的外部闪存中。

STM32F429NI评估板参考手册:https://www.st.com/en/microcontrollers-microprocessors/stm32f429ni.html#documentation

我遵循的步骤是:

void jump_to_external_flash(uint32_t address)
{
  uint32_t msp_value = *(__IO uint32_t*)address;
  void (*reset_handler)(void);

  SysTick->CTRL = 0;
  SysTick->LOAD = 0;
  SysTick->VAL = 0;

  HAL_DeInit();

  __set_MSP(msp_value);
  uint32_t rst_handler_addr = *(__IO uint32_t*)(address + 0x4);
  reset_handler = (void*) rst_handler_addr;

  reset_handler();
}

在 led blink 链接脚本的代码中

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 192K
CCMRAM (xrw)      : ORIGIN = 0x10000000, LENGTH = 64K
FLASH (rx)      : ORIGIN = 0x60000000, LENGTH = 64MB
}

很简单。您需要初始化灵活内存控制器 (FMC) 以将外部闪存映射到 uC 地址 space。然后直接跳转到那里的代码。

FLASH仍会在正常地址。为外部FLASH增加一个新的内存段。

要对其进行编程,您可能需要编写自己的例程。此处示例:https://github.com/magicmicros/AT25Q641_ExternalLoader

PS 不要在引导加载程序中使用 HAL 函数。