Stm32 向引导加载程序通知新固件启动地址

Stm32 向引导加载程序通知新固件启动地址,stm32,boot,bootloader,Stm32,Boot,Bootloader,考虑到一个微控制器(在我的例子中是STM32L4系列),一旦新的固件映像写入闪存,如何将应用程序的新启动地址告知引导加载程序 通常引导加载程序应该知道应用程序写入的扇区。如果不是这样,则有两种选择: 1.将固件映像写入特定扇区时-在已知扇区中闪存记录固件扇区,即在已知扇区中写入struct bootloaderInfo,记录固件的扇区地址以及对引导加载程序有用的任何其他信息,例如固件映像的CRC,固件版本等。引导加载程序可以读取此结构(它始终位于已知扇区中),并从中知道固件将在哪个扇区中运行。

考虑到一个微控制器(在我的例子中是STM32L4系列),一旦新的固件映像写入闪存,如何将应用程序的新启动地址告知引导加载程序

通常引导加载程序应该知道应用程序写入的扇区。如果不是这样,则有两种选择:
1.将固件映像写入特定扇区时-在已知扇区中闪存记录固件扇区,即在已知扇区中写入struct bootloaderInfo,记录固件的扇区地址以及对引导加载程序有用的任何其他信息,例如固件映像的CRC,固件版本等。引导加载程序可以读取此结构(它始终位于已知扇区中),并从中知道固件将在哪个扇区中运行。
2.引导加载程序可以扫描闪存扇区以查找固件映像。这不是真正的建议,但会起作用。具有有效固件映像的扇区将具有。一个有效的堆栈指针和b。有效的重置向量。可以使用以下宏对它们进行测试:

#define STACK_POINTER_RANGE  0x2FFE0000  
#define IS_VALID_STACK_POINTER(address) (((*(volatile uint32_t*)address) & STACK_POINTER_RANGE) == SRAM_BASE)

#define IS_VALID_RESET_VECTOR(sectorAddress) \
    (((*(uint32_t*)(sectorAddress+4)) & 0x8FF0000 ) == sectorAddress)
在已知应用程序地址后,引导加载程序可以以正常方式跳转到该地址:

uint32_t JumpAddress = *(__IO uint32_t*)(sector + 4);
pFunction JumpToApplication = (pFunction)JumpAddress;
// Initialize user application's Stack Pointer:
__set_MSP(*(__IO uint32_t*)sector);
JumpToApplication();

请看任何提供的引导加载程序示例。你可以帮助分享任何有此类示例的站点吗。我对同一个地址的搜索没有结果。也许值得在你的问题中澄清一下,为什么你不为应用程序使用一个固定地址(扇区),而这个地址可以硬连接到引导加载程序。引导加载程序是如何知道新的固件地址的……是通过我们在写入flash之前进行的一些函数调用来实现的?。。。在第一种方法中,您提到要保留一个保存值的结构,但应用程序如何将此结构传递给引导加载程序?最简单的方法是始终将应用程序写入同一扇区,然后引导加载程序始终知道它是什么(引导加载程序中的硬代码地址)。如果您不能这样做(例如,因为您可以将新图像上载到新扇区,作为fw升级的一部分,而将旧fw保留在旧扇区中)然后,将新应用程序写入其扇区的进程还必须将BootloadInfo结构写入已知/固定扇区-正是该结构将告诉引导加载程序在何处找到新应用程序。即引导加载程序首先从已知扇区读取该结构,然后从该扇区获取应用程序地址(加上应用程序CRC等)然后使用地址跳转到应用程序。