BootLoader中引导跳转代码
void iap_load_app(u32 appxaddr)
{
char i;
if(((*(vu32*)appxaddr)&0x2FF00000)==0x20000000) //检查栈顶地址是否合法.
{
__set_PRIMASK(1);//关闭所有中断
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
rcu_deinit();
for(i=0; i<8; i++) {
NVIC->ICER[i] = 0xFFFFFFFF;
NVIC->ICPR[i] = 0xFFFFFFFF;
}
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
__set_CONTROL(0);
__set_PSP(*(vu32*)appxaddr);
__set_MSP(*(vu32*)appxaddr);
jump2app(); //跳转到APP.
}
__set_PRIMASK(0); //开启所有中断
}
APP中设置3处关键点:
以下APP以向量表偏移0x8000,flash存储空间为0x20000为例。
step-1
step-2
step-3