Stm32f4内存跳跃

时间:2013-05-10 20:27:58

标签: memory embedded stm32

我正在使用stm32f4 Discovery板,我正试图跳转到flash的一部分,我将开始在那里执行另一个程序。变量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();

2 个答案:

答案 0 :(得分: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"
    );
}

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

答案 1 :(得分:1)

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

__set_MSP (*(__IO uint32_t*)ApplicationAddress);

__set_PSP (*(__IO uint32_t*)ApplicationAddress);

并将函数指针声明为static ...

static Function jumpToApplication = (Function) * (__IO uint32_t*)(ApplicationAddress + 4);