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. 数据加载软件逻辑:
- )判定数据偏移地址是否合法,若非法返回读取失败。
- )从数据偏移地址往回搜寻end_id,找到end_addr。
- )从end_addr往回搜寻start_id,找到start_addr。
- )判定end_addr/start_addr是否合法(其差值应该等于sys_data+checksum的长度)。
- )若合法读取sys_data及checksum。
- )计算sys_data的checksum并与读出的checksum校验,若校验通过则读取成功。
5. 应用层创建sys_data_back变量作为拷贝,当sys_data与sys_data_back不相同才调用数据保存流程。数据加载保持更新sys_data_back。
6. 该方案有断电丢失数据的风险。