可用的文件,全部
This commit is contained in:
114
Core/Bsp/bsp_flash.c
Normal file
114
Core/Bsp/bsp_flash.c
Normal file
@@ -0,0 +1,114 @@
|
||||
/**
|
||||
* @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);
|
||||
}
|
||||
Reference in New Issue
Block a user