跳转至

FAT文件系统使用指南

FAT文件系统使用指南*

第一章 概述*

SDK 支持 sd 卡,sd nand flash 等大容量存储设备。

内部使用的文件系统是 FAT 文件系统,支持 FAT12,FAT16, FAT32。

特性 FAT12 FAT16 FAT32
簇地址大小 12 位 16 位 32 位(28 位有效)
最大存储设备大小 32 MB 2 GB 2 TB(理论最大 16 TB)
单个文件最大大小 32 MB 2 GB 4 GB
文件数量 4096 个簇(最多) 65536 个簇(最多) 最大约 268,435,456 个簇
主要应用 早期软盘和小型存储设备 小型存储设备(U盘、SD卡) 较大容量的U盘、SD卡

第二章 文件系统生成*

2.1 文件系统镜像生成*

使用开源的 genfatfs 工具,下载链接:http://yun.nationalchip.com:10000/l/IF2NmP

里面有编译生成好的,可以在windows下使用的 genfatfs.exe 工具。

Usage:     genfatfs   [fatfs_img] 
Args:    
    size:         Max image size(K, power of 1024)   
    src_dir:      input dir   
    fatfs_img:    output image filename, default: fatfs.img (optional) 

下面给出一个生成镜像文件的例子:

genfatfs.exe -s 16384 -i dir

工具使用的细节,可以看开源的资料或者通过help命令查看。

2.2 镜像文件烧录*

使用 bootx 下载镜像到 sd nand 或者 sd 卡上,需通过 sdpinmux 命令指定板级 sdio 管脚:

“ sdpinmux [clk] [cmd] [d0] [d1] [d2] [d3] [d4] ”

这里使用的是 gpio_id,烧录的时候请和硬件工程师确认好对应的 sdio 管脚。

// pad  gpio_id 
#define P0_0   0 
#define P0_1   1 
#define P0_2   2 
#define P0_3   3 
#define P0_4   4 
#define P0_5   5 
#define P0_6   6 
#define P0_7   7 
#define P1_0   8 
#define P1_1   9 
#define P1_2   10 
#define P1_3   11

gpio_id 在代码如下定义,可以在 platform\boards目录下对应板级的 board_config.h 里确认好。并记得修改为正确的管脚复用配置:

// SDIO
#define BOARD_HAS_SDIO    1
#define BOARD_SDIO_CLK_PIN    P2_7
#define BOARD_SDIO_CMD_PIN   P2_6
#define BOARD_SDIO_D0_PIN    P1_6
#define BOARD_SDIO_D1_PIN    P1_7
#define BOARD_SDIO_D2_PIN    P1_4
#define BOARD_SDIO_D3_PIN    P1_5
#define BOARD_SDIO_DETECT_PIN    UNUSED_PIN_ID

烧录命令和执行过程如下,操作方式和下载程序固件一样,按住板子boot键复位进入下载模式 :

❯ bootx -m auto -t s -c "sdpinmux 23 22 14 15 12 13;sddownload 0 fatfs.img" -d /dev/ttyUSB3 -r 2000000
Version : v1.9.2 (20240729)
NationalChip AIoT Download Tools
Copyright (C) 2001-2024 NationalChip Co., Ltd
ALL RIGHTS RESERVED!

downloading [1/2] : 
[==========][100%]
downloading [2/2] : 
[==========][100%]
----------------- Excute Command -----------------
[CMD] String : sdpinmux 23 22 14 15 12 13
[CMD] Result : SUCCESS
[CMD] String : sddownload 0 fatfs.img
[==========][100%]
[CMD] Result : SUCCESS

第三章 应用开发*

3.1 参考例程*

参考 app 使用 apus\apps\fatfs_sample

烧录固件进去,开机可以看到 FAT 文件系统加载成功。

Hello Apus: v1.2.1-1728525763, Bank: 0x2000
Chip Label: GX8302B-66c26614eaa03426
Build Target: fatfs_sample-rtthread-gx8302b_dev
Apus fatfs sample app
fatfs: sd block num=60452864, block size=512
mount fatfs ok!

3.2 应用开发*

