Files
@ 7fc667dd7f38
Branch filter:
Location: therm-ng/src/system/flash.c - annotation
7fc667dd7f38
2.0 KiB
text/plain
Decent working pid
667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 72630eaa8151 2b4eb31dd8da 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 72630eaa8151 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 7fc667dd7f38 7fc667dd7f38 953c718ee4cf 953c718ee4cf 573011597aec 72630eaa8151 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 667b32311f8f 72630eaa8151 667b32311f8f 667b32311f8f 667b32311f8f 2b4eb31dd8da 2b4eb31dd8da 2b4eb31dd8da 2b4eb31dd8da 2b4eb31dd8da 2b4eb31dd8da | //
// Flash: Nonvolatile storage for settings / etc
//
#include "stm32f3xx_hal.h"
#include "flash.h"
#include "config.h"
// Takes up 1 page (1k size)
static __attribute__((__section__(".eeprom"))) uint16_t eeprom_emulation[512];
therm_settings_t settings;
therm_status_t status;
// Initialize flash and restore settings
void flash_init(void)
{
flash_restoresettings();
}
// Save settings to flash memory
void flash_savesettings()
{
// Unlock flash memory
HAL_FLASH_Unlock();
// Initialize eraser to erase one page of flash
FLASH_EraseInitTypeDef eraser =
{
.TypeErase = TYPEERASE_PAGES,
.PageAddress = eeprom_emulation,
.NbPages = 1,
};
uint32_t errvar = 0;
// Erase flash page
HAL_FLASHEx_Erase(&eraser, &errvar);
// Write new flash data
uint16_t writectr;
for(writectr = 0; writectr < 128; writectr++)// 128 bytes data
{
HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, eeprom_emulation+writectr,settings.data[writectr]);
}
// Write magic value to flash
HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, eeprom_emulation+FLASH_MAGIC_LOC,FLASH_MAGIC_VALUE);
// Lock flash memory
HAL_FLASH_Lock();
HAL_Delay(2);
}
// Restore configuration from flash memory, if any was previously saved
void flash_restoresettings(void)
{
// Check for magic flash value
if(eeprom_emulation[FLASH_MAGIC_LOC] == FLASH_MAGIC_VALUE)
{
// Read page of flash into settings structure
uint16_t readctr = 0;
for(readctr = 0; readctr < 128; readctr++)
{
settings.data[readctr] = eeprom_emulation[readctr];
}
}
// No data in flash! Set defaults here
else
{
settings.val.k_p = 100;
settings.val.k_i = 2;
settings.val.k_d = 0;
settings.val.windup_guard = 300;
settings.val.sensor_type = 1;
//torestore.values.can_id = 22;
}
}
// Accessor to retrieve settings structure
inline therm_settings_t* flash_getsettings(void)
{
return &settings;
}
inline therm_status_t* runtime_status(void)
{
return &status;
}
|