Fatfs(文件系统的移植)

一、文件系统介绍

FatFs是用于小型嵌入式系统的通用 FAT / exFAT文件系统模块。FatFs模块是按照 ANSI C(C89)编写的,并且与磁盘 I / O层完全分开。因此,它独立于平台。它可以并入资源有限的小型微控制器中,例如8051,PIC,AVR,ARM,Z80,RX等;FatFs是作者 ChaN开发的个人项目。官网

二、移植条件、说明

1、FatFs模块在可移植性方面设定了以下条件:

  • ANSI C
    FatFs模块是用ANSI C(C89)编写的中间件。只要编译器符合C89或更高版本,就没有平台依赖性。仅exFAT功能需要C99。
  • 整数类型的大小
    char类型的大小必须为 8位。
    int类型的大小必须为 16位或 32位。
    当 C标准为 C89时,short和 long的大小必须分别为 16位和 32位。
    在 C99或更高版本中时,使用 stdin .h获取整数大小。

2、数据类型说明

  • BYTE :8-bit unsigned integer → uint8_t
  • WORD : 16-bit unsigned integer →uint16_t
  • DWORD : 32-bit unsigned integer →uint32_t
  • QWORD : 64-bit unsigned integer → uint64_t
  • UINT : Alias of unsigned int used to specify any number → uint32_t
  • WCHAR : Alias of WORD used to specify a UTF-16 code unit.→uint16_t
  • TCHAR :Alias of char, WCHAR or DWORD used to specify a character encoding unit. →uint16_t
  • FSIZE_t : Alias of DWORD or QWORD used to address file offset and to specify file size. →uint32_t
  • LBA_t : Alias of DWORD or QWORD used to address sectors in LBA and to specify number of sectors. →uint32_t

3、系统框架

下面显示的依赖关系图是带有FatFs模块的嵌入式系统的典型配置,但不是特定的配置。
请添加图片描述

(a)如果提供了用于 FatFs的工作磁盘模块,则不需要其他任何东西。(b)为使现有磁盘驱动具有不同的接口,需要一些glue功能来转换fatf和驱动之间的接口。在这里插入图片描述

三、文件移植操作

