Files @ 8e1189ce73af
Branch filter:

Location: therm/flash.c

matthewreed
Fixed settings save and restore in flash
#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