用于远程固件更新的STM32标准方法

时间:2019-12-23 13:38:21

标签: stm32 boot bootloader stm32ldiscovery

我的问题是有关带有STM32F072RBT6 MCU的STM32F0系列发现套件的Bootloader序列的特殊情况,我们目前已在该领域的某些产品中实现了该套件。

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

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

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

如果解决方案是自定义引导加载程序,则我已经实现了一个虚拟引导加​​载程序,我将其下载到闪存的第0和1节(如果需要,还可以下载更多部分)。该虚拟引导加​​载程序将始终在重置时始终运行。它所要做的只是决定跳至FLASH的2-7部分中的User应用程序代码,或跳转至ST在系统内存(ROM)中的原始引导加载程序。它将通过将主堆栈指针(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)))();
}

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

业界如何做到这一点?我可以使用一个标准的第三方工具/库来提供与我的引导加载程序相同的功能,但是它更加稳定吗?

0 个答案:

没有答案