Files
3d_contorl/Core/Bsp/bsp_flash.c
2026-03-21 01:49:41 +08:00

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);
}