STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

2023-12-09

我问这个问题是因为可以在这里找到类似问题的答案:通过应用程序跳转到 STM32 中的引导加载程序,即从用户闪存在引导模式下使用引导 0 和引导 1 引脚

用户“JF002”@JF002回答“当我想跳转到引导加载程序时,我在其中一个备份寄存器中写入一个字节,然后发出软复位。然后,当处理器重新启动时,在引导加载程序的一开始程序,它会读取这个寄存器。这个寄存器包含指示它应该在引导加载程序模式下重新启动的值。然后,跳转到引导加载程序就容易多了”

有人可以向我逐步解释该解决方案或显示代码示例吗? 此时我正在写考试,我真的很依赖于这方面的帮助,因为这只是编程的一小部分,而且我在这方面没有经验。


我认为用户@JF002所说的“备份寄存器”指的是STM32上的SRAM。以下对我有用:

在程序开始时使用以下命令配置备份寄存器:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
PWR_BackupRegulatorCmd(ENABLE);

Write A_VALUE在程序期间使用以下命令到备份寄存器:

(*(__IO uint32_t *) (BKPSRAM_BASE + OFFSET)) = A_VALUE;

where OFFSET是要写入 SRAM 的地址。使用0为第一个地址。

使用发出软重置命令NVIC_SystemReset().

启动时,读取(*(__IO uint32_t *) (BKPSRAM_BASE + OFFSET))并检查A_VALUE:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
PWR_BackupRegulatorCmd(ENABLE);    

void (*SysMemBootJump)(void);
volatile uint32_t addr = 0x1FFF0000; // For STM32F4 Discovery

if((*(__IO uint32_t *) (BKPSRAM_BASE + 0)) == A_VALUE) 
{
  (*(__IO uint32_t *) (BKPSRAM_BASE + 0)) = 0; // Reset memory, if desired.

  SysMemBootJump = (void (*)(void)) (*((uint32_t *)(addr + 4))); // Set Bootloader address

  __set_MSP(*(uint32_t *)addr); // Move Stack Pointer

  SysMemBootJump(); // Execute Bootloader
}
else
{
  RunYourApplication();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚 的相关文章

随机推荐