#include "stm32f0xx_hal.h" #include "ssd1306.h" #include "stm32f0xx_hal_flash.h" #include "flash.h" __attribute__((__section__(".eeprom"))) uint16_t eeprom[512]; 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) { 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 flash_load_defaults(torestore); } } void flash_load_defaults(therm_settings_t* torestore) { torestore->val.boottobrew = DEFAULT_BOOT_TO_BREW; torestore->val.temp_units = DEFAULT_TEMP_UNITS; torestore->val.windup_guard = DEFAULT_WINDUP_GUARD; torestore->val.k_p = DEFAULT_K_P; torestore->val.k_i = DEFAULT_K_I; torestore->val.k_d = DEFAULT_K_D; 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 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; erase.PageAddress = (uint32_t) eeprom; 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++) { HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, (uint32_t)(eeprom + i), tosave->data[i]); } HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, (uint32_t)(eeprom + EEPROM_MAGIC_INDEX), EEPROM_MAGIC_VALUE); HAL_FLASH_Lock(); } // vim:softtabstop=4 shiftwidth=4 expandtab