考虑到微控制器(在我的情况下是STM32L4系列),一旦将新的固件映像写入闪存,应用程序的新起始地址如何被引导到引导加载程序?
答案 0 :(得分:2)
通常,引导加载程序应该知道应用程序已写入的扇区。如果不是这种情况,那么有两种选择:
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();