0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何移植FatFs文件系统到SD卡内

jf_pJlTbmA9 来源:jf_pJlTbmA9 作者:jf_pJlTbmA9 2023-09-19 09:11 次阅读

在前面章节中介绍了使用MM32F3270的SDIO外设驱动SD卡,对SD卡识别和简单的数据读写验证,不过像这样直接操作SD卡存储单元,在实际应用中是不现实的。SD卡一般用来存放文件,所以都需要加载文件系统到里面。

FatFs 是一个通用的文件系统(FAT/exFAT)模块,用于在小型嵌入式系统中实现FAT文件系统。完全用标准C语言编写,所以具有良好的硬件平台独立性。可以移植到8051、PIC、AVR、SH、Z80、H8、ARM等系列单片机上而只需做简单的修改。它支持FATl2、FATl6和FAT32格式,支持多个存储媒介,具有独立的缓冲区,可以对多个文件进行读/写,并特别对8位单片机和16位单片机做了优化。

本章节主要介绍移植FatFs文件系统到SD卡内。

FatFs的特点

1)Windows兼容的FAT文件系统(支持FAT12/FAT16/FAT32)与平台无关,移植简单;

2)代码量少、效率高;

3)多种配置选项;

4)支持多卷(物理驱动器或分区,最多10个卷);

5)多个ANSI/OEM代码页包括DBCS;

6)支持长文件名、 ANSI/OEM 或Unicode;

7)支持RTOS

8)支持多种扇区大小;

9)只读、最小化的API和I/O缓冲区等。

FatFs源码获取

FatFs文件系统的源码可以从FatFs官网下载

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

此地址不仅仅包含资料包下载,还包括文件系统一些知识,包括函数说明,函数调用实例等。

wKgZomUD8cuAFTkdAABYxqJX0kk900.png

官网有对FatFs做详细的介绍,感兴趣可以多了解一些。所有版本的FatFs源码的移植步骤都是类似的,我们选择选择其中一个版本下载即可。

FatFs文件结构

解压之后可看到里面有 doc 和src 这两个文件。

其中doc文件夹里面是一些使用帮助文档,src是FatFs文件系统的源码。

FatFs的源代码主要包含几个文件:

diskio.c、 diskio.h、 ff.c、 ff.h、 integer.h文件。

其中diskio.c 这个文件是文件系统底层和SD驱动的中间接口的实现代码,移植的时候需要改写在diskio.h中声明的那几个函数,代码在ff.c中被调用;diskio.h定义了FatFs用到的宏;ff.c是一般FatFs的代码文件;ff.h是一般FatFs包含的头文件;integer.h是内部基本类型的定义。

option文件夹下是一些可选的外部c文件,包含了多语言支持需要用到的文件和转换函数。

00readme.txt 说明了当前目录下 diskio.c 、 diskio.h、 ff.c、 ff.h、 integer.h 的功能。

FatFs移植步骤

在工程目录下新建FatFs文件夹,并将src文件夹下的文件复制一份至该文件夹。

wKgZomUD8c2ADNhuAADOUabrU9k931.png
wKgaomUD8dGABXo4AAEGZ-eTmPc250.png

使用KEIL打开工程文件并添加FatFs组件,并将src文件夹下的ff.c、 diskio.c 和 cc936.c 三个文件加入FatFs组件中。

wKgZomUD8dKATkNKAAAgLjHjCCI835.png

加入cc936.c文件可以支持简体中文,同时需要把 ffconf.h 中的 _CODE_PAGE 的宏改成 936。

wKgaomUD8dSAEbvbAAAboBlrwus858.png

接着添加FatFs路径到工程选项。

wKgZomUD8dWAX8uKAABv34JCOG0549.png

此时进行编译,会发现提示错误。

编写FatFs接口函数

来看diskio.c文件,注释前面的几个头文件,这里要加入自己的头文件。下面的三个宏定义ATA、MMC、USB也可以改成想要的名称,可以改成SD并定义为0。

wKgaomUD8deAWFxTAACDw6tcSZI972.png

然后将函数disk_status、disk_initialize、disk_read、disk_write里面执行的代码注释或者删除,这里需要添加自己的代码。由于上面改了宏定义,这里switch-case也要做一些修改。

wKgaomUD8diAIiwgAABUq_CQGUU473.png

更改如下:

wKgZomUD8dqAZh10AAA0HxfrY5s102.png

对disk_initialize、disk_read、disk_write几个函数也这样更改。

再次编译,发现提示一个关于get_fattime的错误,get_fattime用来获取当前时间,如果不需要,在ffconf.h中的宏定义#define _FS_NORTC改为1关闭,如果需要这个功能,需要在diskio.c里面,实现get_fattime函数,加入如下代码即可。

wKgaomUD8duAcqA-AAAb-EtjbKw659.png

然后进行编译,这时错误就没有了。

至此我们已经完成FatFs文件管理系统的移植,不过功能还没有实现,需要在disk_status、disk_initialize、disk_read、disk_writ、disk_ioctl函数中加入执行代码:

设备状态获取

DSTATUS disk_status (
    BYTE pdrv       /* Physical drive number to identify the drive */
)
{
    DSTATUS stat;

    stat = disk.drv[pdrv]->disk_status(disk.lun[pdrv]);
    return stat;
}

设备初始化

DSTATUS disk_initialize (
    BYTE pdrv               /* Physical drive nmuber to identify the drive */
)
{
    DSTATUS stat = RES_OK;

    if(disk.is_initialized[pdrv] == 0) {
        disk.is_initialized[pdrv] = 1;
        stat = disk.drv[pdrv]->disk_initialize(disk.lun[pdrv]);
    }
    return stat;
}

