123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- #include "at32f403a_407.h"
- #include "factors.h"
- #include "common_config.h"
- #include "sys_api.h"
- #include "sys_hal.h"
- #include "settings_api.h"
- #include <stdio.h>
- #if defined (MAI_12)
- #undef DBG
- #define DBG if(1)
- factors_t ai_factors;
- //
- void factors_load(factors_t *factors)
- {
- uint32_t load_crc;
- uint32_t new_crc;
- bool need_default = false;
-
- factors_read_from_flash((uint8_t*)factors, sizeof(factors_t));
-
- // Считываем CRC из флеш памяти
- load_crc = (*(uint32_t*)CRC_FACTOR);
-
- // Рассчитываем CRC для структуры настроек
- new_crc = factors_get_crc(factors);
-
- // Если CRC не совпадают нужно прошивать дефолтные настройки
- if (load_crc != new_crc)
- {
- DBG printf("Bad factors sector CRC. Factors defaults restored.\r\n");
- need_default = true;
- }
- // CRC совпала, проверяем контрольное слово если слово не совпадает
- // то это значит, что поплыла структура нстроек, прошиваем дефолт */
- else if (factors->control_word != SETTINGS_CONTROL_WORD)
- {
- DBG printf("Bad factors control word. Factors defaults restored.\r\n");
- need_default = true;
- }
-
- // Прошиваем дефолтные настройки если нужно
- if (need_default)
- {
- factros_set_default(factors);
- factors_save(factors);
- }
- //DBG sys_print(settings);
- }
- //
- void factros_set_default(factors_t *factors)
- {
- for (int i = 0; i < AI_COMMON_NUMBER; i++)
- {
- factors->factor_b[i] = 0.0;
- factors->factor_k[i] = 1.0;
- }
- factors->control_word = SETTINGS_CONTROL_WORD;
- }
- //
- bool factors_save(factors_t *factors)
- {
- bool ret = false;
-
- xSemaphoreTake(flash_mutex, portMAX_DELAY);
-
- ret = factors_write_to_flash((uint8_t*)factors, sizeof(factors_t));
-
- xSemaphoreGive(flash_mutex);
-
- return ret;
- }
- //
- bool factors_write_to_flash(uint8_t *data, uint32_t size)
- {
- uint32_t baseAddress = CALIBRATION_FACTOR_SECTOR;
- uint32_t checkCrc = 0;
- uint32_t crc = factors_get_crc((factors_t*)data);
- flash_status_type status;
- uint8_t *ptr = data;
-
- flash_unlock();
-
- factors_sector_clear();
-
- for (uint32_t i = 0; i < size; i++)
- if ((status = flash_byte_program(baseAddress++, *data++)) != FLASH_OPERATE_DONE) {
- DBG printf("FLASH_ProgramByte error: status = %d\r\n", status);
- return false;
- }
-
- if ((status = flash_word_program((uint32_t)CRC_FACTOR, crc)) != FLASH_OPERATE_DONE) {
- DBG printf("FLASH_ProgramWord error: status = %d\r\n", status);
- }
-
- flash_lock();
-
- /* Считываем что записали */
- factors_read_from_flash(ptr, sizeof(factors_t));
-
- checkCrc = factors_get_crc((factors_t*)ptr);
-
- /* Проверяем CRC того что было записано */
- if ((checkCrc != crc) || (status != FLASH_OPERATE_DONE)) {
- return false;
- }
-
- return true;
- }
- //
- void factors_read_from_flash(uint8_t *data, uint32_t size)
- {
- uint32_t baseAddress = CALIBRATION_FACTOR_SECTOR;
-
- for (uint32_t i = 0; i < size; i++)
- *data++ = (*(uint32_t*)baseAddress++);;
- }
- //
- uint32_t factors_get_crc(factors_t *factors)
- {
- crc_data_reset();
- return crc_block_calculate((uint32_t*)factors, sizeof(factors_t)/4 - 1);
- }
- // Очистить сектор системных настроек
- void factors_sector_clear(void)
- {
- flash_status_type status;
-
- if ((status = flash_sector_erase(CALIBRATION_FACTOR_SECTOR)) != FLASH_OPERATE_DONE) {
- DBG printf("Calibration factors. Erase sector error: %d\r\n", status);
- }
- }
- #endif
|