美好的一天,我有装载的问题 mc stm32f205rg的固件。我用过功能 boot_softs进入bootloader,即 位于系统内存中。
void boot_softs() {
volatile uint32_t addr = 0x1FFF0000;
void (*SysMemBootJump)(void);
SysMemBootJump = (void (*)(void)) (*((uint32_t *)(addr + 4)));
HAL_RCC_DeInit();
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
_disable_irq();
SYSCFG->MEMRMP = 0x01;
__set_MSP(*(__IO uint32_t*)0x20001000);
SysMemBootJump();
}
但是在Flash loader的帮助下进行检查 演示程序我发现mc不 进入固件重装状态。
我在stm32f207上重新检查了相同的功能 更改和stm32f103c8与程序的地址 开始改变。在这两种情况下一切正常 正确和mc reloades。
也许有人遇到这样的问题,可以帮助我 有这个问题。提前谢谢。
答案 0 :(得分:0)
我不认为可以通过代码访问系统内存,您需要更改负责模式选择的外部PIN。 M0和M1。
选择这些引脚后,您可以进入STM32的系统模式。这是一个链接,解释了如何将命令发送到bootloader。点击here!
答案 1 :(得分:0)
您必须检入系统引导加载程序地址,因为它会因MCU而异。 请查看ST的文档:in system bootloader guide from ST
我发现你使用的是错误的RAM地址。
此外,应该有一个触发器进入系统引导加载程序。据我所知,您正在使用主应用程序中的软件调用方法。如果MCU的BOOT引脚不受控制,则此方法不可靠,因为如果串行线路或更新软件发生故障,您将丢失主应用程序,您将无法更新设备。比你需要程序员。
因此更新,覆盖具有系统引导程序调用的软件是不安全的更新方法。我建议它只作为一种自己的使用更新方法。
为了安全起见,您应该控制BOOT引脚。 或者实现迷你自定义引导程序,可以通过按钮触发(启动主应用程序),然后触发迷你引导加载程序保持安静并让系统引导程序更新主应用程序。更新无法触摸迷你引导加载程序内存,这个自定义的引导加载程序应该在更新时不受影响。但这是一个建议。
控制更新的Easer方法是控制BOOT引脚。
例如: 将BOV引脚上的3.3V或GND(取决于MCU)置于跳线,设置电源,然后设备自动进入系统引导加载程序。
更新后删除跳线,电源复位后设备将进入新的更新应用程序。 这就是全部。
如果没有BOOT0,则BOOT1引脚由硬件控制。我强烈建议你检查那些引脚控制。 ST有关BOOT引脚的指南:reference manual