完成flash对结构体的读写
This commit is contained in:
90
DEV/flash.c
Normal file
90
DEV/flash.c
Normal 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));
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user