unsigned char mcu_firm_update_handle(const unsigned char value[],unsigned long position,unsigned short length)
{
? ? //#error "請(qǐng)自行完成MCU固件升級(jí)代碼,完成后請(qǐng)刪除該行"
? ? if(length == 0) {
? ? ? ? //固件數(shù)據(jù)發(fā)送完成
? ? ? ? PRINT("bin received completed.restart\r\n");
? ? ? ? /* 關(guān)閉當(dāng)前所有使用中斷,或者方便一點(diǎn)直接全部關(guān)閉 */
? ? ? ? DisableAllIRQ();
? ? ? ? /* 修改DataFlash,切換至ImageIAP */
? ? ? ? SwitchImageFlag(IMAGE_IAP_FLAG);
? ? ? ? /* 等待打印完成 ,復(fù)位*/
? ? ? ? mDelaymS(10);
? ? ? ? SYS_ResetExecute();
? ? ??
? ? }else {
? ? ? ? //固件數(shù)據(jù)處理,當(dāng)要寫入的數(shù)據(jù)超過(guò)已擦除的區(qū)域,則擦除下一塊區(qū)域
? ? ? ? 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);
? ? ? ? }
? ? ? ? //拷貝固件包數(shù)據(jù)至緩沖區(qū)中
//? ? ? ? memcpy(binBuffer,value,length);
//? ? ? ? binBufferLen = length;
//? ? ? ? tmos_set_event(halTaskID,HAL_FLASH_WRITE_EVENT);
? ? ? ? //寫入數(shù)據(jù)到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;
}
這個(gè)是一段通過(guò)wifi模組接收固件包并寫入flash的代碼,執(zhí)行到FLASH_ROM_WRITE()設(shè)備就會(huì)重啟,有沒(méi)有辦法定位問(wèn)題呢?FlashWriteAddr的起始地址為0x37000,我采用分區(qū)升級(jí)(4K,216K,216K,12K)的方式,使用藍(lán)牙完全沒(méi)有問(wèn)題