settings.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include "settings.h"
  2. #include "cmsis_os.h"
  3. #include "config.h"
  4. #include <string.h>
  5. CRC_HandleTypeDef hcrc;
  6. settings_t settings;
  7. static FLASH_EraseInitTypeDef EraseInitStruct;
  8. //
  9. void settings_crc_init(void)
  10. {
  11. hcrc.Instance = CRC;
  12. hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;
  13. hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;
  14. hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;
  15. hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;
  16. hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
  17. HAL_CRC_Init(&hcrc);
  18. }
  19. //
  20. void HAL_CRC_MspInit(CRC_HandleTypeDef* hcrc)
  21. {
  22. if(hcrc->Instance==CRC)
  23. {
  24. __HAL_RCC_CRC_CLK_ENABLE();
  25. }
  26. }
  27. //
  28. void HAL_CRC_MspDeInit(CRC_HandleTypeDef* hcrc)
  29. {
  30. if(hcrc->Instance==CRC)
  31. {
  32. __HAL_RCC_CRC_CLK_DISABLE();
  33. }
  34. }
  35. //
  36. void settings_load(void)
  37. {
  38. uint32_t load_crc; // CRC из flash
  39. uint32_t new_crc; // CRC загруженной структуры настроек
  40. settings_read_from_flash((uint8_t*)&settings, sizeof(settings));
  41. // Считываем CRC из флеш памяти
  42. load_crc = (*(uint32_t*)GET_SETTINGS_CRC_ADDR(SETTINGS_PAGE));
  43. // Рассчитываем CRC для структуры настроек
  44. new_crc = settings_get_crc();
  45. // Если CRC не совпадают нужно прошивать дефолтные настройки
  46. if (load_crc != new_crc) {
  47. settings_set_def();
  48. settings_save();
  49. }
  50. }
  51. //
  52. bool settings_save(void)
  53. {
  54. uint32_t addr = GET_PAGE_ADDR(SETTINGS_PAGE);
  55. uint64_t *ptr = (uint64_t*)&settings;
  56. taskENTER_CRITICAL();
  57. HAL_FLASH_Unlock();
  58. settings_erase_page(SETTINGS_PAGE);
  59. save_settings_attributes(SETTINGS_PAGE);
  60. for (uint16_t i = 0; i < (sizeof(settings) / 8) + 1; i++)
  61. {
  62. if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr, *ptr) != HAL_OK)
  63. {
  64. return false;
  65. }
  66. addr += 8;
  67. ptr++;
  68. }
  69. HAL_FLASH_Lock();
  70. taskEXIT_CRITICAL();
  71. return true;
  72. }
  73. //
  74. bool save_settings_attributes(uint16_t page)
  75. {
  76. uint32_t crc_addr = GET_SETTINGS_CRC_ADDR(page);
  77. uint32_t crc;
  78. crc = settings_get_crc();
  79. if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, crc_addr,
  80. (uint64_t)crc) != HAL_OK) {
  81. return false;
  82. }
  83. return true;
  84. }
  85. //
  86. bool settings_erase_page(uint16_t page)
  87. {
  88. uint32_t bank_number = 0;
  89. uint32_t addr = 0;
  90. uint32_t PAGEError = 0;
  91. __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
  92. addr = GET_PAGE_ADDR(page);
  93. bank_number = settings_get_bank(addr);
  94. EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  95. EraseInitStruct.NbPages = 1;
  96. EraseInitStruct.Page = page;
  97. EraseInitStruct.Banks = bank_number;
  98. if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
  99. return false;
  100. return true;
  101. }
  102. //
  103. uint32_t settings_get_bank(uint32_t addr)
  104. {
  105. return FLASH_BANK_1;
  106. }
  107. //
  108. void settings_set_def(void)
  109. {
  110. memset(settings.fw_version, 0, 20);
  111. strcpy(settings.fw_version, FW_VERSION);
  112. settings.motor_speed = 50;
  113. settings.support_speed = 60;
  114. settings.temperature_threshold = 70;
  115. }
  116. //
  117. uint32_t settings_get_crc(void)
  118. {
  119. __HAL_CRC_DR_RESET(&hcrc);
  120. return HAL_CRC_Calculate(&hcrc, (uint32_t*)&settings, sizeof(settings));
  121. }
  122. //
  123. void settings_read_from_flash(uint8_t *data, uint32_t size)
  124. {
  125. uint32_t baseAddress = SETTINGS_ADDR;
  126. for (uint32_t i = 0; i < size; i++)
  127. *data++ = (*(uint32_t*)baseAddress++);
  128. }
  129. //
  130. void settings_test(void)
  131. {
  132. }