eeprom_flash.c 7.3 KB

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