Files
@ 8e1189ce73af
Branch filter:
Location: therm/flash.c - annotation
8e1189ce73af
1.9 KiB
text/plain
Fixed settings save and restore in flash
c0c52bad69d7 c0c52bad69d7 c0c52bad69d7 c0c52bad69d7 c0c52bad69d7 235f584ead39 c0c52bad69d7 c0c52bad69d7 235f584ead39 30d4d968a3a1 c0c52bad69d7 8e1189ce73af 235f584ead39 c0c52bad69d7 c0c52bad69d7 c0c52bad69d7 c0c52bad69d7 235f584ead39 c0c52bad69d7 c0c52bad69d7 c0c52bad69d7 8e1189ce73af c0c52bad69d7 c0c52bad69d7 8e1189ce73af 235f584ead39 8e1189ce73af 8e1189ce73af 8e1189ce73af 8e1189ce73af 8e1189ce73af 8e1189ce73af 8e1189ce73af 235f584ead39 c0c52bad69d7 8e1189ce73af 8e1189ce73af 8e1189ce73af 235f584ead39 8e1189ce73af 8e1189ce73af 8e1189ce73af 8e1189ce73af 8e1189ce73af 8e1189ce73af 8e1189ce73af 8e1189ce73af 8e1189ce73af c0c52bad69d7 c0c52bad69d7 c0c52bad69d7 235f584ead39 c0c52bad69d7 235f584ead39 c0c52bad69d7 c0c52bad69d7 8e1189ce73af 8e1189ce73af 235f584ead39 235f584ead39 8e1189ce73af 8e1189ce73af 235f584ead39 235f584ead39 235f584ead39 c0c52bad69d7 235f584ead39 c0c52bad69d7 8e1189ce73af 8e1189ce73af 8e1189ce73af 8e1189ce73af 8e1189ce73af 8e1189ce73af c0c52bad69d7 c0c52bad69d7 c0c52bad69d7 c0c52bad69d7 c0c52bad69d7 c0c52bad69d7 c0c52bad69d7 | #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
|