115 lines
2.5 KiB
C
115 lines
2.5 KiB
C
/**
|
|
* @file bsp_flash.c
|
|
* @brief Flash storage driver implementation
|
|
*/
|
|
|
|
#include "bsp_flash.h"
|
|
#include "main.h"
|
|
|
|
/* Default settings */
|
|
static const system_settings_t default_settings = {
|
|
.fan_threshold = 30.0f,
|
|
.fan_mode = 1, // AUTO
|
|
.light_state = 0, // OFF
|
|
.valid = SETTINGS_VALID_FLAG
|
|
};
|
|
|
|
/**
|
|
* @brief Get Flash page address
|
|
*/
|
|
static uint32_t get_page_address(uint32_t addr)
|
|
{
|
|
return addr & 0xFFFFF800; // 2KB page alignment
|
|
}
|
|
|
|
/**
|
|
* @brief Erase Flash page
|
|
*/
|
|
static HAL_StatusTypeDef erase_page(uint32_t page_address)
|
|
{
|
|
FLASH_EraseInitTypeDef erase_init;
|
|
uint32_t page_error = 0;
|
|
|
|
HAL_FLASH_Unlock();
|
|
|
|
erase_init.TypeErase = FLASH_TYPEERASE_PAGES;
|
|
erase_init.PageAddress = page_address;
|
|
erase_init.NbPages = 1;
|
|
|
|
HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&erase_init, &page_error);
|
|
|
|
HAL_FLASH_Lock();
|
|
|
|
return status;
|
|
}
|
|
|
|
/**
|
|
* @brief Load settings from Flash
|
|
*/
|
|
bool BSP_Flash_LoadSettings(system_settings_t *settings)
|
|
{
|
|
if (settings == NULL) return false;
|
|
|
|
/* Read from Flash */
|
|
system_settings_t *flash_data = (system_settings_t *)SETTINGS_ADDR;
|
|
|
|
/* Check valid flag */
|
|
if (flash_data->valid == SETTINGS_VALID_FLAG)
|
|
{
|
|
settings->fan_threshold = flash_data->fan_threshold;
|
|
settings->fan_mode = flash_data->fan_mode;
|
|
settings->light_state = flash_data->light_state;
|
|
settings->valid = flash_data->valid;
|
|
return true;
|
|
}
|
|
|
|
/* No valid settings, use defaults */
|
|
*settings = default_settings;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @brief Save settings to Flash
|
|
*/
|
|
bool BSP_Flash_SaveSettings(const system_settings_t *settings)
|
|
{
|
|
if (settings == NULL) return false;
|
|
|
|
uint32_t page_addr = get_page_address(SETTINGS_ADDR);
|
|
|
|
/* Erase page first */
|
|
if (erase_page(page_addr) != HAL_OK)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
HAL_FLASH_Unlock();
|
|
|
|
/* Write data halfword by halfword */
|
|
uint16_t *src = (uint16_t *)settings;
|
|
uint32_t dst = SETTINGS_ADDR;
|
|
|
|
for (uint32_t i = 0; i < sizeof(system_settings_t) / 2; i++)
|
|
{
|
|
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, dst, *src) != HAL_OK)
|
|
{
|
|
HAL_FLASH_Lock();
|
|
return false;
|
|
}
|
|
dst += 2;
|
|
src++;
|
|
}
|
|
|
|
HAL_FLASH_Lock();
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @brief Reset settings to default
|
|
*/
|
|
void BSP_Flash_ResetSettings(void)
|
|
{
|
|
BSP_Flash_SaveSettings(&default_settings);
|
|
}
|