STM32 IAP应用程序跳转条件不满意
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32 IAP应用程序跳转条件不满意相关的知识,希望对你有一定的参考价值。
我的引导代码为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检查起始地址的内容。存储在此内存地址中的内容以及通常应该是什么?
答案
它是一个位于这些地址的向量表(分别用于引导加载程序的0x08000000
和用于应用程序的0x08060000
)。存储在向量表中的第一个值是堆栈指针的复位值。
您可以查看此链接以获取更多信息:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/BABIFJFG.html
为什么你想以这种方式检查这个值,人们可能只会猜测。它可能会作为一种安全检查,以查看是否可能加载了有效的应用程序。这绝对是不够的,并不能保证很多(例如,可能会加载一半的应用程序)。它还完全取决于您的内存布局以及RAM中您决定放置堆栈的位置。我假设您在应用程序中复制粘贴(或生成)负责内存布局的代码的某些部分,然后从另一个源复制粘贴 - 这部分代码中包含有问题的检查。这两者可能不会很好地协同工作。
以上是关于STM32 IAP应用程序跳转条件不满意的主要内容,如果未能解决你的问题,请参考以下文章
STM32L073RZ (rev Z) IAP 跳转到引导加载程序(系统内存)