settings.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #include "settings.h"
  2. #include "cmsis_os.h"
  3. #include "config.h"
  4. #include <string.h>
  5. CRC_HandleTypeDef hcrc;
  6. //volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;
  7. settings_t settings;
  8. static FLASH_EraseInitTypeDef EraseInitStruct;
  9. //
  10. void settings_crc_init(void)
  11. {
  12. hcrc.Instance = CRC;
  13. hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;
  14. hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;
  15. hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;
  16. hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;
  17. hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_WORDS;
  18. HAL_CRC_Init(&hcrc);
  19. }
  20. //
  21. void HAL_CRC_MspInit(CRC_HandleTypeDef* hcrc)
  22. {
  23. if(hcrc->Instance==CRC)
  24. {
  25. __HAL_RCC_CRC_CLK_ENABLE();
  26. }
  27. }
  28. //
  29. void HAL_CRC_MspDeInit(CRC_HandleTypeDef* hcrc)
  30. {
  31. if(hcrc->Instance==CRC)
  32. {
  33. __HAL_RCC_CRC_CLK_DISABLE();
  34. }
  35. }
  36. //
  37. void settings_load(void)
  38. {
  39. uint32_t load_crc; // CRC из flash
  40. uint32_t new_crc; // CRC загруженной структуры настроек
  41. settings_read_from_flash((uint8_t*)&settings, sizeof(settings));
  42. // Считываем CRC из флеш памяти
  43. load_crc = (*(uint32_t*)CRC_ADDRESS);
  44. // Рассчитываем CRC для структуры настроек
  45. new_crc = settings_get_crc();
  46. // Если CRC не совпадают нужно прошивать дефолтные настройки
  47. if (load_crc != new_crc) {
  48. settings_set_def();
  49. settings_save();
  50. }
  51. }
  52. //
  53. void settings_save(void)
  54. {
  55. uint32_t baseAddress = SETTINGS_ADDR;
  56. uint32_t crc;
  57. uint32_t size = sizeof(settings) / 4;
  58. uint32_t *data = (uint32_t*)&settings;
  59. HAL_FLASH_Unlock();
  60. __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
  61. EraseInitStruct.TypeErase = FLASH_TYPEERASE_MASSERASE;
  62. EraseInitStruct.Banks = FLASH_BANK_1;
  63. //HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError)
  64. FLASH_PageErase(SETTINGS_ADDR, FLASH_BANK_1);
  65. HAL_FLASH_Lock();
  66. #if 0
  67. vPortEnterCritical();
  68. FLASH_Unlock();
  69. FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
  70. FLASHStatus = FLASH_ErasePage(SETTINGS_ADDR);
  71. //crc = settings_get_crc();
  72. FLASH_ProgramWord(CRC_ADDRESS, crc);
  73. for (uint32_t i = 0; i < size; i++) {
  74. FLASH_ProgramWord(baseAddress, *data++);
  75. baseAddress += 4;
  76. }
  77. FLASH_Lock();
  78. vPortExitCritical();
  79. #endif
  80. }
  81. //
  82. void settings_set_def(void)
  83. {
  84. memset(settings.fw_version, 0, 20);
  85. strcpy(settings.fw_version, FW_VERSION);
  86. settings.motor_speed = 50;
  87. settings.support_speed = 60;
  88. settings.temperature_threshold = 70;
  89. }
  90. //
  91. uint32_t settings_get_crc(void)
  92. {
  93. //CRC_ResetDR();
  94. return HAL_CRC_Calculate(&hcrc, (uint32_t*)&settings, sizeof(settings));
  95. //return CRC_CalcBlockCRC((uint32_t*)&settings, sizeof(settings));
  96. }
  97. //
  98. void settings_read_from_flash(uint8_t *data, uint32_t size)
  99. {
  100. uint32_t baseAddress = SETTINGS_ADDR;
  101. for (uint32_t i = 0; i < size; i++)
  102. *data++ = (*(uint32_t*)baseAddress++);
  103. }
  104. //
  105. void settings_test(void)
  106. {
  107. }