factors.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "at32f403a_407.h"
  2. #include "factors.h"
  3. #include "common_config.h"
  4. #include <stdio.h>
  5. #if defined (MAI_12)
  6. #undef DBG
  7. #define DBG if(0)
  8. factors_t ai_factors;
  9. //
  10. bool factors_load(factors_t *factros)
  11. {
  12. #if 0
  13. uint32_t loadCRC; // CRC из flash
  14. uint32_t newCRC; // CRC загруженной структуры настроек
  15. bool need_default = false;
  16. if (!settings)
  17. return false;
  18. SYS_ReadFromFlash((uint8_t*)settings, sizeof(*settings), SYS_SECTOR);
  19. // Считываем CRC из флеш памяти
  20. loadCRC = (*(uint32_t*)SYS_CRC_ADDRESS);
  21. // Рассчитываем CRC для структуры настроек
  22. newCRC = SYS_GetCRC(settings);
  23. // Если CRC не совпадают нужно прошивать дефолтные настройки
  24. if (loadCRC != newCRC)
  25. {
  26. DBG printf("Bad system sector CRC. Factory defaults restored.\r\n");
  27. need_default = true;
  28. }
  29. // CRC совпала, проверяем контрольное слово если слово не совпадает
  30. // то это значит, что поплыла структура нстроек, прошиваем дефолт */
  31. else if (settings->control_word != SETTINGS_CONTROL_WORD)
  32. {
  33. DBG printf("Bad system sector control word. Factory defaults restored.\r\n");
  34. need_default = true;
  35. }
  36. // Прошиваем дефолтные настройки если нужно
  37. if (need_default)
  38. {
  39. sys_set_default(settings);
  40. sys_save(settings);
  41. }
  42. DBG sys_print(settings);
  43. return true;
  44. #endif
  45. }
  46. // Очистить сектор системных настроек
  47. void factors_sector_clear(void)
  48. {
  49. flash_status_type status;
  50. flash_unlock();
  51. if ((status = flash_sector_erase(CALIBRATION_FACTOR_SECTOR)) != FLASH_OPERATE_DONE) {
  52. DBG printf("Calibration factors. Erase sector error: %d\r\n", status);
  53. }
  54. flash_lock();
  55. }
  56. #endif