最近因项目需要,做一个数据采集的单片机平台。需要移植 FatFs 。现在把最后成果贴上来。

1、摘要

在 STM32 单片机上,成功移植 FatFs 0.12b,使用的 Nand Flash 芯片为 K9F2G08 。

特点: 系统配合 FatFs 实现了坏块管理,硬件ECC,软件 ECC 纠错

2、代码分析

2.1、擦写均衡分析

在create_chain 函数中实现,每次分配都由当前scl 指向的 free cluster 开始,逐块检查,是否有可用 cluster 存在。如果没有则取下一块,直到回到起始点,说明已经没有 free cluster 了。

因为每次都紧邻 scl 取 free cluster, 那么每次的起始 scl 值在哪里,就决定了擦写位置。

通过查看代码,很可惜,发现 scl 每次都重新从 1 开始查找 free cluster。所以,默认条件下,FatFs 不支持擦写均衡。

如果能把每次分配的cluster号记录下来,下次接着向后分配,则可实现擦写均衡。未来有时间再来实现吧。也许你现在就能实现哦,另忘了实现了分享一份给我。

2.2、坏块管理分析

通过2.1对create_chain 函数的分析,我们知道get_fat是完成真实的 free cluster的分配。而每次 get_fat 函数都会调用 move_window 函数实际的读入一次该 sector。所以,我们只需要在读取函数中,对坏块进行检查,返回 出错,则分配的 cluster 自动移到下一个。从而完成跳过坏块存储数据。

具体实现如下:

如果 FSMC_NAND_ReadSmallPage 检测到坏块,则 NAND_disk_read 返回 RES_ERROR。

2.3、STM32的硬件ECC

在FSMC_NAND_Init 函数中打开STM32的硬件ECC配置。如下红色字。

FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND;

FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable;

FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;

FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Enable;

FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_256Bytes;

FSMC_NANDInitStructure.FSMC_TCLRSetupTime = 0x00;

FSMC_NANDInitStructure.FSMC_TARSetupTime = 0x00;

FSMC_NANDInitStructure.FSMC_CommonSpaceTimingStruct = &p;

FSMC_NANDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;

这里使用的是 FSMC_ECCPageSize_256Bytes ,而 K9F2G08 的最小page 为 2048, 所以,我们在驱动中,会再把 2048 的page 页再分为8个256的小页面分别进行 ECC 运算。这样做的好处很明显,坏处就是加大了复杂度。具体实现参见 FSMC_NAND_WriteSmallPage和FSMC_NAND_ReadSmallPage 函数。

每次在硬件运算 ECC 开始时都需要打开ECC开关,算完一页后,又需要关闭开关。在读取ECC值之前还必须等待计算完毕。

while(FSMC_GetFlagStatus(FSMC_Bank2_NAND,FSMC_FLAG_FEMPT)==Bit_RESET);

做到这几条就可以通过 FSMC_GetECC 函数获取正确的 ECC 值了。

另外因为我们的计算特性,所以在坏块标志后特别加入了一个我们自定义的ECC标识。

2.4、ECC纠错

首先是 ECC 错误识别,代码如下:

说明:eccRd为存储时计算的ECC什值; eccCl 为当前运算的值。

eccXor 不为零时,说明检测到错误。再通过 FSMC_NAND_GetBitPosition 函数获得具体的出错bit的位置。具体算法请阅参考文献。

 

2.5、文件组成

FatFs 目录

+----  ffconf.h   对 FatFs 进行配置的文件

+----  ff.h

+----  ff.c       是 FatFs 的实现文件,擦写均衡在 create_chain 函数中已实现。

+----  ccsbcs.c   文件名支持英文

+----  cc936.c    文件名支技中文

+----  diskio.c   是 FatFs 与自定义驱动层的接口函数

+----  NandDisk.c 为自己实现的 NandFlash 匹配函数,坏块管理在这里实现。

BSP 目录

+----  fsmc_nand.h  对 K9F2G08 的各种参数定义

+----  fsmc_nand.c  实现硬件级别的读写驱动,STM32 的 硬件 ECC 在这里使用。还实现了 ECC 自动纠错

注:为了获得 64*2K 的擦除缓冲区,系统还使用了一块 SRAM 芯片,以支持 malloc 内存 分配函数。这个文件由你自己的系统提供。

3、引用文献

FatFs 系统

http://elm-chan.org/fsw/ff/00index_e.html

ECC 算法详细说明

http://www.360doc.com/content/11/0523/17/496343_118837985.shtml

STM32   ECC校验的一些心得

http://www.51hei.com/bbs/dpj-32707-1.html

最后如果想要下载程序的朋友请点这里:源程序下载

