准备再单片机CH579上移植FATFS1.3方便数据管理,下面简单介绍一下移植注意事项和误区。

需要准备的材料有:

(1)FATFS文件系统源码FATFS1.3(点此下载最新FATFS源码)。

(2)单片机平台一个(CH579)。

(3)SPI_FLASH芯片一个(如:W25Q16)。

FATFS是一个通用的嵌入式文件系统,对不同的平台支持很好,大到硬盘、U盘、存储卡,小到spi_flash芯片甚至单片机内部FLASH都可以使用FATFS。今天我们就在一个2M大小的SPI_FLASH( W25Q16)上建立一个文件系统,主控制器是CH579单片机。在做文件系统移植前,你需要把操作SPI_FLASH的驱动调通,能读写SPI_FLASH就可以了。

第一步、 解压缩新下载的FATFS源码,看看里面都是些什么文件。如下图所示,红色框是移植FATFS所必须的文件,蓝色框内的文件是可选的移植文件。

diskio.c个diskio.h是和存储器读写控制相关的驱动接口,比如SPI_FLASH的读写函数接口,都要映射到这里面。必须的文件

ff.h和ff.h是FATFS的核心文件,必须的文件

ffconf.h是FATFS的配置文件,用来裁剪FATFS,必须的文件

integer.h是FATFS所用到的数据类型定义,用以兼容不同字长CPU,必须的文件

ffsystem.c是一些关于在带操作系统平台中,使用的示例,可选文件

ffunicode.c是万国码编码文件,文件里主要是大数组定义,假如你需要让文件名支持中文就需要这个文件,这个文件会使代码空间急剧变大,可选文件

第二步、 本次FATFS移植未使用操作系统,文件系统支持中文路径和名称,所以需要ff.c、ff.h、ffconf.h、diskio.c、diskio.h、ffunicode.c和integer.h这六个文件添加到工程中即可。如下图:

第三步 修改ffconf.h文件,来裁剪我们的FATFS,通过宏开关来去掉不用的功能,来精简文件系统。想知道每个宏的功能?(点击这里)

需要注意的是:由于我们此次移植支持了中文路径和名称,所以这个要设置这个宏    #define FF_CODE_PAGE936 /*936代表 简体中文*/

特别注意:下图的修改,FF_MAX_SS的值必须和FLASH的块的值一直,我在这里走了歪路,搞了半天,它默认的是512,网上其它文档没有提示这里的修改。

第四步 修改diskio.c 来映射我们的存储器读写控制接口,如下:

/*-----------------------------------------------------------------------*/
/* Low level disk I/O module skeleton for FatFs     (C)ChaN, 2016        */
/*-----------------------------------------------------------------------*/
/* If a working storage control module is available, it should be        */
/* attached to the FatFs via a glue function rather than modifying it.   */
/* This is an example of glue functions to attach various exsisting      */
/* storage control modules to the FatFs module with a defined API.       */
/*-----------------------------------------------------------------------*/
#include "ff.h"            /* Obtains integer types */
#include "diskio.h"        /* Declarations of disk functions */
#include "SPIFlash.H"

/* Definitions of physical drive number for each drive */
#define SPI_FLASH        0    /* Example: Map Ramdisk to physical drive 0 */
 
/*-----------------------------------------------------------------------*/
/* Get Drive Status                                                      */
/*-----------------------------------------------------------------------*/
 
DSTATUS disk_status (
    BYTE pdrv        /* Physical drive nmuber to identify the drive */
)
{

if(pdrv == SPI_FLASH) 
    {
        PRINT("!!!disk_status OK\r\n");
        return RES_OK; //Ö±½Ó·µ»ØOK¼´¿É
    }
    else
    {
    PRINT("!!!disk_status ERR\r\n");

return RES_PARERR;
    }
}
 
 
 
/*-----------------------------------------------------------------------*/
/* Inidialize a Drive                                                    */
/*-----------------------------------------------------------------------*/
 
DSTATUS disk_initialize (
    BYTE pdrv                /* Physical drive nmuber to identify the drive */
)
{
    if(pdrv == SPI_FLASH) 
    {
        SPIFlash_Init();//³õʼ»¯spi flash
        PRINT("!!!disk_initialize OK\r\n");
        return RES_OK;
    }
    else
    {
        PRINT("!!!disk_initialize ERR\r\n");

return RES_PARERR;
    }
}
 
 
 
