91 lines
1.9 KiB
C
91 lines
1.9 KiB
C
#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));
|
||
|
||
|
||
|
||
|
||
|
||
|
||
}
|