读取扇区

DRESULT disk_read (
    BYTE pdrv,      /* Physical drive nmuber to identify the drive */
    BYTE* buff,     /* Data buffer to store read data */
    DWORD sector,           /* Sector address in LBA */
    UINT count      /* Number of sectors to read */
)
{
    DRESULT res;

    res = disk.drv[pdrv]->disk_read(disk.lun[pdrv], buff, sector, count);
    return res;
}

扇区写入

DRESULT disk_write (
    BYTE pdrv,      /* Physical drive nmuber to identify the drive */
    const BYTE* buff,   /* Data to be written */
    DWORD sector,       /* Sector address in LBA */
    UINT count          /* Number of sectors to write */
)
{
    DRESULT res;

    res = disk.drv[pdrv]->disk_write(disk.lun[pdrv], buff, sector, count);
    return res;
}

其他

DRESULT disk_ioctl (
    BYTE pdrv,      /* Physical drive nmuber (0..) */
    BYTE cmd,       /* Control code */
    void* buff      /* Buffer to send/receive control data */
)
{
    DRESULT res;

    res = disk.drv[pdrv]->disk_ioctl(disk.lun[pdrv], cmd, buff);
    return res;
}

审核编辑:彭菁

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动器
    +关注

    关注

    51

    文章

    7308

    浏览量

    142943
  • 数据
    +关注

    关注

    8

    文章

    6511

    浏览量

    87600
  • SD卡
    +关注

    关注

    2

    文章

    530

    浏览量

    63015
  • 文件系统
    +关注

    关注

    0

    文章

    273

    浏览量

    19676
收藏 人收藏

    评论

    相关推荐

    FatFS文件系统在STM32F4上的移植和应用

    在实现如U盘文件读写,SD卡的文件读写等工作时,我们往往需要一个文件系统来支持我们的工作。特别在一些MCU应用中,文件系统的加入能明显改善
    的头像 发表于 12-13 17:26 1692次阅读
    <b class='flag-5'>FatFS</b><b class='flag-5'>文件系统</b>在STM32F4上的<b class='flag-5'>移植</b>和应用

    转:基于KL26的SDFatfs文件系统移植

    本文主要讲解如何一直FatFs文件系统KL26上,实现SD文件建立,读写等功能。[size
    发表于 06-04 14:41

    关于STM32F405VET6移植FATFS文件系统,利用SDIO读写SD的问题

    本人目前正在利用STM32F407VET6移植FATFS文件系统通过SDIO读写SD,可是为什么总是
    发表于 06-13 21:56

    HAL库基于SPI驱动的SDFatfs文件系统SD初始化一直不成功

    最近在做fatfs文件系统移植的时候,SD初始化一直不成功。我是使用STM32CUBEMX生成的系统
    发表于 12-21 08:44

    32的sdFATFS文件系统是什么

    最近看了32的sdFATFS文件系统,现在就自己的理解总结一下。一、SD模块
    发表于 07-13 06:57

    FATFS文件系统如何移植工程

    STM32F103ZET6系统板、一个SPI接口的SD槽模块、一张SD工程完整源码下载地址
    发表于 08-24 06:34

    介绍移植fatfs文件系统步骤

    前言嵌入式系统中我们常常对flash、SD、U盘等进行操作,但我们操作一般是直接操作物理地址,使用起来相对来说比较繁琐,也不能将我们自己写的数据导出到我们的电脑中,这时大名鼎鼎的文件系统
    发表于 11-23 07:19

    FatFs文件系统的原理是什么?如何对FATFS进行移植

    FatFs文件系统的原理是什么?FatFs文件系统移植方法是什么?如何实现eMMC
    发表于 11-25 07:52

    探讨一下SDFATFS文件系统

    SD模块支持哪几种操作模式呢?如何对SD进行初始化呢?FATFS是什么意思?FATFS
    发表于 12-17 06:35

    灵动微课堂 (第194讲) | SDFatFs文件管理系统

    单片机做了优化。本章节主要介绍移植FatFs文件系统SD
    发表于 01-10 11:31

    如何使用STM32CubeMX移植FATFS文件系统SD

    本篇详细的记录了如何使用STM32CubeMX移植FATFS文件系统SD上。1. 准备工作硬
    发表于 03-01 07:45

    基于SD卡的FATFS文件系统的研究与应用_崔鹏伟

    基于SD卡的FATFS文件系统的研究与应用_崔鹏伟。
    发表于 04-14 16:46 40次下载

    Fatfs文件系统移植

    Fatfs文件系统移植)一、文件系统介绍二、移植条件、说明1、FatFs模块在可
    发表于 11-15 18:51 22次下载
    <b class='flag-5'>Fatfs</b>(<b class='flag-5'>文件系统</b>的<b class='flag-5'>移植</b>)

    文件系统FatFs文件系统在嵌入式芯片LPC18XX上的移植

    文件系统FatFs文件系统在嵌入式芯片LPC18XX上的移植
    发表于 12-04 10:51 12次下载
    【<b class='flag-5'>文件系统</b>】<b class='flag-5'>FatFs</b><b class='flag-5'>文件系统</b>在嵌入式芯片LPC18XX上的<b class='flag-5'>移植</b>

    基于STM32+CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试(下篇)

    四、移植FATFS文件系统前面第3章,完成了SDNAND的驱动代码编写,这一章节实现FATFS文件移植
    的头像 发表于 03-03 13:52 876次阅读
    基于STM32+CS创世 <b class='flag-5'>SD</b> NAND(贴片<b class='flag-5'>SD</b>卡)完成<b class='flag-5'>FATFS</b><b class='flag-5'>文件系统</b><b class='flag-5'>移植</b>与测试(下篇)