3.2
程序跳转实现
typedef void (*iapfun)(void);
iapfun jump2app;
__asmvoid MSR_MSP(u32 addr)
{
MSR MSP, r0 //set Main Stack value
BX r14
}
voidCloseIQHard(void)
{
GPIO_DeInit(GPIOA);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,DISABLE); //
关使能PA
端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,DISABLE); //
关辅助时能时钟
__disable_irq(); //
关闭总中断
//
关中断
}
voidBootloaderJump2App(uint32_t appxaddr)
{
BSPClose();
CloseIQHard();
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)//
检查栈顶地址是否合法.
{
jump2app =(iapfun)*(vu32*)(appxaddr+4); //
用户代码区第二个字为程序开始地址(
复位地址)
MSR_MSP(*(vu32*)appxaddr);//
初始化APP
堆栈指针(
用户代码区的第一个字用于存放栈顶地址)
jump2app(); //
跳转到APP.
}
}
在void BootloaderJump2App(uint32_t appxaddr),
其中appxaddr
为需要跳转到的flash
地址。
因为在跳转程序中,将总中断关闭,所以在应用程序中,要将总中断打开。