新手上路
- 积分
- 28
- 金钱
- 28
- 注册时间
- 2017-1-10
- 在线时间
- 5 小时
|

楼主 |
发表于 2017-1-10 15:09:46
|
显示全部楼层
iap跳转部分:
void iap_load_app(u32 appxaddr)
{
RCC_DeInit();
NVIC_SetVectorTable (NVIC_VectTab_FLASH, 0x0);
// __ASM("CPSID I");
Delay1(100);
// SCB->VTOR |= 0x0;
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
{
// NVIC_SystemReset();
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
// SET_PSP(*(vu32*)appxaddr); //重新设置进程PSP堆栈地址
// __set_CONTROL(0); //设置为MSP
// SET_MSP(*(vu32*)appxaddr); //重新设置进程MSP堆栈地址
jump2app(); //跳转到APP.
}
}
app跳转部分:
static void PCComm_Jump_IAP(uint8_t *pdata, uint8_t len)
{
int *p;
p = (int *)0x200037D8;
*p = 0x1234;
// NVIC_SetVectorTable (NVIC_VectTab_FLASH, 0x0);
RCC_DeInit();
__ASM("CPSID I");
NVIC_SystemReset();
if(((*(vu32*)FLASH_IAP_ADDR)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
{
jumptoiap=(iapfun)*(vu32*)(FLASH_IAP_ADDR+4); //用户代码区第二个字为程序开始地址(复位地址)
__set_CONTROL(0);
MSR_MSP(*(vu32*)FLASH_IAP_ADDR); //初始化IAP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jumptoiap(); //跳转到IAP.
}
} |
|