1.首先前往官网下载(下载地址

这里使用的 R0.14目前最新的版本;
在这里插入图片描述

我们需要的是source文件夹,直接并入我们的工程就行了。

文件名 功能 说明
diskio.c Fatfs和 disk I/O模块接口层文件 与平台相关的代码,需要用户根据存储介质来编写函数
diskio.h Fatfs和 disk I/O模块公用的包含文件 不需要修改
ff.c Fatfs模块源码 不需要修改
ff.h Fatfs和应用模块公用的包含文件 不需要修改
ffconf.h Fatfs模块配置文件 需要根据需求来配置参数
ffunicode.c Fatfs所支持的字体代码转换表 不需要修改
ffsystem.c Fatfs的 OS相关函数示例代码 没用到
  • 这是添加到工程的结构

在这里插入图片描述

说明:mmc_sd.c实现的是SD卡底层的驱动。

四、接口的实现

Fatfs移植需要我们提供以下接口,而基本的接口,我们可以在官方提供的 diskio.c源文件中找到
在这里插入图片描述

在本例中,是接入 SD Card存储介质,因此,在 Fatfs文件系统包的 diskio.c源文件中添加对应的接口

从 diskio.c开端,我们可以看到以下宏定义

/* Definitions of physical drive number for each drive */
#define DEV_RAM		0	/* Example: Map Ramdisk to physical drive 0 */
#define DEV_MMC		1	/* Example: Map MMC/SD card to physical drive 1 */
#define DEV_USB		2	/* Example: Map USB MSD to physical drive 2 */

而 SD Card属于宏 DEV_MMC范畴内,在后面的接口函数中,我们只需要在与 DEV_MMC相关的位置上添加自己写的底层驱动,其他注释,例如
在这里插入图片描述

修改后的diskio.c

#include "ff.h"			/* Obtains integer types */
#include "diskio.h"		/* Declarations of disk functions */

#include "mmc_sd.h" //底层驱动文件

/* Definitions of physical drive number for each drive */
#define DEV_RAM		0	/* Example: Map Ramdisk to physical drive 0 */
#define DEV_MMC		1	/* Example: Map MMC/SD card to physical drive 1 */
#define DEV_USB		2	/* Example: Map USB MSD to physical drive 2 */

/*-----------------------------------------------------------------------*/
/* Get Drive Status                                                      */
/*-----------------------------------------------------------------------*/

DSTATUS disk_status (
                BYTE pdrv		/* Physical drive nmuber to identify the drive */
                )
{
   
    DSTATUS stat = STA_NOINIT;
    int result;

    switch (pdrv) {
   
    case DEV_RAM :
        return stat;

    case DEV_MMC :
        result = SD_disk_status();
        // translate the reslut code here
        if(1 == result)
            stat &= ~STA_NOINIT;

        return stat;

    case DEV_USB :
        return stat;
    }
    return STA_NOINIT;
}

/*-----------------------------------------------------------------------*/
/* Inidialize a Drive                                                    */
/*-----------------------------------------------------------------------*/

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

	switch (pdrv) {
   
	case DEV_RAM :
		return stat;

	case DEV_MMC :
		 result = SD_disk_initialize();
    
        if(1 == result)
            stat &= ~STA_NOINIT;
		return stat;

	case 
  • 16
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 硬件平台选择 首先,需要选择一个适合自己应用的硬件平台,可以根据自己的需求选择不同的平台,比如STM32、GD32、ESP32、Arduino等等。 在本文中,我们选择了GD32F303VCT6作为硬件平台。 2. FatFs库介绍 FatFs是一个轻量级的文件系统,支持FAT12、FAT16、FAT32等多种文件系统格式,可以在各种嵌入式系统中运行。FatFs提供了一组API函数,可以方便地对文件系统进行读写操作。 3. 移植步骤 步骤一:创建工程 首先,需要创建一个GD32的Keil工程,选择自己的芯片型号。然后,在工程目录下新建一个fatfs文件夹,用于存放FatFs库和相关的驱动代码。 步骤二:添加FatFs库 将FatFs库添加到工程中。可以在官网上下载最新的FatFs库,然后将其解压到fatfs文件夹下。 步骤三:配置FatFsfatfs文件夹下创建一个diskio.h文件,用于定义磁盘驱动接口。然后,在fatfs文件夹下创建一个ffconf.h文件,用于配置FatFs的一些参数,比如支持的文件系统格式、簇大小等等。 步骤四:实现磁盘驱动接口 在diskio.h文件中,定义以下磁盘驱动接口: ``` DSTATUS disk_initialize(BYTE pdrv); DSTATUS disk_status(BYTE pdrv); DRESULT disk_read(BYTE pdrv, BYTE *buff, DWORD sector, UINT count); DRESULT disk_write(BYTE pdrv, const BYTE *buff, DWORD sector, UINT count); DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff); ``` 这些接口函数需要在磁盘驱动文件中实现,比如SD卡驱动文件sdio_sd.c中就实现了这些接口函数。 步骤五:初始化FatFs 在main函数中,调用以下代码初始化FatFs: ``` FATFS fs; FRESULT res; res = f_mount(&fs, "", 1); if (res != FR_OK) { // mount failed } ``` 这段代码将FatFs挂载到默认的磁盘上,如果挂载失败,则说明磁盘不存在或者格式不支持。 步骤六:使用FatFs 使用FatFs的API函数对文件系统进行读写操作,比如: ``` FIL file; FRESULT res; res = f_open(&file, "file.txt", FA_READ); if (res != FR_OK) { // open failed } char buf[128]; UINT read_bytes; res = f_read(&file, buf, sizeof(buf), &read_bytes); if (res != FR_OK) { // read failed } f_close(&file); ``` 这段代码打开一个名为file.txt的文件,并读取其中的内容。 至此,FatFs文件系统移植工作完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值