求助求助!!!我目前只有两个金币可以用来悬赏,请大神帮忙解决下问题。 事情是这样的这几天在研究IAP问题,整个程序流程如下: 内部Flash分区如下图 整个程序运行比较正常,但是在app中条件触发写标识时,出现死机现象,调试跟踪发现程序卡死在FLASH开始擦除时,后续程序就不运行了,单片机死机,看门狗复位,但是有时候又能够写标识成功令人费解。 贴上写数据的代码: #define IAP_FLAG_UPDATE ((uint32_t)0x55555555) #define IAP_FLAG_JUMP ((uint32_t)0xAAAAAAAA) #define IAP_FLAG_ADDR ((uint32_t)0x8002000) #define FLASH_TIME_OUT ((uint32_t)0x2000) /**********************擦除库函数截取部分*******************/ status = FLASH_WaitForLastOperation(EraseTimeout); if(status == FLASH_COMPLETE) { /* if the previous operation is completed, proceed to erase the page */ FLASH->CR|= CR_PER_Set; FLASH->AR = Page_Address; FLASH->CR|= CR_STRT_Set; // 当程序执行到这步后就出现死机 /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(EraseTimeout); /* Disable the PER Bit */ FLASH->CR &= CR_PER_Reset; // 这一步不会执行 } /********************************************/ uint8_t STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite) { u32 endaddr=0; if(WriteAddr<IAP_FLAG_ADDR||WriteAddr%4) return 1; // 判断输入地址是否正确 endaddr=WriteAddr+(NumToWrite*4); //计算结束地址 FLASH_Unlock(); //解锁Flash FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);// 清除一些挂起标识 FLASH_ErasePage(WriteAddr); // 擦除页 while(WriteAddr<endaddr) //循环写数据 { if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE) // 判断数据写完 { return 1; // 出错 } FLASH_WaitForLastOperation(FLASH_TIME_OUT); // 等待延时 WriteAddr+=4; pBuffer++; } FLASH_Lock(); //锁定 return 0; // } void SysIAPFlagStart(void) { if(g_system_flag.SysIAPflag) { STMFLASH_Read(IAP_FLAG_ADDR,&bootinfo.FG,2); // 读取标识位数据 FLASH_WaitForLastOperation(FLASH_TIME_OUT); if(bootinfo.FG != IAP_FLAG_UPDATE) { bootinfo.FG = IAP_FLAG_UPDATE; // 关闭全局中断 __set_PRIMASK(1); STMFLASH_Write(IAP_FLAG_ADDR,&bootinfo.FG,2); //使能全局中断 __set_PRIMASK(0); } } } |