/** * @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); }