| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- #include "settings.h"
- #include "cmsis_os.h"
- #include "config.h"
- #include <string.h>
- 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)
- {
- }
|