2

我正在使用 stm32f4 探索板,我试图跳转到闪存的一部分,在那里我将开始执行另一个程序。变量ApplicationAddress是 0x08008000。当我的代码到达此部分时,PC 会转到 0x0000000 并且系统会死机。我不确定到底发生了什么。感谢您的时间。我的跳转代码如下所示。

    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);  
    JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
    Jump_To_Application = (pFunction) JumpAddress;
    /* Initialize user application's Stack Pointer */
    __set_MSP(*(__IO uint32_t*) ApplicationAddress);
    Jump_To_Application();
4

2 回答 2

4

大概您在他的问题中发布的那段代码实际上是在使用 MSP 堆栈,所以当您执行时:

__set_MSP(*(__IO uint32_t*) ApplicationAddress);

该堆栈被丢弃,如果Jump_To_Application变量是局部变量(如果它是局部变量,它可能已经在堆栈上 - 特别是如果您正在运行非优化/调试构建)可能会突然变成垃圾。

为了解决这个问题,我使用了:

void LoadStackAndGo( void* sp, void* entry)
{
    __asm (
        "mov sp, r0 \n"
        "mov pc, r1 \n"
    );
}

这应该很容易适应您正在使用的任何工具链。

于 2013-05-10T22:37:31.477 回答
1

我有完全相同的问题,但是我的解决方案:

__set_MSP (*(__IO uint32_t*)ApplicationAddress);

__set_PSP (*(__IO uint32_t*)ApplicationAddress);

并将函数指针声明为静态...

static Function jumpToApplication = (Function) * (__IO uint32_t*)(ApplicationAddress + 4);
于 2016-10-21T11:22:50.633 回答