#include "log_save.h" MC_ErrorLogSaveInfo_Struct_t MC_ErrorLogSaveInfo; TrueOrFalse_Flag_Struct_t IsErrorLogSaveInfoUpdateFlag = FALSE; //按照字节流写入Flash static void SaveDataToFalsh_NBytes(uint32_t FlashAddress, uint8_t* Data, uint8_t Length) { uint32_t DataBuf[16]; uint8_t PakageNum, i; PakageNum = Length / 4; //数据组包成32bit for(i=0; iErrorCode = MC_ErrorCode.Code; p_ErrorLogSaveInfo->RunTime = MC_RunLog1.RunTime; memcpy((uint8_t*)&p_ErrorLogSaveInfo->RunInfo.BikeSpeed, (uint8_t*)&MC_RunInfo.BikeSpeed, sizeof(MC_RunInfo_Struct_t)); memcpy((uint8_t*)&p_ErrorLogSaveInfo->AttitudeAngle.Angle_Pitch_Absolute, (uint8_t*)&MC_AttitudeAngle.Angle_Pitch_Absolute,sizeof(MC_AttitudeAngle_Struct_t)); memcpy((uint8_t*)&p_ErrorLogSaveInfo->MC_CalParam.AssistRunMode, (uint8_t*)&MC_CalParam.AssistRunMode, sizeof(MC_CalParam_Struct_t)); } //故障日志存储处理 void ErrorLogSave_Process(MC_ErrorLogSaveInfo_Struct_t* p_ErrorLogSaveInfo, TrueOrFalse_Flag_Struct_t* IsUpdate) { uint32_t Address_Begin; int8_t SaveIndex; if(*IsUpdate == TRUE) { //读取存储索引,并记录故障序号 SaveIndex = ErrorLog_GetSaveIndex(&p_ErrorLogSaveInfo->Error_Index); //故障日志存储 if(SaveIndex != -1) //未存满 { Address_Begin = LOG_ADDRESS_BEGIN + 64 * SaveIndex; SaveDataToFalsh_NBytes(Address_Begin, (uint8_t*)&p_ErrorLogSaveInfo->Error_Index, sizeof(MC_ErrorLogSaveInfo_Struct_t));//保存更新最近一条记录 } else //表示存满,需要移位处理,最新的保存最后 { //相邻页作为临时缓存 EEPROM_Flash_Erase(LOG_ADDRESS_BEGIN - 1024, LOG_ADDRESS_END - 1024); FLASH_Write(LOG_ADDRESS_BEGIN - 1024, (uint32_t*)(LOG_ADDRESS_BEGIN + 64), 15 * 16);//转存最近15条记录 EEPROM_Flash_Erase(LOG_ADDRESS_BEGIN, LOG_ADDRESS_END); FLASH_Write(LOG_ADDRESS_BEGIN, (uint32_t*)(LOG_ADDRESS_BEGIN -1024), 15 * 16);//恢复最近15条记录 Address_Begin = LOG_ADDRESS_BEGIN + 64 * 15; SaveDataToFalsh_NBytes(Address_Begin, (uint8_t*)&p_ErrorLogSaveInfo->Error_Index, sizeof(MC_ErrorLogSaveInfo_Struct_t));//保存更新最近一条记录 } //完成存储 *IsUpdate = FALSE; } }