可通过fatfs接口访问其中的目录和文件,提供了以下命令:

  • 遍历该分区卷所有目录和文件:
list_volume
  • 查看指定文件夹:
list_dir [dir_path("/")]
  • 读文件:
read_file <file_path>
  • 写文件:
write_file <file_path> [append(0|1)] [string]
  • 创建文件:
create_file <file_path> [always(0|1)]
  • 创建目录:
create_dir <dir_path>

测试样例:

msh >create_dir test
create dir ok: test
msh >list_dir
D---- 1980/00/00 00:00         0  test
   0 File(s),          0 bytes total,    1 Dir(s)
  16709632 bytes free
msh >create_file tttt
create file ok: tttt
msh >write_file tttt 1 12132321
write file ok: tttt, str: 12132321, len: 8
msh >read_file tttt
read file ok: tttt, str: 12132321, len: 8

3.3 格式化*

    static FATFS fs;
    FRESULT res;
    res = f_mount(&fs, "", 1);
      /* 如果没有文件系统就格式化创建创建文件系统 */
    if (res == FR_NO_FILESYSTEM) {
        printf("》SD卡还没有文件系统,即将进行格式化...\r\n");
        /* 格式化 */
        BYTE work[FF_MAX_SS];
        MKFS_PARM popt = {0};
        popt.fmt = FM_ANY;

        res = f_mkfs("", &popt, work, FF_MAX_SS);

        if (res == FR_OK) {
            printf("已成功格式化文件系统。\r\n");
            /* 格式化后,先取消挂载 */
            res = f_mount(NULL,"",1);
            /* 重新挂载 */
            res = f_mount(&fs,"",1);
        } else {
            printf("格式化失败 res: %d\r\n", res);
        }
    } else if (res == FR_OK) {
        printf("mount fatfs ok!\n");
    } else {
        printf("mount fatfs err: %d\n", res);
    }
  • FM_FAT (0x01):
强制使用 FAT12 或 FAT16 文件系统。FAT 文件系统的具体版本(FAT12 或 FAT16)由存储设备的大小决定:
FAT12:用于小容量存储设备(通常小于 32 MB)。
FAT16:用于容量在 32 MB 到 2 GB 之间的设备。
这个选项适合低容量存储设备或需要兼容老设备的场景。
  • FM_FAT32 (0x02):
强制使用 FAT32 文件系统。FAT32 是为更大容量存储设备设计的文件系统,通常用于 2 GB 以上的存储设备。
相较于 FAT16,FAT32 支持更大的存储设备,最多支持 2 TB。
推荐用于大容量 SD 卡、USB 闪存驱动器等。
  • FM_EXFAT (0x04):
强制使用 exFAT 文件系统。exFAT 是微软开发的文件系统,专为闪存存储器设计,支持的存储设备容量范围非常广泛(从 32 GB 到 128 PB),并且可以支持大于 4 GB 的单个文件。
exFAT 通常用于大容量 SDXC 卡和 USB 驱动器上,并且在某些现代系统中有较好的兼容性。
  • FM_ANY (0x07):
自动选择适合的文件系统格式。这个选项会根据存储设备的大小自动选择 FAT12、FAT16、FAT32 或 exFAT 文件系统。
如果你不确定要使用哪种文件系统,FM_ANY 是一个较好的选择,它会根据存储设备的大小决定最合适的格式。
  • FM_SFD (0x08):
这个选项表示创建“裸文件系统”(Super Floppy Disk, SFD),它不使用 MBR(主引导记录)分区表。
在这种情况下,文件系统数据直接从设备的第一个扇区开始。这个选项适合一些简单的存储设备,通常不推荐在现代存储设备上使用。

选择建议:

  • 小于 2 GB 的存储设备:建议使用 FM_FAT(FAT12 或 FAT16
  • 2 GB 到 32 GB 的存储设备:建议使用 FM_FAT32
  • 大于 32 GB 的存储设备:建议使用 FM_EXFAT(如果需要兼容 exFAT 的系统)
  • 不确定设备大小或希望自动选择:使用 FM_ANY 让 FatFs 自动选择合适的格式