【问题标题】:Soft bootloader error on stm32f205rgstm32f205rg 上的软引导加载程序错误
【发布时间】:2018-07-01 03:58:54
【问题描述】:

您好,我的加载有问题 mc stm32f205rg 的固件。我用函数 boot_softs 进入引导加载程序,即 位于系统内存中。

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 重新加载。

也许有人遇到过这样的问题,可以帮助我 有了这个问题。提前致谢。

【问题讨论】:

  • 你能澄清你在问什么,你是说你的SysMemBootJump 没有去正确的地方吗?或者那个函数没有被调用?您要分支到的那个地址在 RAM 中,您是否将需要调用的代码放在那里。

标签: c stm32 boot


【解决方案1】:

我认为系统内存不能通过代码访问,您需要更改负责模式选择的外部 PIN。 M0 和 M1。

选择这些引脚后,您可以进入 STM32 的系统模式。这是一个解释如何向引导加载程序发送命令的链接。点击here

【讨论】:

  • 你从哪里得到这些启示?
  • 我的坏彼得,它是 boot0 和 boot1 引脚,使用这些引脚可以移动到系统引导加载程序。大卫很好地解释了这一点。
【解决方案2】:

您必须检查系统引导加载程序地址,因为它因 MCU 而异。 因此,请查看 ST 的此文档:in system bootloader guide from ST

我看到你使用了错误的 RAM 地址。

引导加载程序食谱的一部分:

此外,应该有一个进入系统引导加载程序的触发器。据我了解,您正在使用主应用程序中的软件调用方法。如果 MCU 的 BOOT 引脚不受控制,这种方法是不可靠的,因为如果串行线或更新软件失败,您将失去主应用程序,您将无法更新设备。比你需要程序员。

因此更新、覆盖具有系统引导加载程序调用的软件是不安全的更新方法。我建议仅将其作为自己的使用更新方法。

为了安全起见,您应该控制 BOOT 引脚。 或者实现可以通过按钮触发的迷你自定义引导加载程序(启动主应用程序),在触发该迷你引导加载程序之前,该引导加载程序将保持安静并让系统引导加载程序更新主应用程序。更新不能触及迷你引导加载程序内存,这个自己定制的引导加载程序在更新时应该不受影响。但这是一个建议。

控制更新更简单的方法是控制 BOOT 引脚。

例如: 通过跳线将 3.3V 或 GND(取决于 MCU)放在 BOOT 引脚上,设置电源,然后设备将自动进入系统引导加载程序。

更新后移除跳线,电源重置后设备将进入您的新更新应用程序。 就是这样。

如果您没有 BOOT0,则 BOOT1 引脚由硬件控制。我强烈建议您检查这些引脚控制。 ST 有一个关于 BOOT 引脚的指南:reference manual

参考手册的部分描述:

【讨论】:

  • 非常感谢您提供如此详细的回答。但无论如何,我已经将此代码用于 stm32f207 并且一切正常。 stm32f205 具有相同的地址空间(您可以在 stm32f2xxx 引导加载程序食谱的屏幕截图中看到它)但无论如何我无法以相同的方式更新 stm32f205 上的固件。
  • "但是在 Flash loader 演示程序的帮助下,我发现 mc 没有进入固件重新加载状态" 重新检查总是好的。 :) 我有个问题。具体问题就好了。:) 您的固件更新失败,或者重新刷机后更新的固件没有启动?
  • Flash loader 演示程序写“目标没有响应”,这意味着 mc 没有进入引导状态,我无法刷新固​​件。我以为我写了错误的地址,但 stm32f207 工作正常。我认为这可能是硬件错误,但我不确定,因为通常这是我的错误:)
  • 硬件应该有引导引脚控制。如果这些未连接到 GND 或没有控制权,则引导引脚处于浮动状态。如果引导引脚为浮动 MCU 启动模式为 >>>。内部系统引导加载程序也有超时。所以你应该在MCU进入系统引导加载程序后与闪存加载程序>>进行连接。它就像1-2秒。所以这里需要快速的手。希望你会发现问题。 :)
  • @David.O 我在自己的设计中使用。一点密码学,检查闪存中的图像是否正确等。不是火箭科学
猜你喜欢
  • 2014-07-16
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 2016-06-21
  • 2023-02-21
相关资源
最近更新 更多