# HG changeset patch # User matthewreed # Date 2015-12-22 22:39:09 # Node ID 45ee045c249f9b209b70638e4fd1ce931fc3dff0 # Parent 8e1189ce73afe96118c30fe0fe812f7b96e5a446 Added checksum to flash write and restore functions and load default settings diff --git a/config.h b/config.h --- a/config.h +++ b/config.h @@ -42,6 +42,7 @@ #define DEFAULT_K_P 10 #define DEFAULT_K_I 1 #define DEFAULT_K_D 1 +#define DEFAULT_TEMP_OFFSET 0 #define DEFAULT_IGNORE_ERROR 0 #define DEFAULT_SETPOINT_BREW 70 #define DEFAULT_SETPOINT_STEAM 70 diff --git a/display.c b/display.c --- a/display.c +++ b/display.c @@ -35,7 +35,7 @@ static uint8_t sw_right_last = 0; static uint8_t trigger_drawsetpoint = 1; static int16_t last_temp = 21245; static uint8_t goto_mode = MODE_HEAT; -static uint8_t reset_mode = RESET_RESET; +static uint8_t reset_mode = RESET_REBOOT; @@ -109,7 +109,7 @@ void display_process(therm_settings_t* s break; case MODE_RESET: status->state = STATE_RESET; - reset_mode = RESET_RESET; + reset_mode = RESET_REBOOT; break; #ifdef BOOTLOADER_SHORTCUT case MODE_BOOTLOADER: @@ -457,17 +457,21 @@ void display_process(therm_settings_t* s ssd1306_drawlogo(); switch(reset_mode) { - case RESET_RESET: + case RESET_DEFAULTS: { - ssd1306_drawstring("-> reset ", 1, 40); + ssd1306_drawstring("-> defaults ", 1, 40); } break; case RESET_BOOTLOADER: { - ssd1306_drawstring("-> bootloader", 1, 40); + ssd1306_drawstring("-> bootloader ", 1, 40); + } break; + case RESET_REBOOT: + { + ssd1306_drawstring("-> reboot ", 1, 40); } break; case RESET_EXIT: { - ssd1306_drawstring("-> exit ", 1, 40); + ssd1306_drawstring("-> exit ", 1, 40); } break; } @@ -484,13 +488,18 @@ void display_process(therm_settings_t* s bootloader_enter(); // Resets into bootloader status->state = STATE_RESET; // Just in case } break; - case RESET_RESET: + case RESET_DEFAULTS: { status->state = STATE_RESET; flash_load_defaults(set); flash_save(set); NVIC_SystemReset(); } break; + case RESET_REBOOT: + { + status->state = STATE_RESET; + NVIC_SystemReset(); + } break; case RESET_EXIT: { status->state = STATE_IDLE; diff --git a/flash.c b/flash.c --- a/flash.c +++ b/flash.c @@ -1,38 +1,31 @@ -#include "stm32f0xx_hal.h" -#include "ssd1306.h" -#include "stm32f0xx_hal_flash.h" #include "flash.h" __attribute__((__section__(".eeprom"))) uint16_t eeprom[512]; +#define MAGIC_NUMBER 0x0BAE 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) { + //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(eeprom[EEPROM_MAGIC_INDEX] == EEPROM_MAGIC_VALUE) - { - for(uint8_t i = 1; i <= 20; i++) { - torestore->data[i] = *(eeprom+i); - } - } - else { - // load default settings + //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) { @@ -43,19 +36,17 @@ void flash_load_defaults(therm_settings_ 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 + // 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; @@ -63,19 +54,22 @@ static void __flash_write(therm_settings 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++) + // 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]); + HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, (uint32_t)&eeprom[i], tosave->data[i]); + checksum ^= tosave->data[i]; } - HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, (uint32_t)(eeprom + EEPROM_MAGIC_INDEX), EEPROM_MAGIC_VALUE); + // write the checksum + HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, (uint32_t)&eeprom[i+1], checksum); HAL_FLASH_Lock(); } - // vim:softtabstop=4 shiftwidth=4 expandtab diff --git a/flash.h b/flash.h --- a/flash.h +++ b/flash.h @@ -2,6 +2,7 @@ #define FLASH_H #include "states.h" +#include "stm32f0xx_hal_flash.h" #define PAGE_SIZE ((uint16_t)0x400) #define END_ADDR 0x08007FFF diff --git a/ssd1306.c b/ssd1306.c --- a/ssd1306.c +++ b/ssd1306.c @@ -1,4 +1,3 @@ -#include "stm32f0xx_hal_conf.h" #include "ssd1306.h" // Write command to OLED diff --git a/ssd1306.h b/ssd1306.h --- a/ssd1306.h +++ b/ssd1306.h @@ -20,6 +20,8 @@ //#define SPI_SendByte(data) SPI_I2S_SendData(SPI1,data) //#define SPI_Wait() while(!(SPI1->SR&SPI_FLAG_TXE));while(SPI1->SR&SPI_FLAG_BSY); +#include "stm32f0xx_hal_conf.h" + void ssd1306_init(void); void ssd1306_drawchar(char ascii, unsigned char row, unsigned char xPos); void ssd1306_drawcharbig(char ascii, unsigned char row, unsigned char xPos); diff --git a/states.h b/states.h --- a/states.h +++ b/states.h @@ -1,6 +1,7 @@ #ifndef STATES_H #define STATES_H +#include "stm32f0xx_hal.h" #include "config.h" typedef struct { @@ -66,7 +67,8 @@ enum GOTO_MODE { }; enum RESET_MODE { - RESET_RESET = 0, + RESET_REBOOT = 0, + RESET_DEFAULTS, RESET_BOOTLOADER, RESET_EXIT, RESET_SIZE,