typedef void (*PFN_Reset)(void); //定义函数指针类型
void vIapLoadApp(uint32_t xAppAddr)
{
uint32_t nMSP, xJumpAddr; /*栈顶指针*/
PFN_Reset vResetHandler = NULL; /*复位中断函数指针*/
/*app起始位置4个字节储存的是栈顶指针*/
nMSP = *((__IO uint32_t*)(xAppAddr));
/*取出复位中断函数的地址*/
xJumpAddr = *((__IO uint32_t*)(xAppAddr+4));
/*复位中断函数指针赋值*/
vResetHandler = (PFN_Reset)(xJumpAddr);
/*检测栈顶指针是否合法*/
if((nMSP&0x2FFE0000) == 0x20000000)
{
/*初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)*/
__set_MSP(nMSP);
/*跳转到APP(从APP复位中断向量处取指令执行)*/
vResetHandler();
}
}
|