完成flash对结构体的读写

This commit is contained in:
2025-07-25 09:09:18 +08:00
parent cc37b93f38
commit 484e828efe
18 changed files with 761 additions and 409 deletions

90
DEV/flash.c Normal file
View File

@@ -0,0 +1,90 @@
#include "flash.h"
#include "stm32f10x.h"
#include <string.h>
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));
}