unsigned char mcu_firm_update_handle(const unsigned char value[],unsigned long position,unsigned short length)
{
//#error "请自行完成MCU固件升级代码,完成后请删除该行"
if(length == 0) {
//固件数据发送完成
PRINT("bin received completed.restart\r\n");
/* 关闭当前所有使用中断,或者方便一点直接全部关闭 */
DisableAllIRQ();
/* 修改DataFlash,切换至ImageIAP */
SwitchImageFlag(IMAGE_IAP_FLAG);
/* 等待打印完成 ,复位*/
mDelaymS(10);
SYS_ResetExecute();
}else {
//固件数据处理,当要写入的数据超过已擦除的区域,则擦除下一块区域
if(FlashWriteAddr + length >FlashEraseAddr){
//擦除flash
FLASH_ROM_ERASE(FlashEraseAddr, FLASH_BLOCK_SIZE);
FlashEraseAddr += FLASH_BLOCK_SIZE;
PRINT("Falsh erase. available addr: %08x\r\n",FlashEraseAddr);
}
//拷贝固件包数据至缓冲区中
// memcpy(binBuffer,value,length);
// binBufferLen = length;
// tmos_set_event(halTaskID,HAL_FLASH_WRITE_EVENT);
//写入数据到flash
uint8_t status = FLASH_ROM_WRITE(FlashWriteAddr,value,length);
if(status){
PRINT("Flash Write error\r\n");
}
PRINT("flash write: %08x,length: %d\r\n",FlashWriteAddr,length);
FlashWriteAddr += length;
}
return SUCCESS;
}
这个是一段通过wifi模组接收固件包并写入flash的代码,执行到FLASH_ROM_WRITE()设备就会重启,有没有办法定位问题呢?FlashWriteAddr的起始地址为0x37000,我采用分区升级(4K,216K,216K,12K)的方式,使用蓝牙完全没有问题