gpt4 book ai didi

c - STM32F4通过SoftReset跳转至Bootloader且无需BOOT0和BOOT1引脚

转载 作者:行者123 更新时间:2023-12-02 01:42:57 25 4
gpt4 key购买 nike

我问是因为可以在这里找到类似问题的答案:Jump to Bootloader in STM32 through appliction i.e using Boot 0 and Boot 1 Pins in Boot mode from User flash

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

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

最佳答案

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

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

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

在您的程序中使用以下方法将A_VALUE写入备份寄存器:

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

其中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();
}

关于c - STM32F4通过SoftReset跳转至Bootloader且无需BOOT0和BOOT1引脚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27402774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com