#include "flash.h" #include "stm32f10x.h" #include typedef struct { uint32_t version; // 序号/标志位 uint32_t write_count; uint32_t error_count; float temperature; uint32_t crc32; // 最后一个成员:CRC校验 } FlashData_t; // 最后一页页号(从0开始) #define FLASH_PAGE_NUM 63 // 每页大小 #define FLASH_PAGE_SIZE 1024 // Flash起始地址 #define FLASH_BASE_ADDR 0x08000000 // 最后一页的地址 #define FLASH_LAST_PAGE_ADDR (FLASH_BASE_ADDR + FLASH_PAGE_NUM * FLASH_PAGE_SIZE) // 即:0x08000000 + 63 * 1024 = 0x0800FC00 #define FLASH_TARGET_ADDR ((uint32_t)FLASH_LAST_PAGE_ADDR) // 最后1KB起始地址 // 擦除对应页(1KB) void Flash_ErasePage(uint32_t page_addr) { FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); FLASH_ErasePage(page_addr); FLASH_Lock(); } // 写入结构体到 Flash(页擦除+按字写入) void Flash_WriteStruct(uint32_t addr, void* data, uint16_t size) { uint16_t i; uint32_t* pData = (uint32_t*)data; FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); FLASH_ErasePage(addr); // 注意:必须按页擦除 for (i = 0; i < (size + 3) / 4; i++) { // 以 4 字节为单位写入 FLASH_ProgramWord(addr + i * 4, pData[i]); } FLASH_Lock(); } // 从 Flash 读取结构体 void Flash_ReadStruct(uint32_t addr, void* data, uint16_t size) { memcpy(data, (void*)addr, size); } FlashData_t readData; void flash_Test(){ FlashData_t myData = { .write_count = 123, .error_count = 456, .temperature = 36.5f }; FlashData_t readData; // 写入结构体 Flash_WriteStruct(FLASH_TARGET_ADDR, &myData, sizeof(FlashData_t)); // 读取结构体 Flash_ReadStruct(FLASH_TARGET_ADDR, &readData,sizeof(FlashData_t)); }