学习 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); 打开或创建一个文件
使用中我们可以分解参数
该函数有返回值吗,需接受,
FIL* fp 需要一个指针类型
path 文件地址路径
mode 选择操作的模式
示例如下
FIL fii; 定义指针fii
FRESULT res;
int main(){
res = f_open (&fii, "0:/kugou/log", FA_CREATE_ALWAYS);
上下两种写法意义是一样的
res = f_open (&fii, "0:/kugou/log", 0x08);
res = f_open (&fii, "0:/kugou/log", FA_CREATE_ALWAYS|FA_WRITE);
res = f_open (&fii, "0:/kugou/log", 0x08|0x0);
if(res==FR_OK)
{
FR_OK = 0,
FR_DISK_ERR,
FR_INT_ERR,
FR_NOT_READY,
FR_NO_FILE,
FR_NO_PATH,
FR_INVALID_NAME,
FR_DENIED,
FR_EXIST,
FR_INVALID_OBJECT,
FR_WRITE_PROTECTED,
FR_INVALID_DRIVE,
FR_NOT_ENABLED,
FR_NO_FILESYSTEM,
FR_MKFS_ABORTED,
FR_TIMEOUT,
FR_LOCKED,
FR_NOT_ENOUGH_CORE,
FR_TOO_MANY_OPEN_FILES,
FR_INVALID_PARAMETER
}
}
官方例句如下
FATFS FATF;
int 主要(无效)
{
FIL 文件;
char line[100];
FRESULT fr;
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 方便与自己的工作。
|