学习 stm32 FATFS 文件的日常操作,本次通过SDIO模式进行存储卡的设备连接,进行数据的读取操作。之前介绍过一起SD卡的读取操作,
stm32 SD(SDSC)卡的学习与SPI 模式应用(卡槽介绍),无论SPI模式或者SDIO模式都是设备的连接识别。
第一步骤
模式1
SPI初始化SDK ,连接SD卡
stm32 SD(SDSC)卡的学习与SPI 模式应用(卡槽介绍),
模式2
SDIO初始化SDK ,连接SD卡
stm32 SD(SDSC)卡的学习SDIO 模式连接SD卡
第二步骤,部署移植FATFS文件系统
学习 stm32 FATFS文件系统基础知识与示例应用
部署的项目结构图如下
00history.txt 介绍了 FatFs 的版本更新情况。
00readme.txt 说明了当前目录下 diskio.c 、 diskio.h、 ff.c、 ff.h、 integer.h 的功能。
diskio.c 文件是 FatFs 移植最关键的文件,它为文件系统提供了最底层的访问 SPI Flash芯片的方法, FatFs 有且仅有它需要用到与 SPI Flash 芯片相关的函数。
diskio.h 定义了FatFs 用到的宏,以及 diskio.c 文件内与底层硬件接口相关的函数声明。
源码文件功能简介如下:
integer.h:文件中包含了一些数值类型定义。
diskio.c:包含底层存储介质的操作函数,这些函数需要用户自己实现,主要添加底层驱动函数。
ff.c:FatFs 核心文件,文件管理的实现方法。该文件独立于底层介质操作文件的函数,利用这些函数实现文件的读写。
cc936.c:本文件在 option 目录下,是简体中文支持所需要添加的文件,包含了简体中文的 GBK 和 Unicode 相互转换功能函数。
ffconf.h:这个头文件包含了对 FatFs 功能配置的宏定义,通过修改这些宏定义就可以裁剪 FatFs 的功能。如需要支持简体中文,需要把 ffconf.h 中的_CODE_PAGE的宏改成 936 并把上面的 cc936.c 文件加入到工程之中。
下面是FATFS文件系统 0.11 版本的
链接:https://pan.baidu.com/s/1O6mXOkEvxQYMUuchSx4oWA
提取码:464c
–来自百度网盘超级会员V2的分享
关于FATFS 文件系统的配置后面会单独整理一下。
第三步骤,是本次的SD卡的操作
我们自己照一张sd,提前存储几个文件夹以及文件,方便自己去读卡操作。会列举一个函数的使用和查看参数手册,方便我们的理解和使用、
下面是常用的函数,回去单独使用,自己整理 方便理解
单一函数的使用例如下图所示例如f_open [英文手册打开谷歌浏览器,右键直接翻译中文方便阅读]
也可以在ff.c文件中查看该函数的参数以及说明如下图
选择模式
返回值
mode 的选择方式有多种根据需求去使用
FA_READ 指定对文件的读取权限。可以从文件中读取数据。
FA_WRITE 指定对文件的写访问权。数据可以写入文件。结合FA_READ进行读写访问。
FA_OPEN_EXISTING 打开一个文件。如果文件不存在,该函数将失败。(默认)
FA_CREATE_NEW 创建一个新文件。如果文件存在,该函数将失败并显示 FR_EXIST 。
FA_CREATE_ALWAYS 创建一个新文件。如果文件存在,它将被截断并覆盖。
FA_OPEN_ALWAYS 如果文件存在,则打开该文件。如果没有,将创建一个新文件。
FA_OPEN_APPEND 与FA_OPEN_ALWAYS相同,但读/写指针设置在文件末尾。
结合上面几张图,已经了解了用法操作。使用函数,设置参数,确定返回值
下面是我们在使用过程中如何去使用,上代码
FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode); /* Open or create a file */打开或创建一个文件
使用中我们可以分解参数
该函数有返回值吗,需接受,
FIL* fp 需要一个指针类型
path 文件地址路径
mode 选择操作的模式
示例如下
FIL fii; 定义指针fii
FRESULT res; //定义返回值
int main(){
//打开文件或者创建文件
res = f_open (&fii, "0:/kugou/log", FA_CREATE_ALWAYS); /* Open or create a file */
上下两种写法意义是一样的
res = f_open (&fii, "0:/kugou/log", 0x08); /* Open or create a file */
//支持或 "|" 操作如下说是,
//加入写操作,文件既可以读和写入内容
res = f_open (&fii, "0:/kugou/log", FA_CREATE_ALWAYS|FA_WRITE); /* Open or create a file */
res = f_open (&fii, "0:/kugou/log", 0x08|0x0); /* Open or create a file */
if(res==FR_OK)
{
//下面是返回值
FR_OK = 0, /* (0) Succeeded */
FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */
FR_INT_ERR, /* (2) Assertion failed */
FR_NOT_READY, /* (3) The physical drive cannot work */
FR_NO_FILE, /* (4) Could not find the file */
FR_NO_PATH, /* (5) Could not find the path */
FR_INVALID_NAME, /* (6) The path name format is invalid */
FR_DENIED, /* (7) Access denied due to prohibited access or directory full */
FR_EXIST, /* (8) Access denied due to prohibited access */
FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */
FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */
FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */
FR_NOT_ENABLED, /* (12) The volume has no work area */
FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */
FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any parameter error */
FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */
FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */
FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */
FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_SHARE */
FR_INVALID_PARAMETER /* (19) Given parameter is invalid */
}
}
官方例句如下
/* 读取一个文本文件并显示它 */
FATFS FATF; /* 逻辑驱动器的工作区(文件系统对象) */
int 主要(无效)
{
FIL 文件; /* 文件对象 */
char line[100]; /* 行缓冲区 */
FRESULT fr; /* FatFs 返回码 */
/* 给默认驱动器一个工作区 */
f_mount(&FatFs, "", 0);
/* 打开一个文本文件 */
fr = f_open (&fil, "message.txt", FA_READ);
如果(fr)返回(int)fr;
/* 读取每一行并显示它 */
while (f_gets(line, sizeof line, &fil)) {
printf(行);
}
/* 关闭文件 */
f_close(&fil);
返回0;
}
示例函数分享
f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* 将数据写入文件*/
FRESULT f_write (
FIL* fp , /* [IN] 指向文件对象结构的指针 */
const void* buff , /* [IN] 指向要写入的数据的指针 */
UINT btw , /* [IN] 要写入的字节数 * /
UINT* bw /* [OUT] 指向变量的指针,返回写入的字节数 */
);
示例如下
FIL fii;
FRESULT resback;
UINT back_con;
res = f_write (&fii, "test stm32f103x hello", 100, &back_con); /* Write data to a file */
f_close (FIL* fp); /* 关闭一个打开的文件*/
FRESULT f_close (
FIL* fp /* [IN] 指向文件对象的指针 */
);
示例如下
res = f_close (&fii);
f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* 从文件中读取数据 */
FRESULT f_read (
FIL* fp , /* [IN] 文件对象 */
void* buff , /* [OUT] 存储读取数据的缓冲区 */
UINT btr , /* [IN] 要读取的字节数 */
UINT* br /* [ OUT] 读取的字节数 */
);
FIL fii;
FRESULT resback;
UINT back_con;
char buff[100];
示例如下
f_read (&fii, buff, 100,&back_con); /* Read data from a file */
简单说明一下 读,写 打开,关闭等操作,
下面即使所有函数
FatFs 为应用程序提供了各种文件系统功能,如下所示。
文件访问
f_open - 打开/创建一个文件
f_close - 关闭一个打开的文件
f_read - 从文件中读取数据
f_write - 将数据写入文件
f_lseek - 移动读/写指针,扩展大小
f_truncate - 截断文件大小
f_sync - 刷新缓存数据
f_forward - 将数据转发到流
f_expand - 为文件分配一个连续的块
f_gets - 读取一个字符串
f_putc - 写一个字符
f_puts - 写一个字符串
f_printf - 写一个格式化的字符串
f_tell - 获取当前读/写指针
f_eof - 测试文件结束
f_size - 获取大小
f_error - 测试错误
目录访问
f_opendir - 打开一个目录
f_closedir - 关闭一个打开的目录
f_readdir - 读取目录项
f_findfirst - 打开一个目录并读取第一个匹配的项目
f_findnext - 读取下一个匹配的项目
文件和目录管理
f_stat - 检查文件或子目录是否存在
f_unlink - 删除文件或子目录
f_rename - 重命名/移动文件或子目录
f_chmod - 更改文件或子目录的属性
f_utime - 更改文件或子目录的时间戳
f_mkdir - 创建一个子目录
f_chdir - 更改当前目录
f_chdrive - 更改当前驱动器
f_getcwd - 检索当前目录和驱动器
卷管理和系统配置
f_mount - 注册/取消注册卷的工作区
f_mkfs - 在逻辑驱动器上创建一个 FAT 卷
f_fdisk - 在物理驱动器上创建分区
f_getfree - 获取卷上的可用空间
f_getlabel - 获取卷标
f_setlabel - 设置卷标
f_setcp - 设置活动代码页
期待大家的使用与问题讨论。
总结,学会部署fatfs 文件系统,以及使用该系统的函数api 方便与自己的工作。