STM32G070xx将Flash页分块方式存储,固定数据块存储,实现一次擦除多次写入

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) //64

#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) //16



#pragma pack(1)

typedef struct
{
   
   
    u16 HeaderTag;  /* 头部标记 */
    u16 StoreIndex; /* 存储索引 */
}FlashStoreHeader, * FlashStoreHeader_t;

typedef struct
{
   
   
    FlashStoreHeader  Header;
    ............ /* 用户定义数据1 */ 
    ............ /* 用户定义数据2 */ 

    u8 ubRes[23]; /* 块大小对齐 */
    u8 ubCRC8;    /* 校验和 */
}DemarParam_TypeDef, * DemarParam_TypeDef_t;

typedef struct
{
   
   
    FlashStoreHeader  Header;
    ............ /* 用户定义数据1 */ 
    ............ /* 用户定义数据2 */ 

    u8 ubRes[9]; /* 块大小对齐 */
    u8 ubCRC8;   /* 校验和 */
}OperatParam_TypeDef, * OperatParam_TypeDef_t;

typedef struct
{
   
   
    OperatParam_TypeDef Operat; /* 操作存储区 共32字节 */
    DemarParam_TypeDef  Demar;  /* 标定存储区 共128字节 */
}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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值