/******************************************************************************** Copyright (C), Sinowealth Electronic. Ltd. Author: Sino Version: V0.0 Date: 2020/04/26 History: V2.0 2020/04/26 Preliminary ********************************************************************************/ #include "MCURegister.h" #include "C51_TYPE.H" #include "Flash.h" #include #include U8 ucMcuFlashWrValid; /************************************************************************************************* * 函数名: McuFlashEraseSector * 参 数: McuFlashAddr:起始地址;McuType:擦除CODE区或者EEPROM * 返回值: 无 * 描 述: 擦除Sector *************************************************************************************************/ void McuFlashEraseSector(U32 xdata McuFlashAddr, U8 xdata McuType) { FLASHCON = McuType; XPAGE = McuFlashAddr>>8; IB_CON1 = 0xE6; if(!EA) //防止误写 { IB_CON2 = 0x05; if(FLASHCON == McuType) //防止误写 { IB_CON3 = 0x0A; if(ucMcuFlashWrValid == 0x55) //防止误写 { IB_CON4 = 0x09; if(XPAGE == (McuFlashAddr>>8)) //防止误写 { IB_CON5 = 0x06; _nop_(); _nop_(); _nop_(); _nop_(); } } } } FLASHCON = MCU_TYPE_CODE; } /************************************************************************************************* * 函数名: McuFlashBlankCheck * 参 数: McuFlashAddr:起始地址 * 返回值: 0:非全0,Erase失败;1:全0,Erase成功 * 描 述: 当Erase完1个Sector,需检查是否全为0 *************************************************************************************************/ BOOL McuFlashBlankCheck(U32 xdata McuFlashAddr, U8 xdata McuType) { BOOL Result = 1; U16 i; FLASHCON = McuType; for(i=0; i>8; IB_OFFSET = McuFlashAddr % 256; IB_DATA = WrData; IB_CON1 = 0x6E; if(!EA) //防止误写 { IB_CON2 = 0x05; if(FLASHCON == McuType) //防止误写 { IB_CON3 = 0x0A; if(ucMcuFlashWrValid == 0x55) //防止误写 { IB_CON4 = 0x09; if(XPAGE == (McuFlashAddr>>8)) //防止误写 { IB_CON5 = 0x06; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } } } } FLASHCON = MCU_TYPE_CODE; } /************************************************************************************************* * 函数名: McuFlashRdOneByte * 参 数: McuFlashAddr:读取CODE区的地址 * 返回值: 返回当前Code字节 * 描 述: 读1个字节 *************************************************************************************************/ U8 McuFlashRdOneByte(U32 xdata McuFlashAddr, U8 xdata McuType) { U8 GetData = 0; FLASHCON = McuType; GetData = CBYTE[McuFlashAddr]; FLASHCON = MCU_TYPE_CODE; return GetData; } /************************************************************************************************* * 函数名: BootProgram * 参 数: 无 * 返回值: 无 * 描 述: Boot区进行升级代码操作:Erase->Program->Verify 每擦除1个Sector,即刻写入数据,校验数据 *************************************************************************************************/ U8 BootProgram(void) { U8 i, McuCode, McuFlashType; U16 j; U32 McuFlashAddr; for(i=0; iProgram->Verify *************************************************************************************************/ BOOL BootUpgradeCode(void) { BOOL Result = 1; if(BootProgram() == BOOT_PGR_OK) { McuFlashEraseSector(BOOT_FLG_START_ADDR, MCU_TYPE_CODE); //写入成功,擦除远程升级标志位 Result = McuFlashBlankCheck(BOOT_FLG_START_ADDR, MCU_TYPE_CODE); //擦除结束后,需要查空 } else { Result = 0; } return Result; }