Memory Stm32f4内存跳跃

Memory Stm32f4内存跳跃,memory,embedded,stm32,Memory,Embedded,Stm32,我正在使用stm32f4发现板,我正在尝试跳转到flash的一个部分,在那里我将开始执行另一个程序。变量ApplicationAddress为0x0800800。当我的代码点击此部分时,PC转到0x0000000,系统冻结。我不确定到底发生了什么事。谢谢你抽出时间。我的跳转代码如下所示 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000); JumpAddress = *(__IO uint32_t*) (ApplicationAdd

我正在使用stm32f4发现板,我正在尝试跳转到flash的一个部分,在那里我将开始执行另一个程序。变量
ApplicationAddress
为0x0800800。当我的代码点击此部分时,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();

假设您在问题中发布的代码位实际上正在使用MSP堆栈,因此当您执行时:

__set_MSP(*(__IO uint32_t*) ApplicationAddress);
如果
Jump\u To\u应用程序
变量是一个局部变量(如果它是一个局部变量,则可能在堆栈上,尤其是在运行非优化/调试构建时),那么该堆栈将被丢弃,并可能突然变成垃圾

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

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

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

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

__set_MSP (*(__IO uint32_t*)ApplicationAddress);
\uuuu set\uPSP(*(\uuu IO uint32\uT*)应用程序地址

并将函数指针声明为静态

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

一堆问题:0x08000的两个单词的内容是什么?你是说只要执行了
跳转到应用程序()
,PC就会以0结束吗?您是否有可以在程序集级别单步执行的调试器设置?您是否有可以将文本转储到其中进行调试写入的串行端口?任何ARM Cortex-M设备都有一个通用的解决方案,详细信息如下:。因此,这是重复的。很抱歉,Clifford,我搜索了一篇类似的帖子,但没有看到这篇。因此,汇编方法用于返回主程序开始地址@0x08000000,而不是另一个程序的地址@0x08000000。你知道为什么会这样吗?伙计们,我遇到的另一件事;编译要跳转到的程序时,请确保将该项目的设置更改为从要跳转到的地址0x开始。Cortex-M可执行文件通常在开始地址有向量表,该表包含一个初始堆栈指针和PC。因此,只需传递向量表的地址,并从前两个32位字加载SP和PC即可。在执行此操作之前,还需要重置SCB:VTOR寄存器以指向起始地址,甚至在此之前禁用中断。