Files
@ 9294a623e8e5
Branch filter:
Location: therm/flash.c - annotation
9294a623e8e5
2.0 KiB
text/plain
Added support for both heaters and coolers as well as thermostatic control
c0c52bad69d7 c0c52bad69d7 235f584ead39 c0c52bad69d7 45ee045c249f c0c52bad69d7 235f584ead39 30d4d968a3a1 c0c52bad69d7 c0c52bad69d7 235f584ead39 c0c52bad69d7 c0c52bad69d7 8e1189ce73af c0c52bad69d7 45ee045c249f 45ee045c249f 45ee045c249f 45ee045c249f 45ee045c249f 45ee045c249f 45ee045c249f 45ee045c249f c0c52bad69d7 45ee045c249f 45ee045c249f 8e1189ce73af 235f584ead39 8e1189ce73af 8e1189ce73af 8e1189ce73af 235f584ead39 8e1189ce73af 8e1189ce73af 8e1189ce73af 8e1189ce73af 8e1189ce73af 8e1189ce73af 45ee045c249f 8e1189ce73af 8e1189ce73af 8e1189ce73af c0c52bad69d7 c0c52bad69d7 235f584ead39 c0c52bad69d7 45ee045c249f c0c52bad69d7 c0c52bad69d7 235f584ead39 235f584ead39 8e1189ce73af 8e1189ce73af 235f584ead39 235f584ead39 235f584ead39 235f584ead39 c0c52bad69d7 45ee045c249f 45ee045c249f 45ee045c249f 45ee045c249f 8e1189ce73af 45ee045c249f 45ee045c249f 8e1189ce73af 8e1189ce73af 45ee045c249f 45ee045c249f c0c52bad69d7 c0c52bad69d7 c0c52bad69d7 c0c52bad69d7 c0c52bad69d7 c0c52bad69d7 | #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
|