FEE简单来说就是Flash模拟EEPROM功能,本文对FEE做一个简要介绍。首先介绍一下FEE里面会出现的几个概念:
[Cluster]:Cluster为Fee中使⽤的虚拟存储器段,Cluster建⽴Fee与物理存储间的虚拟连接。它与DFlash物理Sector对应,⼀个Cluster应对应⼀个物理DFlash Sector,Fee中设置的Cluster长度应小于或等于DFlash物理Sector。
[Block]:Block为Fee基本存储单元,是Fee数据写⼊的最⼩结构,Block⻓度可根据应⽤需求自行定义
[ClusterGroup]:ClusterGroup为Fee中虚拟概念,⽤于关联Block及Cluster。ClusterGroup为Block的容器,⼀个或多个Block组成⼀个ClusterGroup。Fee代码以ClusterGroup为单位分配存储空间,同属⼀个ClusterGroup的所有Block共享一片存储空间。ClusterGroup中包含的Block数量需根据实际情况确定,但是⼀个ClusterGroup需分配⾄少两个Cluster。
[换页]:ClrID:簇的ID号,从1开始,数字越高表示当前簇有效,第一个有效簇所在的扇区写完后,簇的有效活动区再换到第二个簇,ID号变为2,这个换活动区的动作就叫做换页。
这⾥可以简单的评估⼀下各空间的寿命情况:
擦写次数=flash擦写次数×Cluster数量
MEFlash擦写次数为10w次、DflashSectorSize为1KB
ClusterGroup0:20个cluster 200w次
ClusterGroup1:10个cluster 100w次
ClusterGroup2:5个cluster 50w次
这⾥只是粗略的计算,实际上擦写次数还与BlockSize和Block数量有关系(同一个cluster里面可能会有多个block),Group中Block占⽤空间越⼩,擦写次数自然越多。
这里我终于也算是解决了我长久以来的一个疑问,flash的擦写寿命是10W次是flash自身的性质决定的,为什么说FEE的磨损均衡算法可以增加寿命呢,其实也是一种用空间换时间的妥协。
Fee模块记录的数据由两部分构成,分别为:
• Cluster信息:该信息描述当前该ClusterGroup当前所在Cluster(Sector)的信息,共计32Byte,固定写⼊在每个Cluster的前32Byte,Cluster擦除后第⼀次使⽤该Cluster时被写⼊。Cluster信息包括FeeCluster写⼊ID(4Byte)、Cluster起始地址(相对地址、4Byte)、Cluster⻓度(4Byte)、GroupHdr校验和(4Byte)以及Cluster有效标志(16Byte)。其中Cluster写⼊ID每次写⼊前递增1,因此当前ClusterGroup中,ID最⼤且标志有效的Cluster为当前活跃的Cluster(可执⾏Fee读、写等操作)。
• Block信息及数据:该部分数据为用户定义的Block数据及相关信息,Block数据及信息由2部分组成,包括:①用户EEPBlock数据信息(BlockHdr),共计32Byte,其中Block编号(2Byte)、Block数据⻓度(2Byte)、BlockData(4Byte)存储地址、Hdr校验和(4Byte)、Block数据ValidFlag(16Byte)以及预留4byte。②用户FeeBlock数据。
下图是一个cluster在flash中的实际情况:
1 | { |
前4个字节是ClrID:“05 00 00 00”由于是小端存储,即ClrID为5
Start address 起始地址的相对地址:“00 00 00 00”
Cluster⻓度(4Byte) “00 02 00 00”,即0x200,也就是上面配置的 .sectorSize=0x200
校验和(4Byte) “05 02 00 00”
后面16个字节都是Cluster有效标志
从0x0001 F020、0x0001 F040、0x0001 F060、0x0001 F080、0x0001 F0A0开始的32个字节都是Block信息
可以看到其中ID为1的Block只有1份,ID为2的Block则有4份,这部分我暂时没有做深入研究。
以其中的0x0001 F020为例:
Block编号(2Byte):1
Block数据⻓度(2Byte):4字节
BlockData(4Byte)存储地址:F8 01 00 00 即0x000001F8(相对地址)
Hdr校验和(4Byte):FD 01 00 00
下图是使用YCT工具中的FEE_demo的测试结果:
下面是一个典型设计案例:
- 需求:2K空间存储DTC
BLOCK:需要2K - CLUSTER:一个BLOCK空间,加上CLUSTER的Header标记等消耗空间,2K+,按2.5K考虑;
- CLUSTER需要至少存储一份预留一份换页用,那么一个CLUSTER最小配置5K;
- CLUSTER需要至少两倍空间做循环平衡磨损增加寿命,则至少需要10K空间;
- SECTOR:根据BLOCK和CLUSTER分配确定需要的物理空间,再按照在PFLASH或者DFLASH空间上进行物理分配,如上需要10K空间,ME芯片方案可以全部放到Dflash空间上;
下面补充一个在flash里面的概念:
RWW (read-while-write)特性的意思是在 Flash 执行擦写命令进入 Busy 状态期间(STS 寄存器 IDLE 位变状态 0)还能否继续响应非操作区域的读访问。
如果芯片不支持 RWW,擦写操作时需要关闭全局中断。
原理:支持 RWW 的芯片 Flash 物理存储中存在多个 Block 物理块。在擦写其中一个 Block 时,可以同时读取其他的Block 数据。
同理 NRWW(No Read-While-Write)的芯片,其 Flash 物理存储中只有一个 Block,因此不能边写边读。
https://blog.csdn.net/a571338923/article/details/144507127
https://mp.weixin.qq.com/s/CmBhcX2y8RT-3zIi2o-4ZQ
《YTM32B1HA0x_RM_v1.2》
《RTD_FEE_UM》
《Fee应用笔记 V0.1》
《AN_0062_EFM_ApplicationNote_zh_review》