在嵌入式开发中,经常需要对SD卡、U盘等存储设备进行读写操作。然而,直接操作底层硬件非常复杂。这时候,FatFS 库就派上用场了!本教程将带你从零开始学习如何在C语言项目中使用 FatFS 库,即使是编程新手也能轻松上手。
FatFS 是一个由日本工程师 ChaN 开发的开源、轻量级的 FAT 文件系统模块,专为小型嵌入式系统设计。它支持 FAT12、FAT16 和 FAT32 文件系统,具有以下优点:

在开始之前,请确保你已准备好以下内容:
1. 下载 FatFS 源码后,你会看到如下关键文件:
ff.h:主头文件ff.c:核心实现diskio.h:磁盘 I/O 层接口diskio.c:需用户实现的底层驱动模板ffconf.h:配置文件2. 将这些文件添加到你的工程目录中。
3. 修改 ffconf.h 配置(例如启用长文件名、设置代码页等):
#define _USE_LFN 3 /* 启用长文件名支持 */#define _MAX_LFN 255 /* 最大文件名长度 */#define _CODE_PAGE 936 /* 中文代码页(简体中文) */FatFS 本身不包含硬件驱动,你需要根据自己的硬件平台实现 diskio.c 中的几个函数:
disk_initialize():初始化 SD 卡disk_read():从 SD 卡读取数据块disk_write():向 SD 卡写入数据块disk_ioctl():控制命令(如获取扇区大小)以 STM32 为例,你可以使用 HAL 库或标准外设库编写 SPI 通信代码。这里是一个简化版的 disk_read 示例:
DRESULT disk_read ( BYTE pdrv, /* 物理驱动号 */ BYTE *buff, /* 数据缓冲区 */ LBA_t sector, /* 起始扇区 */ UINT count /* 扇区数量 */){ if (SD_ReadBlocks(buff, sector, count) == BSP_ERROR_NONE) { return RES_OK; } return RES_ERROR;}一切准备就绪后,就可以在主程序中使用 FatFS 提供的 API 了。下面是一个完整的示例:创建文件并写入文本。
#include "ff.h"int main(void){ FATFS fs; // 文件系统对象 FIL fil; // 文件对象 FRESULT res; // 函数返回值 UINT bw; // 实际写入字节数 // 挂载文件系统(逻辑驱动器 0) res = f_mount(&fs, "0:", 1); if (res != FR_OK) { // 挂载失败处理 while(1); } // 创建/打开文件 res = f_open(&fil, "0:/hello.txt", FA_CREATE_ALWAYS | FA_WRITE); if (res == FR_OK) { // 写入数据 f_write(&fil, "Hello, FatFS!\r\n", 16, &bw); f_close(&fil); } // 卸载文件系统 f_mount(NULL, "0:", 0); while(1);}这段代码展示了如何使用 FatFS 库完成基本的文件写入操作。常见的 API 还包括:
f_read():读取文件f_lseek():移动文件指针f_opendir() / f_readdir():遍历目录f_unlink():删除文件- 挂载失败(FR_DISK_ERR):检查 SD 卡是否插入、SPI 通信是否正常。
- 写入无效:确认 disk_write 是否正确实现,并且 SD 卡未写保护。
- 使用 f_printf 需要额外包含 ff_stdio.c 并配置 _USE_STRFUNC。
通过本教程,你应该已经掌握了如何在 C 语言项目中使用 FatFS 库 来操作 FAT 文件系统。无论是记录传感器数据、存储配置文件,还是播放音频文件,FatFS 都能为你提供稳定可靠的文件管理能力。
记住,关键在于正确实现底层磁盘驱动。一旦打通这一层,上层文件操作将变得异常简单。希望这篇 FatFS 教程 能帮助你在嵌入式开发中更高效地处理文件系统需求!
关键词回顾:FatFS库、C语言文件系统、嵌入式文件操作、FatFS教程。
本文由主机测评网于2025-12-03发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025122324.html