/*-----------------------------------------------------------------------*/
/* Read Sector(s)                                                        */
/*-----------------------------------------------------------------------*/
 
DRESULT disk_read (
    BYTE pdrv,        /* Physical drive nmuber to identify the drive */
    BYTE *buff,        /* Data buffer to store read data */
    DWORD sector,    /* Start sector in LBA */
    UINT count        /* Number of sectors to read */
)
{
    DRESULT res;
    PRINT("disk_read---sector:%d,count:%d\r\n",sector,count);
    if(pdrv == SPI_FLASH) 
    {
        for(;count>0;count--)
        {
            
        ReadExternalFlash_SPI_DAN(sector*4096,4096,buff);//spi flashµÄ¶Áº¯Êý£¬×¢Òâ²ÎÊýÀàÐÍÒ»ÖÂ
            sector++;
            buff+=4096;
        }
        
        res = RES_OK; //ĬÈÏдÈëÕý³££¬¿ÉÒÔ¼Ó
    
        return res;
    }
    else
    {
        
        return RES_PARERR;
    }
}
 
 
 
/*-----------------------------------------------------------------------*/
/* Write Sector(s)                                                       */
/*-----------------------------------------------------------------------*/
 
DRESULT disk_write (
    BYTE pdrv,            /* Physical drive nmuber to identify the drive */
    const BYTE *buff,    /* Data to be written */
    DWORD sector,        /* Start sector in LBA */
    UINT count            /* Number of sectors to write */
)
{
    DRESULT res;
 PRINT("disk_write---sector:%d,count:%d\r\n",sector,count);
    if(pdrv == SPI_FLASH) 
    {
            for(;count>0;count--)
        {
            EraseExternal4KFlash_SPI(sector*4096);
         BlukWriteExternalFlash_SPI(sector*4096,4096,(uint8_t *)buff);//spi flashµÄдº¯Êý£¬×¢Òâ²ÎÊýÀàÐÍÒ»ÖÂ
        sector++;
            buff+=4096;
            
        }
         res=RES_OK;
        return res;
    }
    else
    {
    
        PRINT("!!!disk_write ERR\r\n");
        return RES_PARERR;
    }
}
 
 
 
/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions                                               */
/*-----------------------------------------------------------------------*/
 
DRESULT disk_ioctl (
    BYTE pdrv,        /* Physical drive nmuber (0..) */
    BYTE cmd,        /* Control code */
    void *buff        /* Buffer to send/receive control data */
)
{
    if (pdrv == SPI_FLASH)
    {
        switch (cmd) 
        {
         case CTRL_SYNC:
             return RES_OK;
 
         /* ÉÈÇøÊýÁ¿ 1024*1024*1024 =4 (MB) */
 
         case GET_SECTOR_COUNT:
          *(DWORD * )buff = 512;spi flashµÄ¿é´óСÊÇ4K Bytes
    //         *(DWORD * )buff = 8*1024;//W25Q16 ÓÐ512´óСΪ4k bytesµÄÉÈÇø
             return RES_OK;
 
         /* ÉÈÇø´óС*/
 
         case GET_SECTOR_SIZE :
     *(WORD * )buff = 4096;//spi flashµÄ¿é´óСÊÇ4K Bytes
            // *(WORD * )buff = 512;//spi flashµÄ¿é´óСÊÇ4K Bytes
             return RES_OK;
 
         /*¿é */
 
         case GET_BLOCK_SIZE :
              *(DWORD * )buff =1;
             return RES_OK;
             
         default:
              return RES_PARERR;
         }
    }
    else
    {
        
        PRINT("!!!disk_ioctl ERR\r\n");
        return RES_PARERR;
    }
}
DWORD get_fattime(void) {
//    DWORD time; 
    return 0;
}

这里面一定注意,FLASH读写函数驱动的调用。很关键,决定是否能移植成功。

