|
@@ -6,9 +6,6 @@
|
|
|
|
|
|
CRC_HandleTypeDef hcrc;
|
|
|
|
|
|
-
|
|
|
-//volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;
|
|
|
-
|
|
|
settings_t settings;
|
|
|
|
|
|
static FLASH_EraseInitTypeDef EraseInitStruct;
|
|
@@ -22,7 +19,7 @@ void settings_crc_init(void)
|
|
|
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;
|
|
|
+ hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
|
|
|
HAL_CRC_Init(&hcrc);
|
|
|
}
|
|
|
|
|
@@ -56,7 +53,7 @@ void settings_load(void)
|
|
|
settings_read_from_flash((uint8_t*)&settings, sizeof(settings));
|
|
|
|
|
|
// Считываем CRC из флеш памяти
|
|
|
- load_crc = (*(uint32_t*)CRC_ADDRESS);
|
|
|
+ load_crc = (*(uint32_t*)GET_SETTINGS_CRC_ADDR(SETTINGS_PAGE));
|
|
|
|
|
|
// Рассчитываем CRC для структуры настроек
|
|
|
new_crc = settings_get_crc();
|
|
@@ -70,47 +67,83 @@ void settings_load(void)
|
|
|
|
|
|
|
|
|
//
|
|
|
-void settings_save(void)
|
|
|
+bool settings_save(void)
|
|
|
{
|
|
|
- uint32_t baseAddress = SETTINGS_ADDR;
|
|
|
- uint32_t crc;
|
|
|
- uint32_t size = sizeof(settings) / 4;
|
|
|
- uint32_t *data = (uint32_t*)&settings;
|
|
|
+ uint32_t addr = GET_PAGE_ADDR(SETTINGS_PAGE);
|
|
|
+ uint64_t *ptr = (uint64_t*)&settings;
|
|
|
|
|
|
- HAL_FLASH_Unlock();
|
|
|
+ taskENTER_CRITICAL();
|
|
|
|
|
|
- __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
|
|
|
-
|
|
|
- EraseInitStruct.TypeErase = FLASH_TYPEERASE_MASSERASE;
|
|
|
- EraseInitStruct.Banks = FLASH_BANK_1;
|
|
|
- //HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError)
|
|
|
+ HAL_FLASH_Unlock();
|
|
|
|
|
|
- FLASH_PageErase(SETTINGS_ADDR, FLASH_BANK_1);
|
|
|
+ settings_erase_page(SETTINGS_PAGE);
|
|
|
+
|
|
|
+ save_settings_attributes(SETTINGS_PAGE);
|
|
|
+
|
|
|
+ for (uint16_t i = 0; i < (sizeof(settings) / 8) + 1; i++)
|
|
|
+ {
|
|
|
+ if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr, *ptr) != HAL_OK)
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ addr += 8;
|
|
|
+ ptr++;
|
|
|
+ }
|
|
|
|
|
|
HAL_FLASH_Lock();
|
|
|
|
|
|
-#if 0
|
|
|
- vPortEnterCritical();
|
|
|
-
|
|
|
- FLASH_Unlock();
|
|
|
-
|
|
|
- FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
|
|
|
+ taskEXIT_CRITICAL();
|
|
|
|
|
|
- FLASHStatus = FLASH_ErasePage(SETTINGS_ADDR);
|
|
|
-
|
|
|
- //crc = settings_get_crc();
|
|
|
-
|
|
|
- FLASH_ProgramWord(CRC_ADDRESS, crc);
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+//
|
|
|
+bool save_settings_attributes(uint16_t page)
|
|
|
+{
|
|
|
+ uint32_t crc_addr = GET_SETTINGS_CRC_ADDR(page);
|
|
|
+ uint32_t crc;
|
|
|
+
|
|
|
+ crc = settings_get_crc();
|
|
|
|
|
|
- for (uint32_t i = 0; i < size; i++) {
|
|
|
- FLASH_ProgramWord(baseAddress, *data++);
|
|
|
- baseAddress += 4;
|
|
|
+ if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, crc_addr,
|
|
|
+ (uint64_t)crc) != HAL_OK) {
|
|
|
+ return false;
|
|
|
}
|
|
|
-
|
|
|
- FLASH_Lock();
|
|
|
|
|
|
- vPortExitCritical();
|
|
|
-#endif
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+//
|
|
|
+bool settings_erase_page(uint16_t page)
|
|
|
+{
|
|
|
+ uint32_t bank_number = 0;
|
|
|
+ uint32_t addr = 0;
|
|
|
+ uint32_t PAGEError = 0;
|
|
|
+
|
|
|
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
|
|
|
+
|
|
|
+ addr = GET_PAGE_ADDR(page);
|
|
|
+ bank_number = settings_get_bank(addr);
|
|
|
+
|
|
|
+ EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
|
|
|
+ EraseInitStruct.NbPages = 1;
|
|
|
+ EraseInitStruct.Page = page;
|
|
|
+ EraseInitStruct.Banks = bank_number;
|
|
|
+
|
|
|
+ if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+//
|
|
|
+uint32_t settings_get_bank(uint32_t addr)
|
|
|
+{
|
|
|
+ return FLASH_BANK_1;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -129,9 +162,8 @@ void settings_set_def(void)
|
|
|
//
|
|
|
uint32_t settings_get_crc(void)
|
|
|
{
|
|
|
- //CRC_ResetDR();
|
|
|
+ __HAL_CRC_DR_RESET(&hcrc);
|
|
|
return HAL_CRC_Calculate(&hcrc, (uint32_t*)&settings, sizeof(settings));
|
|
|
- //return CRC_CalcBlockCRC((uint32_t*)&settings, sizeof(settings));
|
|
|
}
|
|
|
|
|
|
|