diff --git a/flash.c b/flash.c --- a/flash.c +++ b/flash.c @@ -1,38 +1,31 @@ -#include "stm32f0xx_hal.h" -#include "ssd1306.h" -#include "stm32f0xx_hal_flash.h" #include "flash.h" __attribute__((__section__(".eeprom"))) uint16_t eeprom[512]; +#define MAGIC_NUMBER 0x0BAE static void __flash_write(therm_settings_t* tosave); - -#define EEPROM_MAGIC_INDEX 0 -#define EEPROM_MAGIC_VALUE 0xbeef - - void flash_save(therm_settings_t* tosave) { __flash_write(tosave); } - void flash_restore(therm_settings_t* torestore) { + //read flash and calculate checksum + uint16_t checksum = MAGIC_NUMBER; + uint16_t i; + for(i = 0; i < (sizeof(therm_settings_t)/2); i++) + { + torestore->data[i] = eeprom[i]; + checksum ^= torestore->data[i]; + } - if(eeprom[EEPROM_MAGIC_INDEX] == EEPROM_MAGIC_VALUE) - { - for(uint8_t i = 1; i <= 20; i++) { - torestore->data[i] = *(eeprom+i); - } - } - else { - // load default settings + //if checksum doesn't match, load default settings + if((checksum ^ eeprom[i+1]) != 0) { flash_load_defaults(torestore); } - } void flash_load_defaults(therm_settings_t* torestore) { @@ -43,19 +36,17 @@ void flash_load_defaults(therm_settings_ torestore->val.k_p = DEFAULT_K_P; torestore->val.k_i = DEFAULT_K_I; torestore->val.k_d = DEFAULT_K_D; + torestore->val.temp_offset = DEFAULT_TEMP_OFFSET; torestore->val.ignore_error = DEFAULT_IGNORE_ERROR; torestore->val.setpoint_brew = DEFAULT_SETPOINT_BREW; torestore->val.setpoint_steam = DEFAULT_SETPOINT_STEAM; } - static void __flash_write(therm_settings_t* tosave) { - // Erase mem + // Erase mem HAL_FLASH_Unlock(); - //TODO: add checksum instead of magic value - //TODO: change checksum to invalidate flash instead of erase? // Erase the FLASH pages FLASH_EraseInitTypeDef erase; erase.TypeErase = TYPEERASE_PAGES; @@ -63,19 +54,22 @@ static void __flash_write(therm_settings erase.NbPages = 1; uint32_t SectorError = 0; HAL_FLASHEx_Erase(&erase, &SectorError); - CLEAR_BIT(FLASH->CR, FLASH_CR_PER); - for(uint8_t i = 1; i <= (sizeof(therm_settings_t)/2); i++) + // write to flash and calculate the checksum + uint16_t checksum = MAGIC_NUMBER; + uint16_t i; + for(i = 0; i < (sizeof(therm_settings_t)/2); i++) { - HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, (uint32_t)(eeprom + i), tosave->data[i]); + HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, (uint32_t)&eeprom[i], tosave->data[i]); + checksum ^= tosave->data[i]; } - HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, (uint32_t)(eeprom + EEPROM_MAGIC_INDEX), EEPROM_MAGIC_VALUE); + // write the checksum + HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, (uint32_t)&eeprom[i+1], checksum); HAL_FLASH_Lock(); } - // vim:softtabstop=4 shiftwidth=4 expandtab