跳到主要内容

STM32 FATFS基础

介绍

FATFS是一个轻量级的文件系统模块,专为嵌入式系统设计,支持FAT12、FAT16和FAT32文件系统。在STM32微控制器上,FATFS可以帮助我们轻松管理SD卡、USB存储设备等外部存储介质上的文件。本文将介绍如何在STM32上使用FATFS模块,并通过实际案例展示其应用。

FATFS的基本概念

FATFS模块的核心是FATFS结构体和FIL结构体。FATFS结构体用于管理文件系统的状态,而FIL结构体则用于表示一个打开的文件。通过这两个结构体,我们可以进行文件读写、目录操作等基本功能。

初始化FATFS

在使用FATFS之前,我们需要初始化文件系统。以下是一个简单的初始化代码示例:

c
FATFS fs;
FRESULT res;

res = f_mount(&fs, "", 1); // 挂载文件系统
if (res != FR_OK) {
// 处理错误
}

打开和读取文件

一旦文件系统挂载成功,我们就可以打开并读取文件了。以下是一个读取文件的示例:

c
FIL fil;
UINT bytesRead;
char buffer[100];

res = f_open(&fil, "example.txt", FA_READ);
if (res == FR_OK) {
res = f_read(&fil, buffer, sizeof(buffer), &bytesRead);
if (res == FR_OK) {
// 处理读取的数据
}
f_close(&fil);
}

写入文件

写入文件的过程与读取类似。以下是一个写入文件的示例:

c
FIL fil;
UINT bytesWritten;
char buffer[] = "Hello, STM32 FATFS!";

res = f_open(&fil, "example.txt", FA_WRITE | FA_CREATE_ALWAYS);
if (res == FR_OK) {
res = f_write(&fil, buffer, sizeof(buffer) - 1, &bytesWritten);
if (res == FR_OK) {
// 写入成功
}
f_close(&fil);
}

目录操作

FATFS还支持目录操作,例如创建目录、列出目录内容等。以下是一个列出目录内容的示例:

c
DIR dir;
FILINFO fno;

res = f_opendir(&dir, "/");
if (res == FR_OK) {
while (f_readdir(&dir, &fno) == FR_OK && fno.fname[0]) {
// 处理目录项
}
f_closedir(&dir);
}

实际案例:数据记录器

假设我们正在开发一个数据记录器,需要将传感器数据定期写入SD卡中的CSV文件。以下是一个简单的实现:

c
void log_data(float temperature, float humidity) {
FIL fil;
UINT bytesWritten;
char buffer[50];

// 打开文件
res = f_open(&fil, "data.csv", FA_WRITE | FA_OPEN_APPEND);
if (res == FR_OK) {
// 格式化数据
snprintf(buffer, sizeof(buffer), "%.2f,%.2f\n", temperature, humidity);

// 写入数据
res = f_write(&fil, buffer, strlen(buffer), &bytesWritten);
if (res == FR_OK) {
// 写入成功
}
f_close(&fil);
}
}

在这个案例中,我们定期调用log_data函数,将温度和湿度数据写入CSV文件。通过FATFS,我们可以轻松管理文件系统,确保数据的可靠存储。

总结

FATFS是一个功能强大且易于使用的文件系统模块,非常适合在STM32等嵌入式系统中使用。通过本文的介绍,你应该已经掌握了FATFS的基本使用方法,包括文件读写、目录操作等。希望这些知识能帮助你在实际项目中更好地管理外部存储设备。

附加资源

练习

  1. 修改数据记录器案例,使其能够记录更多传感器数据(如气压、光照强度等)。
  2. 尝试在STM32上实现一个简单的文件浏览器,能够列出SD卡中的所有文件并显示文件大小。
  3. 研究FATFS的高级功能,如长文件名支持、多卷管理等,并在项目中应用这些功能。