Files
UART_TEST_TOOL/DEV/flash.c

91 lines
1.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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));
}