我正在使用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();
答案 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);