STM32下FatFs的移植,实现了坏块管理,硬件ECC,ECC纠错,并进行擦写均衡分析的更多相关文章

  1. nand flash坏块管理OOB,BBT,ECC

    转:http://www.cnblogs.com/elect-fans/archive/2012/05/14/2500643.html 0.NAND的操作管理方式 NAND FLASH的管理方式:以三 ...

  2. 【转】nand flash坏块管理OOB,BBT,ECC

    0.NAND的操作管理方式      NAND FLASH的管理方式:以三星FLASH为例,一片Nand flash为一个设备(device),1 (Device) = xxxx (Blocks),1 ...

  3. Nand Flash基础知识与坏块管理机制的研究

    概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次 ...

  4. BBM(Bad Block Management)坏块管理

    不管WL算法如何高明,在使用中都会碰到一个头痛的问题,那就是坏块,所以一个SSD必须要有坏块管理机制.何谓坏块?一个闪存块里包含有不稳定的地址,不能保证读/写/擦时数据的准确性.            ...

  5. nand flash 的oob 及坏块管理

    0.NAND的操作管理方式      NAND FLASH的管理方式:以三星FLASH为例,一片Nand flash为一个设备(device),1 (Device) = xxxx (Blocks),1 ...

  6. NAND Flash大容量存储器K9F1G08U的坏块管理方法

    转: http://www.360doc.com/content/11/0915/10/7715138_148381804.shtml 在进行数据存储的时候,我们需要保证数据的完整性,而NAND Fl ...

  7. 坏块管理(Bad Block Management,BBM)

    看了很多坏块管理的文章,加上自己的理解,把整个坏块管理做了个总结. 坏块分类 1.出厂坏块 又叫初始坏块,厂商会给点最小有效块值(NVB,mininum number of valid blocks) ...

  8. Oracle corrupt block(坏块) 详解

    转自:http://blog.csdn.net/tianlesoftware/article/details/5024966 一. 坏块说明 1.1 相关链接 在看坏块之前,先看几个相关的链接,在后面 ...

  9. Windows下将ImageMagick移植到Android平台

    Windows下将ImageMagick移植到Android平台 原文链接  http://www.pedant.cn/2014/06/18/imagemagick-ported-android/ I ...

随机推荐

  1. 分析-eclipse已经导入jar包了,但还是出现classNotFound异常

    场景:分析-eclipse已经导入jar包了,但还是出现classNotFound异常 分析--eclipse已经导入jar包了,但还是出现classNotFound错误 最近在做一个web项目时,由 ...

  2. Flink – window operator

      参考, http://wuchong.me/blog/2016/05/25/flink-internals-window-mechanism/ http://wuchong.me/blog/201 ...

  3. fatal error C1061: 编译器限制 : 块嵌套太深

    VisualStudio开发过程中碰到C1061报错,查了MSDN,文档说明如下 从说明中我们明白这是由于我们的代码块嵌套太深,超过了编译器的限制.但我理解为应该是同一个域内块的数量太多,超过了编译器 ...

  4. 从偶然的机会发现一个mysql特性到wooyun waf绕过题

    从偶然的机会发现一个mysql特性到wooyun waf绕过题 MayIKissYou | 2015-06-19 12:00 最近在测试的时候,偶然的机会发现了一个mysql的特性, 为啥是偶然的机会 ...

  5. js保留两位小数

    js保留两位小数四舍五入: (Math.floor(until_price*100)/100).toFixed(2);//会四舍五入   保留两位小数 且不四舍五入(三种方式,请用最后一种): var ...

  6. Golang Import使用入门

    我们在写Go代码的时候经常用到import这个命令用来导入包文件,而我们经常看到的方式参考如下: import( "fmt" ) 然后我们代码里面可以通过如下的方式调用 fmt.P ...

  7. struts2所有组件

    struts2所有组件(动作,结果,拦截器) 动作在框架中可作为MVC模式的模型.这个角色的主要职责是控制业务逻辑,动作使用execute()方法来实现这个功能. 这个方法中的代码应该只关注与请求相关 ...

  8. installing mysql,this may take a few minutes,hold on plz wdcp卡住解决办法

    centos6安装wdcp时make in progress卡住的解决办法 今天在一台centos6的vps上安装wdcp出现的这个问题,到安装程序滚动至下面这里时出现"卡死". ...

  9. Java提高篇——理解String 及 String.intern() 在实际中的应用

    1. 首先String不属于8种基本数据类型,String是一个对象.   因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ...

  10. Java多线程代码示例

    package algorithm; class Mythread extends Thread{ String name; public Mythread(String name){ this.na ...