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 自动选择合适的格式