log_save.c 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include "log_save.h"
  2. MC_ErrorLogSaveInfo_Struct_t MC_ErrorLogSaveInfo;
  3. TrueOrFalse_Flag_Struct_t IsErrorLogSaveInfoUpdateFlag = FALSE;
  4. //按照字节流写入Flash
  5. static void SaveDataToFalsh_NBytes(uint32_t FlashAddress, uint8_t* Data, uint8_t Length)
  6. {
  7. uint32_t DataBuf[16];
  8. uint8_t PakageNum, i;
  9. PakageNum = Length / 4;
  10. //数据组包成32bit
  11. for(i=0; i<PakageNum; i++)
  12. {
  13. DataBuf[i] = (Data[4 * i + 3] << 24) + (Data[4 * i + 2] << 16) + (Data[4 * i + 1] << 8) + Data[4 * i];
  14. }
  15. //存储数据
  16. FLASH_Write(FlashAddress, DataBuf, PakageNum);
  17. }
  18. //确定故障日志存储索引,返回数值范围0-15,-1表示存满需移位
  19. static int16_t ErrorLog_GetSaveIndex(uint16_t* ErrorIndex)
  20. {
  21. int8_t i;
  22. uint16_t Temp16;
  23. for(i=0; i< 16; i++)
  24. {
  25. Temp16 = *(__IO uint16_t*)(LOG_ADDRESS_BEGIN + (i * 64));
  26. if(Temp16 == 0xFFFF)
  27. {
  28. //确定当前故障的序列号
  29. if(i == 0)
  30. {
  31. *ErrorIndex = 1;
  32. }
  33. else
  34. {
  35. Temp16 = *(__IO uint16_t*)(LOG_ADDRESS_BEGIN + (i * 64 - 64));
  36. *ErrorIndex = Temp16 + 1;
  37. }
  38. //返回存储的索引,范围0-15
  39. return i;
  40. }
  41. }
  42. //返回存储的索引,-1表示存满需移位
  43. Temp16 = *(__IO uint16_t*)(LOG_ADDRESS_BEGIN + (15 * 64));
  44. *ErrorIndex = Temp16 + 1;
  45. return -1;
  46. }
  47. //故障日志信息更新
  48. void ErrorLogSave_Update(MC_ErrorLogSaveInfo_Struct_t* p_ErrorLogSaveInfo)
  49. {
  50. p_ErrorLogSaveInfo->ErrorCode = MC_ErrorCode.Code;
  51. p_ErrorLogSaveInfo->RunTime = MC_RunLog1.RunTime;
  52. memcpy((uint8_t*)&p_ErrorLogSaveInfo->RunInfo.BikeSpeed, (uint8_t*)&MC_RunInfo.BikeSpeed, sizeof(MC_RunInfo_Struct_t));
  53. memcpy((uint8_t*)&p_ErrorLogSaveInfo->AttitudeAngle.Angle_Pitch_Absolute, (uint8_t*)&MC_AttitudeAngle.Angle_Pitch_Absolute,sizeof(MC_AttitudeAngle_Struct_t));
  54. memcpy((uint8_t*)&p_ErrorLogSaveInfo->MC_CalParam.AssistRunMode, (uint8_t*)&MC_CalParam.AssistRunMode, sizeof(MC_CalParam_Struct_t));
  55. }
  56. //故障日志存储处理
  57. void ErrorLogSave_Process(MC_ErrorLogSaveInfo_Struct_t* p_ErrorLogSaveInfo, TrueOrFalse_Flag_Struct_t* IsUpdate)
  58. {
  59. uint32_t Address_Begin;
  60. int8_t SaveIndex;
  61. if(*IsUpdate == TRUE)
  62. {
  63. //读取存储索引,并记录故障序号
  64. SaveIndex = ErrorLog_GetSaveIndex(&p_ErrorLogSaveInfo->Error_Index);
  65. //故障日志存储
  66. if(SaveIndex != -1) //未存满
  67. {
  68. Address_Begin = LOG_ADDRESS_BEGIN + 64 * SaveIndex;
  69. SaveDataToFalsh_NBytes(Address_Begin, (uint8_t*)&p_ErrorLogSaveInfo->Error_Index, sizeof(MC_ErrorLogSaveInfo_Struct_t));//保存更新最近一条记录
  70. }
  71. else //表示存满,需要移位处理,最新的保存最后
  72. {
  73. //相邻页作为临时缓存
  74. EEPROM_Flash_Erase(LOG_ADDRESS_BEGIN - 1024, LOG_ADDRESS_END - 1024);
  75. FLASH_Write(LOG_ADDRESS_BEGIN - 1024, (uint32_t*)(LOG_ADDRESS_BEGIN + 64), 15 * 16);//转存最近15条记录
  76. EEPROM_Flash_Erase(LOG_ADDRESS_BEGIN, LOG_ADDRESS_END);
  77. FLASH_Write(LOG_ADDRESS_BEGIN, (uint32_t*)(LOG_ADDRESS_BEGIN -1024), 15 * 16);//恢复最近15条记录
  78. Address_Begin = LOG_ADDRESS_BEGIN + 64 * 15;
  79. SaveDataToFalsh_NBytes(Address_Begin, (uint8_t*)&p_ErrorLogSaveInfo->Error_Index, sizeof(MC_ErrorLogSaveInfo_Struct_t));//保存更新最近一条记录
  80. }
  81. //完成存储
  82. *IsUpdate = FALSE;
  83. }
  84. }