问题:
IAP程序跳转到APP程序,APP初始化卡死。
解决:
IAP程序跳转前将外设时钟恢复为禁止状态。
__HAL_RCC_TIM14_CLK_DISABLE();
跳转代码:
typedef __IO uint32_t vu32;
typedef void (*iapfun)(void); //定义一个函数类型的参数.
iapfun jump2app;
#define APPLICATION_START_ADDRESS ((uint32_t)0x08010000)//APP文件的起始地址
void iap_load_app(uint32_t appxaddr)
{
if(((*(__IO uint32_t*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
{
jump2app=(iapfun)*(__IO uint32_t*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
__set_MSP(*(__IO uint32_t*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
}
}
APP程序中设置