一种简易的Nor flash存储数据机制

Nor Flash的特性如下:

擦除:将“0”变为“1”,擦除单位为 page或者sector。

写:只能将“1”变为“0”,写入单位为32 bits。

Serial Flash:内部集成了SPI接口的一种Nor Flash,一般应用为外部通过SPI接口与MCU连接,相对于片上Nor Flash通常容量较大(4~32M Bytes),设计为:

以Sector为单位进行擦除,以Page为单位进行编程。

而MCU片上Nor Flash通常容量较小(小于4M Bytes),设计为:

以page为单位进行擦除,以32位整字/16位半字/位为单位进行编程。

设计存储数据结构,可使用位域节省空间。

typedef struct _ st_sys_data_

{

    uint8_t b_v1            : 1;

    uint8_t b_v2              : 1;

uint8_t v3               : 2;   

} st_sys_data;

1. 设计数据开始跟结束标志,与sys_data存放在flash中的格式如下:

#define SYS_DATA_START_ID       0x12345678

#define SYS_DATA_END_ID         0x87654321

check_sum : 可以定义为校验和(8 bit/16bit/32bit)或者CRC或者异或运算等。

SYS_DATA_START_ID  + sys_data + check_sum  +SYS_DATA_END_ID 

2. 指定Flash的偏移地址与长度,用来初始化存储区域的地址与长度。

INT32 init_sys_data(UINT32 base_addr, UINT32 len)

{

         if((UINT_MAX == base_addr) ||(SYS_FLASH_SIZE<len)){

                   return ERR_FAILURE;

         }

     g_sys_data_base_addr = base_addr;

     g_sys_data_len = len;

    return SUCCESS;

}

3. 数据保存软件逻辑:

        1.)判定剩余空间是否足够存放sys_data(4+sys_data+4+checksum),如足够存放跳转到步骤3进行数据存储。

        2.)如空间不够,擦除该段空间。

        3.)依次存储start_id/sys_data/checksum/end_id

4. 数据加载软件逻辑:

  1. )判定数据偏移地址是否合法,若非法返回读取失败。
  2. )从数据偏移地址往回搜寻end_id,找到end_addr。
  3. )从end_addr往回搜寻start_id,找到start_addr。
  4. )判定end_addr/start_addr是否合法(其差值应该等于sys_data+checksum的长度)。
  5. )若合法读取sys_data及checksum。
  6. )计算sys_data的checksum并与读出的checksum校验,若校验通过则读取成功。

5. 应用层创建sys_data_back变量作为拷贝,当sys_data与sys_data_back不相同才调用数据保存流程。数据加载保持更新sys_data_back。

6. 该方案有断电丢失数据的风险。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值