eeprom_flash.c 8.7 KB

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