#include "user_flash.h" /* 写入原始数据 ---------------------------------------------*/ HAL_StatusTypeDef flash_write_data(uint32_t addr, uint8_t *data, uint16_t size) { HAL_StatusTypeDef status = HAL_OK; uint32_t i; uint32_t write_addr = addr; FLASH_EraseInitTypeDef erase_init; uint32_t sector_error; // 1. 解锁Flash HAL_FLASH_Unlock(); // 2. 擦除目标扇区 erase_init.TypeErase = FLASH_TYPEERASE_SECTORS; erase_init.Sector = FLASH_USER_SECTOR; erase_init.NbSectors = 1; // 擦除1个扇区 erase_init.VoltageRange = FLASH_VOLTAGE_RANGE_3; // 根据电压范围选择 // 执行擦除操作 if (HAL_FLASHEx_Erase(&erase_init, §or_error) != HAL_OK) { status = HAL_ERROR; goto exit; } // 3. 写入数据 for (i = 0; i < size; i += 4) { // 以32位(4字节)为单位写入 uint32_t data_to_write = *(uint32_t *)(data + i); if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, write_addr, data_to_write) != HAL_OK) { status = HAL_ERROR; break; } write_addr += 4; // 地址递增 } exit: // 4. 锁定Flash HAL_FLASH_Lock(); return status; } /* 读取原始数据 ---------------------------------------------*/ void flash_read_data(uint32_t addr, uint8_t *data, uint32_t size) { memcpy(data, (uint32_t *)addr, size); }