我的问题是有关带有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)))();
}
这很好,好像我的固件已损坏,我可以重置即可,如果需要的话,我可以上传新代码。
业界如何做到这一点?我可以使用一个标准的第三方工具/库来提供与我的引导加载程序相同的功能,但是它更加稳定吗?