STM32G070xx将Flash页分块方式存储,固定数据块存储,实现一次擦除多次写入
参考例程
例程说明
- 本例程使用STM32G070xx芯片,Flash大小128KB。第125~126KB为操作存储区,地址0x0801F000 ~ 0x0801F7FF每块32字节;第127~128KB为标定存储区,地址0x0801F800 ~ 0x0801FFFF每块128字节
- Flash每页(2048字节)写满后再擦除。操作存储区分为64块,每块32字节,即写满64次擦除一次;标定存储区分为16块,每块128字节,即写满16次擦除一次
- 每块读写都有校验。读取时校验不通过表示数据异常,往前继续读取数据,直到校验通过为止
- 在写入Flash前。数据前后对比,只有数据发生变化才写入Flash中
- 每个存储区的块都有各自的头部标记
一、存储区数据结构

#define FLASH_STORE_OPERAT_PARM_PAGE (125)
#define FLASH_STORE_OPERAT_PARM_START_ADDRE (0x0801F000UL)
#define FLASH_STORE_OPERAT_PARM_HEADER_TAG (0x2A3D)
#define FLASH_STORE_OPERAT_PARM_BLOCK_SIZE (32)
#define FLASH_STORE_OPERAT_PARM_BLOCK_COUNT (u16)(FLASH_PAGE_SIZE / FLASH_STORE_OPERAT_PARM_BLOCK_SIZE)
#define FLASH_STORE_DEMAR_PARM_PAGE (127)
#define FLASH_STORE_DEMAR_PARM_START_ADDRE (0x0801F800UL)
#define FLASH_STORE_DEMAR_PARM_HEADER_TAG (0x6C5A)
#define FLASH_STORE_DEMAR_PARM_BLOCK_SIZE (128)
#define FLASH_STORE_DEMAR_PARM_BLOCK_COUNT (u16)(FLASH_PAGE_SIZE / FLASH_STORE_DEMAR_PARM_BLOCK_SIZE)
#pragma pack(1)
typedef struct
{
u16 HeaderTag;
u16 StoreIndex;
}FlashStoreHeader, * FlashStoreHeader_t;
typedef struct
{
FlashStoreHeader Header;
............
............
u8 ubRes[23];
u8 ubCRC8;
}DemarParam_TypeDef, * DemarParam_TypeDef_t;
typedef struct
{
FlashStoreHeader Header;
............
............
u8 ubRes[9];
u8 ubCRC8;
}OperatParam_TypeDef, * OperatParam_TypeDef_t;
typedef struct
{
OperatParam_TypeDef Operat;
DemarParam_TypeDef Demar;
}SystemParamStore_TypeDef, * SystemParamStore_TypeDef_t;
#pragma pack()
static SystemParamStore_TypeDef SystemStoreParam = {
0};
DemarParam_TypeDef * pStoreSysDemar = &SystemStoreParam.Demar;
OperatParam_TypeDef * pStoreSysOperat = &SystemStoreParam.Operat;
二、读取存储区数据
static u16 usGet_Flash_Read_Index(u16 page)
{
u32 startAddr = FLASH_STORE_DEMAR_PARM_START_ADDRE;
u16 blackSize = FLASH_STORE_DEMAR_PARM_BLOCK_SIZE;
u16 headerTag = FLASH_STORE_DEMAR_PARM_HEADER_TAG;
u8 blackCount = FLASH_STORE_DEMAR_PARM_BLOCK_COUNT;
u8 len = XOFS(DemarParam_TypeDef , ubCRC8);
u16 dat = 0, i = 0;
u8 crc = 0;
if (page == FLASH_STORE_OPERAT_PARM_PAGE)
{
startAddr = FLASH_STORE_OPERAT_PARM_START_ADDRE;
blackSize = FLASH_STORE_OPERAT_PARM_BLOCK_SIZE;
headerTag = FLASH_STORE_OPERAT_PARM_HEADER_TAG;
blackCount = FLASH_STORE_OPERAT_PARM_BLOCK_COUNT;
len = XOFS(OperatParam_TypeDef , ubCRC8);
}
#if defined(DEBUG_RELEASE_VERSI