eeprom_flash.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. #include "eeprom_flash.h"
  2. #include "enviolo_can.h"
  3. const uint8_t EEPROM_Flash_Flag[4] = {0x55,0xAA,0x55,0xAA};
  4. FLASH_EraseInitTypeDef EEPROM_AreaEraseInitStruct;
  5. TrueOrFalse_Flag_Struct_t IsPowerOffDataBkp_SaveFlag = FALSE;
  6. TrueOrFalse_Flag_Struct_t IsFlashSaveDataUpdate = FALSE;
  7. /****************************局部函数定义******************************/
  8. //数据写入
  9. static void CopyDataToEEPROM_Flash(void)
  10. {
  11. uint32_t Temp_32[2];
  12. //Flash页擦除
  13. EEPROM_Flash_Erase(EEPROM_FLASH_BEGIN_ADDRESS, EEPROM_FLASH_END_ADDRESS);//约102ms
  14. //写入型号
  15. SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_MODE, (uint8_t*)MC_VerInfo.Mode, 16);
  16. //写入序列号
  17. SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_SN, (uint8_t*)MC_VerInfo.SN_Num, 16);
  18. //写入生产信息
  19. SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_MAC_INFO, (uint8_t*)MC_MacInfo.Manufacturer, 32);
  20. //写入自定义字符串1
  21. SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_USER_INFO1, (uint8_t*)UserString1, 16);
  22. //写入自定义字符串2
  23. SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_USER_INFO2, (uint8_t*)UserString2, 16);
  24. //写入自定义字符串3
  25. SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_USER_INFO3, (uint8_t*)UserString3, 16);
  26. //写入自动变速器控制参数
  27. SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_GEARBOX_PARAMS, (uint8_t*)&GearBox_OBC_SetParams.GearNum, 8);
  28. //写入标志
  29. Temp_32[0] = (EEPROM_Flash_Flag[0] << 24) + (EEPROM_Flash_Flag[1] << 16) + (EEPROM_Flash_Flag[2] << 8) + EEPROM_Flash_Flag[3];
  30. Temp_32[1] = CRC32_Calculate((uint8_t*)EEPROM_Flash_Flag, 4);
  31. FLASH_Write(EEPROM_FLASH_ADDR_FLAG, Temp_32, 2);
  32. }
  33. static void CopyDataFromEEPROM_Flash(void)
  34. {
  35. uint8_t Data_Buf[64];
  36. int8_t Error_OK;
  37. //读取型号
  38. Error_OK = ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MODE, Data_Buf, 16);
  39. if(Error_OK == 0)
  40. {
  41. memcpy(MC_VerInfo.Mode, Data_Buf, 16);
  42. }
  43. //读取序列号
  44. Error_OK = ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_SN, Data_Buf, 16);
  45. if(Error_OK == 0)
  46. {
  47. memcpy(MC_VerInfo.SN_Num, Data_Buf, 16);
  48. }
  49. //读取生产信息
  50. Error_OK = ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MAC_INFO, Data_Buf, 32);
  51. if(Error_OK == 0)
  52. {
  53. memcpy(MC_MacInfo.Manufacturer, Data_Buf, 32);
  54. }
  55. //读取自定义字符串1
  56. Error_OK = ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_USER_INFO1, Data_Buf, 16);
  57. if(Error_OK == 0)
  58. {
  59. memcpy(&UserString1, Data_Buf, 16);
  60. }
  61. //读取自定义字符串2
  62. Error_OK = ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_USER_INFO2, Data_Buf, 16);
  63. if(Error_OK == 0)
  64. {
  65. memcpy(&UserString2, Data_Buf, 16);
  66. }
  67. //读取自定义字符串3
  68. Error_OK = ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_USER_INFO3, Data_Buf, 16);
  69. if(Error_OK == 0)
  70. {
  71. memcpy(&UserString3, Data_Buf, 16);
  72. }
  73. //读取自动变速器控制参数
  74. Error_OK = ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_GEARBOX_PARAMS, Data_Buf, 8);
  75. if(Error_OK == 0)
  76. {
  77. memcpy((uint8_t*)&GearBox_OBC_SetParams.GearNum, Data_Buf, 8);
  78. }
  79. }
  80. /****************************全局函数定义******************************/
  81. //指定地址写入指定长度数据类型为32bit数据
  82. void FLASH_Write(uint32_t FlashAddress, uint32_t* Data, uint16_t DataLength)
  83. {
  84. uint32_t i = 0;
  85. HAL_FLASH_Unlock();
  86. for (i = 0; (i < DataLength) && (FlashAddress <= (EEPROM_FLASH_END_ADDRESS-4)); i++)
  87. {
  88. if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FlashAddress, *(uint32_t*)(Data + i)) == HAL_OK)
  89. {
  90. FlashAddress += 4;
  91. }
  92. else
  93. {
  94. // Error occurred while writing data in Flash memory
  95. HAL_FLASH_Lock();
  96. return;
  97. }
  98. }
  99. HAL_FLASH_Lock();
  100. return;
  101. }
  102. //擦除数据
  103. void EEPROM_Flash_Erase(uint32_t BeginAddress, uint32_t EndAddress)
  104. {
  105. uint32_t PageError;
  106. EEPROM_AreaEraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  107. EEPROM_AreaEraseInitStruct.PageAddress = BeginAddress;
  108. EEPROM_AreaEraseInitStruct.NbPages = (EndAddress - BeginAddress + 1) / 1024;
  109. HAL_FLASH_Unlock();
  110. __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
  111. HAL_FLASHEx_Erase(&EEPROM_AreaEraseInitStruct, &PageError);
  112. HAL_FLASH_Lock();
  113. HAL_Delay(100);
  114. }
  115. //指定地址读取指定长度数据类型为8bit数据
  116. int8_t ReadDataFromEEPROM_Flash(uint32_t FlashAddress, uint8_t* Data, uint8_t Length) // Length必须为4的倍数
  117. {
  118. uint32_t DataTemp32[8], CRC_Data, CRC_Result;
  119. uint8_t CRC_Buf[64], i;
  120. Length = Length >> 2;//按照32bit读取
  121. for(i=0; i<Length; i++)
  122. {
  123. DataTemp32[i] = *(__IO uint32_t*)(FlashAddress + i * 4);
  124. CRC_Buf[4 * i] = (uint8_t)((DataTemp32[i] >> 24) & 0xFF);
  125. CRC_Buf[4 * i + 1] = (uint8_t)((DataTemp32[i] >> 16) & 0xFF);
  126. CRC_Buf[4 * i + 2] = (uint8_t)((DataTemp32[i] >> 8) & 0xFF);
  127. CRC_Buf[4 * i + 3] = (uint8_t)(DataTemp32[i] & 0xFF);
  128. }
  129. CRC_Data = *(__IO uint32_t*)(FlashAddress + Length * 4);
  130. CRC_Result = CRC32_Calculate(CRC_Buf, i * 4);
  131. if((CRC_Data - CRC_Result) == 0)
  132. {
  133. memcpy(Data, CRC_Buf, Length * 4);
  134. return 0;
  135. }
  136. else
  137. {
  138. return -1;
  139. }
  140. }
  141. //指定地址写入指定长度数据类型为8bit数据,并写入crc校验码
  142. void SaveDataToEEPROM_Flash(uint32_t FlashAddress, uint8_t* Data, uint8_t Length) // Length必须为4的倍数
  143. {
  144. uint32_t CRC_Result, DataBuf[65];
  145. uint8_t PakageNum, i;
  146. PakageNum = Length / 4;
  147. //数据组包成32bit,最后一包存储CRC校验结果
  148. for(i=0; i<PakageNum; i++)
  149. {
  150. DataBuf[i] = (Data[4 * i + 0] << 24) + (Data[4 * i + 1] << 16) + (Data[4 * i + 2] << 8) + Data[4 * i + 3];
  151. }
  152. CRC_Result = CRC32_Calculate(Data, Length);
  153. DataBuf[PakageNum] = CRC_Result;
  154. //存储数据
  155. FLASH_Write(FlashAddress, DataBuf, PakageNum + 1);
  156. }
  157. void EEPROM_Flash_Check(void)
  158. {
  159. uint8_t DataBuf[4];
  160. uint32_t Flag, FlagCrc, FlagResult;
  161. //读标志位
  162. Flag = *(__IO uint32_t*)(EEPROM_FLASH_ADDR_FLAG);
  163. //读校验位
  164. FlagCrc = *(__IO uint32_t*)(EEPROM_FLASH_ADDR_FLAG + 4);
  165. DataBuf[0] = Flag >> 24;
  166. DataBuf[1] = Flag >> 16;
  167. DataBuf[2] = Flag >> 8;
  168. DataBuf[3] = Flag & 0xFF;
  169. FlagResult = CRC32_Calculate(DataBuf, 4);
  170. //判断数据是否有效
  171. if((FlagResult - FlagCrc) == 0)//数据有效
  172. {
  173. CopyDataFromEEPROM_Flash();
  174. }
  175. else//数据无效
  176. {
  177. CopyDataToEEPROM_Flash();
  178. }
  179. }
  180. void EEPROM_Flash_DataUpdate(TrueOrFalse_Flag_Struct_t* IsUpdateFlag)
  181. {
  182. if(*IsUpdateFlag == TRUE)
  183. {
  184. CopyDataToEEPROM_Flash();
  185. *IsUpdateFlag = FALSE;
  186. }
  187. }
  188. TrueOrFalse_Flag_Struct_t EEPROM_Flash_TempCheck(void)
  189. {
  190. uint8_t Data_Buf[64];
  191. int8_t Error_OK;
  192. //读取掉电临时保存的数据
  193. Error_OK = ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP_FLAG, Data_Buf, 4);
  194. if(Error_OK == 0)
  195. {
  196. if(strncmp("FLAG", (char*)Data_Buf, 4) == 0) //关机前进行过存储
  197. {
  198. Error_OK = ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP, Data_Buf, 40);
  199. if(Error_OK == 0)
  200. {
  201. memcpy((uint8_t*)&MC_PowerOffBkp.ODO_Km, Data_Buf, 40);
  202. return TRUE;
  203. }
  204. }
  205. }
  206. return FALSE;
  207. }