///** // * @copyright (C) COPYRIGHT 2022 Fortiortech Shenzhen // * @file FU68xx_5_Flash.c // * @author leo.li // * @since 2022-10-01 22:24:50 // * @date 2022-10-09 17:46:47 // * @version // * // * // *
Date Version Author Description
// * @brief // */ ///******************************************************************************/// Including Header Files //#include //MCUFlash xdata FlashTest; //flash测试 ///******************************************************************************/// Define Macro //#define SEC_LEN_LOG (8) //#define PAGE_LEN_LOG (3 + SEC_LEN_LOG) //#define FLASH_LEN (32768) //#define __SEC_LAST ((FLASH_LEN >> SEC_LEN_LOG) - 1) //#define __PAGE_LAST ((FLASH_LEN >> PAGE_LEN_LOG) - 1) ///******************************************************************************/// Define Global Symbols ///******************************************************************************/// Function Subject ///** // * @brief Flash操作函数 // * // * @param[in] eCmd 操作命令 // * @param[in] wAddr 编程地址 // * @param[in] ucDat 编程内容 // * // * @return Flash操作结果, @see ETypeFlashStatu // */ //ETypeFlashStatu Flash_Ctrl(ETypeFlashCmd eCmd, unsigned short wAddr, unsigned char ucDat) //{ // unsigned char data ucCmd = (unsigned char)eCmd; // unsigned short data wAddrTmp = wAddr; // unsigned char data ucDatTmp = ucDat; // unsigned char data ucKey1 = 0x5a; // unsigned char data ucKey2 = 0x1f; // bool bEA; // unsigned char data ucCfg; // ETypeFlashStatu data eStatu = FLASH_UNKNOW; // // if ((ucCmd & FLAEN) == 0) // { // return FLASH_ERR_CMD; // } // else if ((ucCmd & (FLAERS | FLAPRE)) == (FLAERS | FLAPRE)) // { // return FLASH_ERR_CMD; // } // else if ((ucCmd & (FLAERS | FLAPRE | PAGE_EN)) == PAGE_EN) // { // return FLASH_ERR_CMD; // } // // if ((ucCmd & PAGE_EN) != 0 && (wAddr >> PAGE_LEN_LOG) >= __PAGE_LAST) // { // return FLASH_ERR_ADDR; // } // else if ((ucCmd & PAGE_EN) == 0 && (wAddr >> SEC_LEN_LOG) >= __SEC_LAST) // { // return FLASH_ERR_ADDR; // } // // if (FLA_KEY == 0x06) // { // return FLASH_FORZEN; // } // // bEA = EA; // EA = 0; // ucCfg = CCFG1 & (WDT_EN | 0x08); // CCFG1 &= ~(WDT_EN | 0x08); // FLA_CR = ucCmd; // FLA_KEY = ucKey1; // FLA_KEY = ucKey2; // // if (FLA_KEY != 0x03) // { // eStatu = FLASH_ERR_UNLOCK; // goto exit; // } // // *(unsigned char xdata *)wAddrTmp = ucDatTmp; // FLA_CR = 0x08; // // if ((FLA_CR & FLAERR) != 0) // { // eStatu = FLASH_ERROR; // goto exit; // } // // eStatu = FLASH_SUCCESS; //exit: // EA = bEA; // CCFG1 |= ucCfg; // return eStatu; //} ///** // * @brief Flash页擦除函数 // * // * @param[in] wAddr 编程地址 // * // * @return Flash操作结果, @see ETypeFlashStatu // */ //ETypeFlashStatu Flash_PageErase(unsigned short wAddr) //{ // ETypeFlashStatu eStatu; // eStatu = Flash_Ctrl(FLASH_PAGE_PP, wAddr, 0xff); // // if (eStatu != FLASH_SUCCESS) // { // goto exit; // } // // eStatu = Flash_Ctrl(FLASH_PAGE_ERS, wAddr, 0xff); //exit: // return eStatu; //} ///** // * @brief Flash扇区擦除函数 // * // * @param[in] wAddr 编程地址 // * // * @return Flash操作结果, @see ETypeFlashStatu // */ //ETypeFlashStatu Flash_SectorErase(unsigned short wAddr) //{ // ETypeFlashStatu eStatu; // eStatu = Flash_Ctrl(FLASH_SEC_PP, wAddr, 0xff); // // if (eStatu != FLASH_SUCCESS) // { // goto exit; // } // // eStatu = Flash_Ctrl(FLASH_SEC_ERS, wAddr, 0xff); //exit: // return eStatu; //} ///** // * @brief 写入1个字节到FLASH, // * @Input unsigned short FlashAddress:目标FLASH地址 // * @Input uint8 FlashData:被写入数据 // */ //void Flash_byte_Write(unsigned short FlashAddress, unsigned char FlashData) //{ // unsigned char Write_status = 0; // Write_status = (uint8)Flash_Ctrl(FLASH_PROGARM, FlashAddress, FlashData); // if(Write_status) // { // ; // } //} ///** // * @brief Flash 校验CRC // * @brief CRC_BEG: 扇区起始 // * @brief CRC_CNT: 校验扇区数 // */ //void Flash_CRC_APP(void) //{ // uint8 CRCL = 0; // uint8 CRCH = 0; // ClrBit(CRC_CR, AUTOINT); /* 停止计算 */ // SetBit(CRC_CR, CRCVAL); /* 将 CRC 结果初始化为 0xFFFF */ // SetBit(CRC_CR, CRCDINI); /* 初始化有效 */ // CRC_BEG = 0; // CRC_CNT = 127; // SetBit(CRC_CR, AUTOINT); /* 开始计算 */ // // while (ReadBit(CRC_CR, CRCDONE) == 0) // { // ; // } // // SetBit(CRC_CR, CRCPNT); /* 取crc高位 */ // CRCH = CRC_DR; // FlashTest.FlashCRC = CRCH; // FlashTest.FlashCRC = FlashTest.FlashCRC << 8; // ClrBit(CRC_CR, CRCPNT); /* 取crc低位 */ // CRCL = CRC_DR; // FlashTest.FlashCRC = FlashTest.FlashCRC + CRCL; //} ///** //* @brief 获取写入地址,必须保证写入的地址中数值全部为0 //* @brief unsigned short FlashAddress:目标FLASH首地址 //* @brief uint8 Write_Length:写入数值长度 //*/ //uint16 GetWrite_Black_Addr(unsigned short FlashAddress, uint8 Write_Length) //{ // uint16 TempFlashAddress = 0; // uint16 TempFirstAddress = 0; //用来保存保存首地址 // uint8 tempFlashData = 0xFF; // uint8 Length = 0; // TempFlashAddress = FlashAddress; // TempFirstAddress = FlashAddress; // // while ((Length != Write_Length) && (TempFlashAddress < (TempFirstAddress + Write_Length))) //限定读取地址为当前页 // { // tempFlashData = *(uint8 code *)(TempFlashAddress); //读取目标地址中数值是否为0 // // if (tempFlashData == 0) // { // Length ++; // TempFlashAddress += 1; // } // else // { // TempFirstAddress += Write_Length; //首地址跳转Write_Length字节 // TempFlashAddress = TempFirstAddress; // Length = 0; // } // } // // return TempFirstAddress; //} ///** // * @brief 写入Length字节到FLASH, // * @Input unsigned short FlashAddress:写入目标FLASH首地址 // * @Input uint8 *str:被写入数据 // * @ruturn 1:扇区未满,写入完成 0:扇区已满,写入失败 // * @note // */ //uint8 Write_LengthByte(unsigned short FlashAddress, uint8 Length, uint8 * str) //{ // uint8 tempFlashData = 0; // uint8 i = 0; // uint16 tempNewFlashAddress = FlashAddress; // // for (i = 0; i < Length; i++) // { // Flash_byte_Write((tempNewFlashAddress + i), str[i]); // tempFlashData = *(uint8 code *)(tempNewFlashAddress + i); // // if (tempFlashData != str[i]) // { // return 0; // } // } // // return 1; //} ///** // * @brief 读取两个字节数据, // * @Input unsigned short BlockStartAddr:目标FLASH首地址 // * @Input uint8 Length:数值长度 // * @Input uint8 * str :读回数值写入数组 // * @ruturn Flash数据 // */ //void ReadFromFlash(unsigned short BlockStartAddr, uint8 Length, uint8 * str) //{ // uint8 i = 0; // // for (i = 0; i < Length; i++) // { // str[i] = *(uint8 code *)(BlockStartAddr + i); // } //} ///** //* @brief 获取掉电之前的错误数据,数值初始化 //* @brief //* @brief //*/ //void Flash_DataInit(void) //{ // uint16 ReadInfor_Addr = 0; //读取信息地址 // uint8 Check_code = 0; // uint8 i = 0; // memset(&FlashTest, 0, sizeof(MCUFlash)); // 变量清零 // /*确认写入对应长度地址内数值全为0 */ // FlashTest.FlashWriteAddr = GetWrite_Black_Addr(USERCODEADDRESS, Flash_DATA_Length); // // /* 获取上次的保存数值 // FlashTest.FlashWriteAddr:写入数值首地址 ,Flash_DATA_Length:读取字节数,读取值放入FlashTest.Flash_Read_Data数组中 */ // if (FlashTest.FlashWriteAddr > USERCODEADDRESS) // { // /*读取数值首地址*/ // FlashTest.FlashReadAddr = FlashTest.FlashWriteAddr - Flash_DATA_Length; // // /*获取最新一次正确写入的数值*/ // while ((FlashTest.FlashReadAddr > USERCODEADDRESS) && (Check_code != 0x55)) // { // /*读取数值校验位,确认当前数值在写入时为正确写入*/ // ReadInfor_Addr = FlashTest.FlashReadAddr + Verify_Bit; // Check_code = *(uint8 code *)(ReadInfor_Addr + i); // // if (Check_code == 0x55) // { // ReadFromFlash(FlashTest.FlashReadAddr, Flash_DATA_Length, FlashTest.Flash_Read_Data); // } // else // { // FlashTest.FlashReadAddr = FlashTest.FlashWriteAddr - Flash_DATA_Length; // } // } // } // else // { // FlashTest.FlashReadAddr = FlashTest.FlashWriteAddr; // } // // /*错误信息从Flash读取到APP*/ // ReadInfor_Addr = FlashTest.FlashReadAddr + ((uint8)FaultHardOVCurrent - 1) * 2; // FlashTest.FaultHardOVCurrentCount = *(uint16 code *)(ReadInfor_Addr); // ReadInfor_Addr = FlashTest.FlashReadAddr + ((uint8)FaultSoftOVCurrent - 1) * 2; // FlashTest.FaultSoftOVCurrentCount = *(uint16 code *)(ReadInfor_Addr); // ReadInfor_Addr = FlashTest.FlashReadAddr + ((uint8)FaultOverVoltageDC - 1) * 2; // FlashTest.FaultUnderVoltageCount = *(uint16 code *)(ReadInfor_Addr); // ReadInfor_Addr = FlashTest.FlashReadAddr + ((uint8)FaultUnderVoltageDC - 1) * 2; // FlashTest.FaultOverVoltageCount = *(uint16 code *)(ReadInfor_Addr); // ReadInfor_Addr = FlashTest.FlashReadAddr + ((uint8)FaultPhaseLost - 1) * 2; // FlashTest.FaultLossPhaseCount = *(uint16 code *)(ReadInfor_Addr); // ReadInfor_Addr = FlashTest.FlashReadAddr + ((uint8)FaultStall - 1) * 2; // FlashTest.FaultStartCount = *(uint16 code *)(ReadInfor_Addr); // ReadInfor_Addr = FlashTest.FlashReadAddr + ((uint8)FaultNtcOTErr - 1) * 2; // FlashTest.FaultStartCount = *(uint16 code *)(ReadInfor_Addr); // ReadInfor_Addr = FlashTest.FlashReadAddr + ((uint8)FaultTSD - 1) * 2; // FlashTest.FaultTSDCount = *(uint16 code *)(ReadInfor_Addr); // // /*Flash如果准备写满,擦写标志位置1.准备芯片温度在低于105°进行擦写*/ // if (FlashTest.FlashWriteAddr >= USERCODEADDRESS + 0x0FB0) //擦写为2页(一共4K的数值)到最后一个写入64字节尝试擦写 // { // for (i = 0; i < Flash_DATA_Length; i++) // { // FlashTest.Flash_Write_Data[i] = FlashTest.Flash_Read_Data[i]; // } // // FlashTest.Flag_FlashErase = 1; // } //} ///** //* @brief Flash的擦写 //* @brief FlashTest.Flag_FlashErase确认是否进行 //* @brief //*/ //void Flash_Erase(void) //{ // uint8 FlashWriteStatus = 0; // // if (((FlashTest.Flag_FlashErase == 1) && (TSDTemperature.ActualTemper < 105) && (mcFocCtrl.mcDcbusFlt > UNDER_VOLTAGE_PROTECT)) // || ((FlashTest.Flag_FlashErase == 2) && (mcFocCtrl.mcDcbusFlt > UNDER_VOLTAGE_PROTECT))) // { // FlashTest.Flag_FlashErase = 0; // FlashTest.ReturnEraseStatus = (uint8)Flash_PageErase(USERCODEADDRESS); // 目标页写满,清除目标页 // FlashTest.FlashWriteAddr = USERCODEADDRESS; // 重新给写入首地址 // // while (!FlashWriteStatus) // 初始写入或者写入异常、换到下个地址写入 // { // /* FlashTest.FlashWriteAddr:指定地址 FlashTest.Flash_Write_Data:需要写入的数值 // FlashWriteStatus:返回数值 1:写入正确 0:写入错误 */ // FlashWriteStatus = Write_LengthByte(FlashTest.FlashWriteAddr, Flash_DATA_Length, FlashTest.Flash_Write_Data); // // /* 写入正确时最后一位写入校验位 */ // if (FlashWriteStatus == 0) //当前数值写入错误 // { // Flash_byte_Write((FlashTest.FlashWriteAddr + Verify_Bit), Verify_Error); // } // else if (FlashWriteStatus) //当前数值写入正确 // { // Flash_byte_Write((FlashTest.FlashWriteAddr + Verify_Bit), Verify_Ture); // } // // //更新读写首地址 // FlashTest.FlashReadAddr = FlashTest.FlashWriteAddr; // FlashTest.FlashWriteAddr = FlashTest.FlashWriteAddr + Flash_DATA_Length; // // if (FlashTest.FlashWriteAddr >= USERCODEADDRESS + 0x0800) // { // FlashWriteStatus = 1; //全部页损坏,强行跳转 // } // } // // FlashTest.ReturnEraseStatus = (uint8)Flash_PageErase(USERCODEADDRESS + 0x0800); //目标页写满,清除目标页 // } //} ///** //* @brief 保存错误 //* @brief //* @brief //*/ //void SaveFault_Flash(void) //{ // uint16 Array_Loca = 0; // uint8 FlashWriteStatus = 0; // // if (FlashTest.Flash_FaultSource_Updat) // { // FlashTest.Flash_FaultSource_Updat = 0; // // switch (mcFaultSource) // { // case FaultHardOVCurrent: // FlashTest.FaultHardOVCurrentCount++; // Array_Loca = ((uint8)FaultHardOVCurrent - 1) * 2; // FlashTest.Flash_Write_Data[Array_Loca] = FlashTest.FaultHardOVCurrentCount >> 8; // FlashTest.Flash_Write_Data[Array_Loca + 1] = FlashTest.FaultHardOVCurrentCount; // break; // // case FaultSoftOVCurrent: // FlashTest.FaultSoftOVCurrentCount++; // Array_Loca = ((uint8)FaultSoftOVCurrent - 1) * 2; // FlashTest.Flash_Write_Data[Array_Loca] = FlashTest.FaultSoftOVCurrentCount >> 8; // FlashTest.Flash_Write_Data[Array_Loca + 1] = FlashTest.FaultSoftOVCurrentCount; // break; // // case FaultOverVoltageDC: // FlashTest.FaultUnderVoltageCount++; // Array_Loca = ((uint8)FaultOverVoltageDC - 1) * 2; // FlashTest.Flash_Write_Data[Array_Loca] = FlashTest.FaultUnderVoltageCount >> 8; // FlashTest.Flash_Write_Data[Array_Loca + 1] = FlashTest.FaultUnderVoltageCount; // break; // // case FaultUnderVoltageDC: // FlashTest.FaultOverVoltageCount++; // Array_Loca = ((uint8)FaultUnderVoltageDC - 1) * 2; // FlashTest.Flash_Write_Data[Array_Loca] = FlashTest.FaultOverVoltageCount >> 8; // FlashTest.Flash_Write_Data[Array_Loca + 1] = FlashTest.FaultOverVoltageCount; // break; // // case FaultPhaseLost: // FlashTest.FaultLossPhaseCount++; // Array_Loca = ((uint8)FaultPhaseLost - 1) * 2; // FlashTest.Flash_Write_Data[Array_Loca] = FlashTest.FaultLossPhaseCount >> 8; // FlashTest.Flash_Write_Data[Array_Loca + 1] = FlashTest.FaultLossPhaseCount; // break; // // case FaultStall: // FlashTest.FaultStallCount++; // Array_Loca = ((uint8)FaultStall - 1) * 2; // FlashTest.Flash_Write_Data[Array_Loca] = FlashTest.FaultStallCount >> 8; // FlashTest.Flash_Write_Data[Array_Loca + 1] = FlashTest.FaultStallCount; // break; // // case FaultNtcOTErr: // FlashTest.FaultStartCount++; // Array_Loca = ((uint8)FaultNtcOTErr - 1) * 2; // FlashTest.Flash_Write_Data[Array_Loca] = FlashTest.FaultStartCount >> 8; // FlashTest.Flash_Write_Data[Array_Loca + 1] = FlashTest.FaultStartCount; // break; // // case FaultTSD: // FlashTest.FaultTSDCount++; // Array_Loca = ((uint8)FaultTSD - 1) * 2; // FlashTest.Flash_Write_Data[Array_Loca] = FlashTest.FaultTSDCount >> 8; // FlashTest.Flash_Write_Data[Array_Loca + 1] = FlashTest.FaultTSDCount; // break; // // default: // break; // } // // FlashTest.ReturnEraseStatus = 0; // // while (!FlashWriteStatus) //写入异常,换到下个地址写入 // { // /* FlashTest.FlashWriteAddr:指定地址 FlashTest.Flash_Write_Data:需要写入的数值 // FlashWriteStatus:返回数值 1:写入正确 0:写入错误 */ // FlashWriteStatus = Write_LengthByte(FlashTest.FlashWriteAddr, Flash_DATA_Length, FlashTest.Flash_Write_Data); // // /* 写入正确时最后一位写入校验位 */ // if (FlashWriteStatus == 0) //当前数值写入错误 // { // Flash_byte_Write((FlashTest.FlashWriteAddr + Verify_Bit), Verify_Error); // } // else //当前数值写入正确 // { // Flash_byte_Write((FlashTest.FlashWriteAddr + Verify_Bit), Verify_Ture); // } // // //更新读写首地址 // FlashTest.FlashReadAddr = FlashTest.FlashWriteAddr; // FlashTest.FlashWriteAddr = FlashTest.FlashWriteAddr + Flash_DATA_Length; // // /*写到相应的空间,不管之前写入是否准确,直接进行相关的擦除 // 擦除后会当即写入Flash*/ // if (FlashTest.FlashWriteAddr >= USERCODEADDRESS + 0x0FD0) //&& (FlashWriteStatus == 0)) // { // FlashTest.Flag_FlashErase = 1; // 置擦除标志位 // FlashWriteStatus = 1; // 没有空间,强行跳转 // } // } // } //} /* -------------------------- (C) COPYRIGHT 2022 Fortiortech ShenZhen ---------------------------*/ /** * @copyright (C) COPYRIGHT 2022 Fortiortech Shenzhen * @file * @author Fortiortech Appliction Team * @since Create:2022-07-14 * @date Last modify:2022-07-14 * @note Last modify author is Leo.li * @brief */ /* Includes ------------------------------------------------------------------*/ #include #include ROM_TypeDef xdata FlashData; uint8 Flash_GetAddress(void); /** * @brief 读取固定地址值 * @date 2022-07-14 */ uint8 ReadFlashValue(uint16 ReadAddress) { uint16 TempAddress0 = ReadAddress; __IO uint8 tevalue = 0; //临时变量 tevalue = *(uint8 code *)TempAddress0; //读取回地址的值 return tevalue; } /** * @brief 擦除指定扇区 * @brief FlashAddress--Flash自擦除扇区内任意地址 * @return 0--Flash自擦除成功,1--Flash自擦除失败 * @date 2022-07-14 */ uint8 Flash_Sector_Erase(uint8 xdata * FlashAddress) { bool TempEA; uint16 TempFlashAddress; TempEA = EA; EA = 0; TempFlashAddress = (uint16)FlashAddress; if ((TempFlashAddress) < (0x7f00)) // 不擦除最后一个扇区 { FLA_CR = 0x03; //使能自擦除 FLA_KEY = 0x5a; FLA_KEY = 0x1f; //flash预编程解锁 _nop_(); *FlashAddress = 0xff; //写任意数据 FLA_CR = 0x08; //开始预编程,完成后Flash再次上锁 } EA = TempEA; if (ReadBit(FLA_CR, FLAERR)) { return 1; } else { return 0; } } /** * @brief 擦除指定扇区 * @brief FlashAddress--指定写入地址 * @brief FlashData--写入数值 * @return 0--Flash自擦除成功,1--Flash自擦除失败 * @date 2022-07-14 */ void Flash_Sector_Write(uint8 xdata * FlashAddress, uint8 Flash_Data) { bool TempEA = 0; uint16 TempFlashAddress; uint8 idata Flash_Data_t = Flash_Data; TempEA = EA; EA = 0; TempFlashAddress = (uint16)FlashAddress; if ((TempFlashAddress) < 0x7f00) // 不编程最后一个扇区 { FLA_CR = 0x01; // 使能Flash编程 FLA_KEY = 0x5a; FLA_KEY = 0x1f; // flash预编程解锁 _nop_(); *(uint8 xdata *)FlashAddress = Flash_Data_t; // 写编程数据 FLA_CR = 0x08; // 开始预编程,完成后Flash再次上锁 } EA = TempEA; } /** * @brief WriteAddress--指定写入地址 * @brief Length:写入数组长度 * @brief value--写入数组 * @date 2022-11-14 */ uint8 Flash_WriteValue(uint16 WriteAddress, uint8 Length, uint8 * str) { uint8 i; uint8 TempReadRomValue; uint16 FlashWriteAddr = WriteAddress; //读出有效数据 for (i = 0; i < Length; i++) { Flash_Sector_Write(FlashWriteAddr + i, str[i]); TempReadRomValue = *(uint8 code *)(FlashWriteAddr + i); if (TempReadRomValue != str[i]) { return 0; } } return 1; } /** * @brief 获取最后写入的地址,确认最新能写入的地址 * @brief unsigned short FlashAddress:目标FLASH首地址 * @brief uint8 Write_Length:写入数值长度 */ uint16 GetWrite_Black_Addr(unsigned short FlashAddress, uint8 Write_Length) { uint16 TempFlashAddress = 0; uint16 TempFirstAddress = 0; //用来保存保存首地址 uint8 tempFlashData = 0xFF; uint8 Length = 0; TempFlashAddress = FlashAddress; TempFirstAddress = FlashAddress; while ((Length != Write_Length) && (TempFlashAddress < (TempFirstAddress + Write_Length))) //限定读取地址为当前页 { tempFlashData = *(uint8 code *)(TempFlashAddress); //读取目标地址中数值是否为0 if (tempFlashData == 0) { Length ++; TempFlashAddress += 1; } else { TempFirstAddress += Write_Length; //首地址跳转Write_Length字节 if (TempFirstAddress > 0x7f00) { TempFirstAddress = 0x7f00; } TempFlashAddress = TempFirstAddress; Length = 0; } } return TempFirstAddress; } /** * @brief 读取Length字节数据, * @Input unsigned short BlockStartAddr:目标FLASH首地址 * @Input uint8 Length:数值长度 * @Input uint8 * str :读回数值写入数组 * @ruturn Flash数据 */ void ReadFromFlash(unsigned short BlockStartAddr, uint8 Length, uint8 * str) { uint8 i = 0; for (i = 0; i < Length; i++) { str[i] = *(uint8 code *)(BlockStartAddr + i); } } /** * @brief 扇区擦除 * @Input * @ruturn */ void Flash_Erase(void) { uint8 FlashEraseStatus = 0; FlashEraseStatus = Flash_Sector_Erase(START_WriteADDRESS); if (!FlashEraseStatus) { /*----- 获取写入首地址 -----*/ FlashData.WriteAddress = GetWrite_Black_Addr(START_WriteADDRESS, Write_Lenght); } else { FlashEraseStatus = Flash_Sector_Erase(START_WriteADDRESS); FlashData.WriteAddress = START_WriteADDRESS; //第一次擦写失败后第二次擦写,强行给地址 /*----- 第二次擦写再失败,默认为Flash损坏,不进行处理 -----*/ if (FlashEraseStatus) { ; } } FlashData.Flag_FlashErase = 0; } /** * @brief 保存按键 * @date 2022-11-14 */ void Save_KeyValue(void) { uint8 FlashWriteStatus = 0; //返回值 uint8 TempReadValue = 0; FlashData.WriteValue[0] = KS.KeyValuetotal; if (FlashData.ReadValue[0] != FlashData.WriteValue[0]) //确认写入前后数据不一致 { EA = 0; while (!FlashWriteStatus) //写入异常,换到下个地址写入 { FlashWriteStatus = Flash_WriteValue(FlashData.WriteAddress, Write_Lenght, FlashData.WriteValue); if (FlashWriteStatus) { Flash_Sector_Write(FlashData.WriteAddress + Verify_Bit, Verify_Ture); TempReadValue = *(uint8 code *)(FlashData.WriteAddress + Verify_Bit); /*----- 更新读取Flash首地址 -----*/ FlashData.ReadAddress = FlashData.WriteAddress - Write_Lenght; /*----- 读取数值到FlashData.ReadValue -----*/ ReadFromFlash(FlashData.ReadAddress, Write_Lenght, FlashData.ReadValue); if (TempReadValue == Verify_Ture) { goto exit; } else { FlashWriteStatus = 0; } } else { Flash_Sector_Write(FlashData.WriteAddress + Verify_Bit, Verify_Error); FlashData.WriteAddress = FlashData.WriteAddress + Write_Lenght; if (FlashData.WriteAddress > START_WriteADDRESS + 0x70) { FlashData.Flag_FlashErase = 1; //写到扇区最后字节,依然失败,直接进行数值清楚 goto exit; } } } exit: EA = 1; } }