1.遇到的问题,IAP启动app程序后,app程序出现卡死情况,app运行到一会后重新跳转到IAP程序在运行APP程序卡死,解决方式如下:
一、IAP程序中的主要代码
iap_load_app(FLASH_APP_ADDR);
/*跳转到应用程序段*/
/*appxaddr:用户代码起始地址*/
void iap_load_app (uint32_t appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FF00000)==0x24000000)//检查栈顶地址是否合法
{
__disable_irg();//失能全局中断
/*复位了 AHB1,2,3,4 的时钟以及 APB1L,APB1H,APB2,3,4 的时钟。
函数 HAL_DeInit 里面调用的 HAL_MspDeInit 一般在文件stm32f4xx_hal_msp.c 里面做具体实现,
主要用于底层初始化,跟函数HAL_Init 里面调用的 HAL_MspInit 是一对。当前此函数也在文件stm32f4xx_hal.c里面,只是做了弱定义。
*/
HAL_DeInit();
HAL_RCC_DeInit();//复位RCC时钟到默认状态。
jump2app=(iapfun) *(vu32*)(appxaddr+4) ;//用户代码区第二个字为程序开始地址 (复位地址)
MSR_MSP(*(vu32*) appxaddr) ;//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app () ;//跳转到APP.
HAL_NVIC_SystemReset();//软件复位
}
}
二、APP程序主要代码
int main(void)
{
SCB->VTOR = FLASH_BASE|0x20000;
__enable_irq() ;
......
}