Memory STM32 IAP应用程序跳转条件不满足

Memory STM32 IAP应用程序跳转条件不满足,memory,stm32,bootloader,remap,Memory,Stm32,Bootloader,Remap,我的启动代码为0x08000000,应用程序代码为0x0806000。如果注释掉如下所示的条件检查,我可以从启动代码跳转到应用程序: //if (( (*(__IO uint32_t*)0x08060000) & 0x2FFE0000 ) == 0x20000000) { JumpAddress = *(__IO uint32_t*)( 0x08060000 + 4 ); Jump_To_Application = (pFunction)JumpAddress;

我的启动代码为0x08000000,应用程序代码为0x0806000。如果注释掉如下所示的条件检查,我可以从启动代码跳转到应用程序:

//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检查起始地址的内容。此内存地址中存储了什么以及通常应该存储什么?

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

有关详细信息,请查看此链接:


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

这段代码是从哪里来的?我怀疑这是针对不同版本的处理器,内存布局略有不同,因此该值的有效范围不同(显然是应用程序的初始堆栈指针)。如果在Google上搜索STM32 IAP,就会看到这种情况。我的处理器是STM32F417。也就是说:该链接是指向只有8K RAM的低端STM32F100部件的代码。因此,堆栈指针的有效范围与您正在使用的部件(显然有192K RAM)相比相当小。我这样检查是因为我在internet上看到许多示例代码检查这种情况。这里有一个例子:@sanchop22,正如我所说,您在这个链接下找到了它,它与应用程序中内存的布局方式是不同的。换句话说,这很可能行不通。您可以安全地调整此检查以适合您的应用程序。再次强调,这不是一个完美的检查:在这种情况下,对整个应用程序的校验和要好得多,它还使您不可能在将来更改应用程序RAM布局(至少堆栈位置),因为它是硬编码到引导加载程序代码中的。好的,我非常理解。我还找到了0x20000的来源。非常感谢。