eeprom_flash.c 7.4 KB

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