factors.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #include "at32f403a_407.h"
  2. #include "factors.h"
  3. #include "common_config.h"
  4. #include "sys_api.h"
  5. #include "sys_hal.h"
  6. #include "settings_api.h"
  7. #include <stdio.h>
  8. #if defined (MAI_12)
  9. #undef DBG
  10. #define DBG if(1)
  11. factors_t ai_factors;
  12. //
  13. void factors_load(factors_t *factors)
  14. {
  15. uint32_t load_crc;
  16. uint32_t new_crc;
  17. bool need_default = false;
  18. factors_read_from_flash((uint8_t*)factors, sizeof(factors_t));
  19. // Считываем CRC из флеш памяти
  20. load_crc = (*(uint32_t*)CRC_FACTOR);
  21. // Рассчитываем CRC для структуры настроек
  22. new_crc = factors_get_crc(factors);
  23. // Если CRC не совпадают нужно прошивать дефолтные настройки
  24. if (load_crc != new_crc)
  25. {
  26. DBG printf("Bad factors sector CRC. Factors defaults restored.\r\n");
  27. need_default = true;
  28. }
  29. // CRC совпала, проверяем контрольное слово если слово не совпадает
  30. // то это значит, что поплыла структура нстроек, прошиваем дефолт */
  31. else if (factors->control_word != SETTINGS_CONTROL_WORD)
  32. {
  33. DBG printf("Bad factors control word. Factors defaults restored.\r\n");
  34. need_default = true;
  35. }
  36. // Прошиваем дефолтные настройки если нужно
  37. if (need_default)
  38. {
  39. factros_set_default(factors);
  40. factors_save(factors);
  41. }
  42. //DBG sys_print(settings);
  43. }
  44. //
  45. void factros_set_default(factors_t *factors)
  46. {
  47. for (int i = 0; i < AI_COMMON_NUMBER; i++)
  48. {
  49. factors->factor_k_v10[i] = 1.0;
  50. factors->factor_b_v10[i] = 0.0;
  51. factors->factor_k_v1[i] = 1.0;
  52. factors->factor_b_v1[i] = 0.0;
  53. factors->factor_k_cur[i] = 1.0;
  54. factors->factor_b_cur[i] = 0.0;
  55. }
  56. factors->control_word = SETTINGS_CONTROL_WORD;
  57. }
  58. //
  59. bool factors_save(factors_t *factors)
  60. {
  61. bool ret = false;
  62. xSemaphoreTake(flash_mutex, portMAX_DELAY);
  63. ret = factors_write_to_flash((uint8_t*)factors, sizeof(factors_t));
  64. xSemaphoreGive(flash_mutex);
  65. return ret;
  66. }
  67. //
  68. bool factors_write_to_flash(uint8_t *data, uint32_t size)
  69. {
  70. uint32_t baseAddress = CALIBRATION_FACTOR_SECTOR;
  71. uint32_t checkCrc = 0;
  72. uint32_t crc = factors_get_crc((factors_t*)data);
  73. flash_status_type status;
  74. uint8_t *ptr = data;
  75. flash_unlock();
  76. factors_sector_clear();
  77. for (uint32_t i = 0; i < size; i++)
  78. if ((status = flash_byte_program(baseAddress++, *data++)) != FLASH_OPERATE_DONE) {
  79. DBG printf("FLASH_ProgramByte error: status = %d\r\n", status);
  80. return false;
  81. }
  82. if ((status = flash_word_program((uint32_t)CRC_FACTOR, crc)) != FLASH_OPERATE_DONE) {
  83. DBG printf("FLASH_ProgramWord error: status = %d\r\n", status);
  84. }
  85. flash_lock();
  86. /* Считываем что записали */
  87. factors_read_from_flash(ptr, sizeof(factors_t));
  88. checkCrc = factors_get_crc((factors_t*)ptr);
  89. /* Проверяем CRC того что было записано */
  90. if ((checkCrc != crc) || (status != FLASH_OPERATE_DONE)) {
  91. return false;
  92. }
  93. return true;
  94. }
  95. //
  96. void factors_read_from_flash(uint8_t *data, uint32_t size)
  97. {
  98. uint32_t baseAddress = CALIBRATION_FACTOR_SECTOR;
  99. for (uint32_t i = 0; i < size; i++)
  100. *data++ = (*(uint32_t*)baseAddress++);;
  101. }
  102. //
  103. uint32_t factors_get_crc(factors_t *factors)
  104. {
  105. crc_data_reset();
  106. return crc_block_calculate((uint32_t*)factors, sizeof(factors_t)/4 - 1);
  107. }
  108. // Очистить сектор системных настроек
  109. void factors_sector_clear(void)
  110. {
  111. flash_status_type status;
  112. if ((status = flash_sector_erase(CALIBRATION_FACTOR_SECTOR)) != FLASH_OPERATE_DONE) {
  113. DBG printf("Calibration factors. Erase sector error: %d\r\n", status);
  114. }
  115. }
  116. #endif