1

我的问题是关于带有 STM32F072RBT6 MCU 的 STM32F0 系列探索套件的引导加载程序序列的特殊情况,我们目前已在该领域的一些产品中实施。

我将使用 ST 自己的引导加载程序来更新我的固件,但我想远程执行此操作,这意味着无法按照用户手册中的说明将 BOOT0 和 BOOT1 引脚物理短路以进入“BOOT”模式。

—> 假设我上传的固件不是一个好版本,它有问题或者我想稍后上传我的固件的更新版本。我的问题是,在运行用户应用程序后,我无法返回 ST 的 ROM 引导加载程序来获取新固件。如果我重置电路板,它将再次开始从闪存而不是 ROM 执行指令。

唯一的解决方案是自定义引导加载程序吗?

如果解决方案是自定义引导加载程序,我已经实现了一个虚拟引导加​​载程序,我将其下载到我的闪存的第 0 和 1 部分(如果需要,还有更多)。这个虚拟引导加​​载程序将在复位时始终首先运行。它所做的只是决定跳转到闪存第 2-7 节中的用户应用程序代码或系统内存 (ROM) 中 ST 的原始引导加载程序。它将通过将主堆栈指针 (MSP) 设置为提到的部分的起始地址来实现,请参见下面的代码。

void jumpToBootloader()
{
  resetAll();

  // Remap system memory to 0x00000000
  SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SystemFlash);

  __set_MSP(*((uint32_t*) 0x00000000));
  ((void (*)(void)) *((uint32_t*) 0x00000004))();
}

void jumpToMainApp()
{
  resetAll();

  // Tell processor the address of the new vector table before jumping to the main app
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, MAIN_APP_OFFSET);
  __set_MSP(*((uint32_t*) (0x8000000 + MAIN_APP_OFFSET)));
  ((void (*)(void)) *((uint32_t*) (0x8000004 + MAIN_APP_OFFSET)))();
}

这很好,好像我的固件损坏了,我可以重置,如果需要,我很高兴上传新代码。

这在业界是如何完成的?有一个标准的 3rd 方工具/lib 我可以使用它提供与我的引导加载程序相同的功能,但它更稳定吗?

4

0 回答 0