- 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();
- }
- }
|