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


    最近因项目需要,做一个数据采集的单片机平台。需要移植 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

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

  • 相关阅读:
    All in One 你想知道的 hacker 技术都在这里
    5 个 Git 工作流,改善你的开发流程
    完全基于 Java 的开源深度学习平台,亚马逊的大佬带你上手
    感谢 Vue.js 拯救我这个前端渣渣,让 PowerJob 有了管理后台界面
    linux报错Loading mirror speeds from cached hostfile解决方法
    Linux使用mailx通过第三方SMTP发送邮件,带附件操作
    打包发送邮件
    springboot项目中使用设计模式一策略模式
    Spring Boot 开发 WebService 服务
    常见限流算法介绍(漏桶算法、令牌桶算法)及实现--待整理
  • 原文地址:https://www.cnblogs.com/citycomputing/p/6103889.html
Copyright © 2020-2023  润新知