#include "flash.h" __attribute__((__section__(".eeprom"))) uint16_t eeprom[512]; #define MAGIC_NUMBER 0x0BAE static void __flash_write(therm_settings_t* tosave); 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 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) { 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.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 HAL_FLASH_Unlock(); // 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); // 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]); checksum ^= tosave->data[i]; } // write the checksum HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, (uint32_t)&eeprom[i+1], checksum); HAL_FLASH_Lock(); } // vim:softtabstop=4 shiftwidth=4 expandtab