fatfs移植和使用(在W25Q16上建立文件系统)相关推荐

  1. 在CF卡上建立文件系统和安装引导加载程序

    CF卡在嵌入式工控领域越来越多的被应用,如何在CF卡上构建嵌入式linux是开发中一个基础但非常重要的过程! 本文介绍在CF卡上建立用于PC104板卡上的根文件系统,着重介绍了针对CF卡的操作,至于具 ...

  2. centos7在分区上建立文件系统和挂载

    在上一篇博客中,我们只说了硬盘的分区,既然进行分区,那么我们就要知道如何使用这些分区,就是接下来的建立文件系统和挂载. mkfs(make filesystem)格式化,建立文件系统 可以看到各种文件 ...

  3. linux mkfs 分区,mkfs命令 – 在特定分区上建立文件系统

    在磁盘分区上创建ext2.ext3.ext4.ms-dos.vfat文件系统,默认情况下会创建ext2.mkfs用于在设备上构建Linux文件系统,通常是硬盘分区.文件要么是设备名称(例如/dev/h ...

  4. 基于SD卡的FatFs文件系统(FatFs移植到STM32)

    平台:STM32ZET6(核心板)+ST-LINK/V2+SD卡+USB串口线 工程介绍:主要文件在USER组中,bsp_sdio_sdcard.c,bsp_sdio_sdcard.h和main.c, ...

  5. 移植wxX11到开发板上

    最近几天由于工作安排,要将wxX11程序移植到arm开发板上.一连工作了好几天,终于可以在板子上显示出一个"X"号,并且可以运行wxWidgets里面的程序,算是成功了.现就一些步 ...

  6. FATFS 移植和配置分析

    0. FATFS FatFs 是用于小型嵌入式系统的通用 FAT/exFAT 文件系统模块. FatFs 模块是按照 ANSI C (C89) 编写的,与磁盘 I/O 层完全分离.因此,它独立于平台. ...

  7. SDIO协议梳理附SD卡读写以及FATFS移植实例

    文章列表 嵌入式各协议标准按照OSI模型的思路进行逐个梳理,文章列表如下: 串行通信&UART协议梳理附STM32平台采用DMA以UART方式收发不定长信息 I²C总线协议梳理附STM32平台 ...

  8. 【转】将 Linux 应用程序移植到 64 位系统上

    原文网址:http://www.ibm.com/developerworks/cn/linux/l-port64.html 随着 64 位体系结构的普及,针对 64 位系统准备好您的 Linux® 软 ...

  9. ubuntu上建立mini2440 qt编译环境

    参考mini2440手册,从5.3章开始建立交叉编译环境.跟着流程走,在设置环境变量的时候,发现ubuntu的root文件夹不可进入,修改权限进入修改.bashrc文件发现重启后不起作用.为了不每次开 ...

最新文章

  1. 嗯,挺全乎儿的,Spring Boot 多环境配置都在这儿了,你喜欢哪一种呢?
  2. gitpythonapi_GitPython 使用基础
  3. STORM_0001_用vmware拷贝出三个相同的ubuntu搭建小的zookeeper集群
  4. 一分钟学会Git操作流程
  5. 【学习笔记】深入理解js原型和闭包(11)——执行上下文栈
  6. 重采样和重分类的区别
  7. 基于JAVA+SpringBoot+Mybatis+MYSQL的医药进销存管理系统
  8. php 添加透明水印,php加水印的代码(支持半透明透明打水印,支持png透明背景)
  9. 最小路径问题_BFS
  10. 超仪电子 java面试_全靠这份阿里大佬的“Java进阶面试手册”助我收获蚂蚁金服offer!...
  11. 开发管理 -启动项目(转)
  12. 拓端tecdat|python用线性回归预测股票价格
  13. Python调用Matlab教程
  14. sip协议的超时机制
  15. 大数据、数据挖掘和机器学习,带了哪些业务价值?
  16. C++的 new 和 detele
  17. overflow属性 white-space属性 文本溢出 英文单词转换方式
  18. 7.Python3标准库--文件系统
  19. linux ps le hrtime,前端Tips#4 - 用 process.hrtime 获取纳秒级的计时精度
  20. 跨境电商:shopee虾皮哪个站点比较好,新手应该怎么选择

热门文章

  1. 计算机组成原理:DMA
  2. 新装的win10 系统突然出现有线网络自动掉线情况
  3. matlab的plot没有反应,用plot画图没有反应
  4. (六)播放暂停、下一曲、上一曲功能实现
  5. vsftp账号_关于VsFtp用户登录的几种认证方式
  6. 使用Excel导出XML格式文件
  7. 恶意app分析及防范
  8. 【mongoDB】mongoDB的正确的连接方式
  9. vue刷新页面如何保证路由不变_vue 刷新之后 嵌套路由不变 重新渲染页面的方法...
  10. 牛客练习赛20 托米历险记