STM32 IAP 应用跳转条件不满足

STM32 IAP Application Jump Condition Not Satisfied

我在 0x08000000 处有一个引导代码,在 0x08060000 处有一个应用程序代码。如果我注释掉下面显示的条件检查,我可以从引导代码跳转到应用程序:

//if (( (*(__IO uint32_t*)0x08060000) & 0x2FFE0000 ) == 0x20000000)
{
    JumpAddress = *(__IO uint32_t*)( 0x08060000 + 4 );
    Jump_To_Application = (pFunction)JumpAddress;
    __set_MSP( *(__IO uint32_t*)0x08060000 );
    Jump_To_Application();
}

不满足条件,左边等于0x20020000。我不明白为什么它是 0x20020000 而不是 0x20000000。

为什么要查看0x20000000起始地址的内容。这个内存地址存储了什么,正常情况下应该是什么?

它是一个向量 table,位于这些地址(分别位于 0x08000000 用于引导加载程序和 0x08060000 用于应用程序)。向量中存储的第一个值table是堆栈指针的重置值。

您可以查看此 link 了解更多信息:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/BABIFJFG.html

为什么您要以这种方式检查此值,您可能只能猜测。它很可能作为一种安全检查来查看是否 可能 加载了有效的应用程序。这绝对是不够的,也不能保证太多(例如,可能会加载一半的应用程序)。它还完全取决于您的内存布局以及您决定在 RAM 中放置堆栈的位置。我假设您复制粘贴(或生成)了应用程序中负责内存布局的部分代码,然后从另一个来源复制粘贴了这部分代码,其中包含有问题的检查。这两者可能无法很好地协同工作。