1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #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; i<PakageNum; i++)
- {
- DataBuf[i] = (Data[4 * i + 3] << 24) + (Data[4 * i + 2] << 16) + (Data[4 * i + 1] << 8) + Data[4 * i];
- }
-
- //存储数据
- FLASH_Write(FlashAddress, DataBuf, PakageNum);
- }
- //确定故障日志存储索引,返回数值范围0-15,-1表示存满需移位
- static int16_t ErrorLog_GetSaveIndex(uint16_t* ErrorIndex)
- {
- int8_t i;
- uint16_t Temp16;
-
- for(i=0; i< 16; i++)
- {
- Temp16 = *(__IO uint16_t*)(LOG_ADDRESS_BEGIN + (i * 64));
- if(Temp16 == 0xFFFF)
- {
- //确定当前故障的序列号
- if(i == 0)
- {
- *ErrorIndex = 1;
- }
- else
- {
- Temp16 = *(__IO uint16_t*)(LOG_ADDRESS_BEGIN + (i * 64 - 64));
- *ErrorIndex = Temp16 + 1;
- }
- //返回存储的索引,范围0-15
- return i;
- }
- }
- //返回存储的索引,-1表示存满需移位
- Temp16 = *(__IO uint16_t*)(LOG_ADDRESS_BEGIN + (15 * 64));
- *ErrorIndex = Temp16 + 1;
- return -1;
- }
- //故障日志信息更新
- void ErrorLogSave_Update(MC_ErrorLogSaveInfo_Struct_t* p_ErrorLogSaveInfo)
- {
- p_ErrorLogSaveInfo->ErrorCode = 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;
- }
- }
|