#include "settings.h" #include "cmsis_os.h" #include "config.h" #include CRC_HandleTypeDef hcrc; //volatile FLASH_Status FLASHStatus = FLASH_COMPLETE; settings_t settings; static FLASH_EraseInitTypeDef EraseInitStruct; // void settings_crc_init(void) { hcrc.Instance = CRC; hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE; hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE; hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE; hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_WORDS; HAL_CRC_Init(&hcrc); } // void HAL_CRC_MspInit(CRC_HandleTypeDef* hcrc) { if(hcrc->Instance==CRC) { __HAL_RCC_CRC_CLK_ENABLE(); } } // void HAL_CRC_MspDeInit(CRC_HandleTypeDef* hcrc) { if(hcrc->Instance==CRC) { __HAL_RCC_CRC_CLK_DISABLE(); } } // void settings_load(void) { uint32_t load_crc; // CRC из flash uint32_t new_crc; // CRC загруженной структуры настроек settings_read_from_flash((uint8_t*)&settings, sizeof(settings)); // Считываем CRC из флеш памяти load_crc = (*(uint32_t*)CRC_ADDRESS); // Рассчитываем CRC для структуры настроек new_crc = settings_get_crc(); // Если CRC не совпадают нужно прошивать дефолтные настройки if (load_crc != new_crc) { settings_set_def(); settings_save(); } } // void settings_save(void) { uint32_t baseAddress = SETTINGS_ADDR; uint32_t crc; uint32_t size = sizeof(settings) / 4; uint32_t *data = (uint32_t*)&settings; HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR); EraseInitStruct.TypeErase = FLASH_TYPEERASE_MASSERASE; EraseInitStruct.Banks = FLASH_BANK_1; //HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) FLASH_PageErase(SETTINGS_ADDR, FLASH_BANK_1); HAL_FLASH_Lock(); #if 0 vPortEnterCritical(); FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); FLASHStatus = FLASH_ErasePage(SETTINGS_ADDR); //crc = settings_get_crc(); FLASH_ProgramWord(CRC_ADDRESS, crc); for (uint32_t i = 0; i < size; i++) { FLASH_ProgramWord(baseAddress, *data++); baseAddress += 4; } FLASH_Lock(); vPortExitCritical(); #endif } // void settings_set_def(void) { memset(settings.fw_version, 0, 20); strcpy(settings.fw_version, FW_VERSION); settings.motor_speed = 50; settings.support_speed = 60; settings.temperature_threshold = 70; } // uint32_t settings_get_crc(void) { //CRC_ResetDR(); return HAL_CRC_Calculate(&hcrc, (uint32_t*)&settings, sizeof(settings)); //return CRC_CalcBlockCRC((uint32_t*)&settings, sizeof(settings)); } // void settings_read_from_flash(uint8_t *data, uint32_t size) { uint32_t baseAddress = SETTINGS_ADDR; for (uint32_t i = 0; i < size; i++) *data++ = (*(uint32_t*)baseAddress++); } // void settings_test(void) { }