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 跳转到引导加载程序(系统内存)

STM32F405RG实现IAP程序在线应用编程

STM32/MM32/GD32 IAP跳转到APP后无法进中断

STM32 学习:IAP 简单的IAP例子

STM32GD32把程序加载到SDRAM的运行方法

STM32代码远程升级之IAP编程