STM32利用FATFS文件系统给SD卡读写数据

STM32利用FATFS文件系统给SD卡读写数据

注:FATFS文件系统官方网址(内含各种函数具体功能及参数配置):
FATFS文件系统官方网址

1. 所需.c和.h文件

FATFS中的文件的作用如下:

ffconf.h FatFs模块的配置文件
ff.h FatFs的头文件,定义了几个关键的数据结构,并声明了很多函数
ff.c FatFs模块的实现,包括f_open()、f_read()、f_write()和f_close()等函数的实现
diskio.h 底层磁盘I/O模块的头文件
diskio.c 这个文件实现了一个操作底层存储设备的接口层,ff.c会调用这个文件中提供的接口,实现文件的读写,我们在移植过程中的重点工作就是实现这个文件中的几个接口
integer.h 数据类型的定义

2. 操作步骤

准备工作:
1:给SD卡注册工作区
FATFS fs; //SD 卡逻辑驱动器的工作区
f_mount(&fs,“0:”,1); //为SD卡逻辑驱动器注册工作区
2:创建文件夹
f_mkdir(“0:\\shiyan”);//创建 (shiyan) 文件夹

2.1 写入数据

第一步:创建文件
FIL File;
f_open(&File, “0:\\Shiyan\\tianqi.dat”, FA_OPEN_ALWAYS | FA_WRITE);//在文件夹 (shiayn) 下创建 (tianqi.dat) 文件
第二步:索引文件内部数据存储位置指针
f_lseek(&File, 0+i);//i为第i个数据存储位置,将数据指针指向数据要存储的位置//并提前扩展好需要的文件空间
第三步:写入数据
f_write(&File,data+i,1 , &bw);//写入数据
第四步:关闭文件
f_close(&File);

例:连续写入6个数据

void write_data(uint8_t *data)
{
	FIL File;
	UINT bw;
	int ret;
	char i;
	ret = f_open(&File, "0:\\Shiyan\\tianqi.dat", FA_OPEN_ALWAYS | FA_WRITE);    
	for(i=0;i<6;i++)
	{
		ret |= f_lseek(&File, 0+i);
		ret |= f_write(&File,data+i,1 , &bw);
	}
	ret |= f_close(&File);
}

或者

void write_data(uint8_t *data)
{
	FIL File;
	UINT bw;
	int ret;
	ret = f_open(&File, "0:\\Shiyan\\tianqi.dat", FA_OPEN_ALWAYS | FA_WRITE);
	ret |= f_lseek(&File, 6);//先扩展出6个字节的存储区
	ret |= f_lseek(&File, 0);//将数据指针移到文件起始位置
	ret |= f_write(&File,data,6 , &bw);//自动移动数据指针
	ret |= f_close(&File);
}

2.2 读出数据

第一步:打开文件
FIL File;
f_open(&File, “0:\Shiyan\tianqi.dat”, FA_OPEN_ALWAYS | FA_READ);//在文件夹 (shiayn) 下打开 (tianqi.dat) 文件
第二步:索引文件内部数据存储位置指针
f_lseek(&File, 0+i);//i为第i个数据存储位置,将数据指针指向数据要读取的位置
第三步:读取数据
f_read(&File,data+i,1 , &bw); //读出数据
第四步:关闭文件
f_close(&File);

例:连续读出6个数据

void read_data(uint8_t *data)
{
	FIL File;
	UINT bw;
	int ret;
	char i;
	ret = f_open(&File, "0:\\Shiyan\\tianqi.dat", FA_OPEN_ALWAYS | FA_READ);
	for(i=0;i<6;i++)
	{
		ret |= f_lseek(&File, 0+i);
		ret |= f_read(&File,data+i,1 , &bw); 
	}
	ret |= f_close(&File); 
}

或者

void read_data(uint8_t *data)
{
	FIL File;
	UINT bw;
	int ret;
	ret = f_open(&File, "0:\\Shiyan\\tianqi.dat", FA_OPEN_ALWAYS | FA_READ);
	ret |= f_lseek(&File, 0);
	ret |= f_read(&File,data,6 , &bw); //自动移动数据指针
	ret |= f_close(&File); 
}

写读数据

对SD卡进行数据写读

uint8_t data_wr[6]={1,2,3,4,5,6},data_re[6];
f_mount(&fs,"0:",1);     //为SD卡逻辑驱动器注册工作区
f_mkdir("0:\\shiyan");//创建 (shiyan) 文件夹
write_data(data_wr);//将数组data[6]中的数写入到shiyan文件夹下的tianqi.dat
read_data(data_re);//从shiyan文件夹下的tianqi.dat 读出刚才存入到SD卡的数据到data1[6]

3. 参考函数功能:

FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode);				/* Open or create a file */
//打开或创建一个文件
FRESULT f_close (FIL* fp);											/* Close an open file object */
//关闭文件
FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br);			/* Read data from a file */
//从文件里面读取数据
FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw);	/* Write data to a file */
//向文件里面写入数据
FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf);	/* Forward data to the stream */
FRESULT f_lseek (FIL* fp, DWORD ofs);								/* Move file pointer of a file object */
//移动文件内部数据指针到指定位置,或者扩展存储区
FRESULT f_truncate (FIL* fp);										/* Truncate file */
FRESULT f_sync (FIL* fp);											/* Flush cached data of a writing file */
FRESULT f_opendir (DIR* dp, const TCHAR* path);						/* Open a directory */
FRESULT f_closedir (DIR* dp);										/* Close an open directory */
FRESULT f_readdir (DIR* dp, FILINFO* fno);							/* Read a directory item */
FRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern);	/* Find first file */
FRESULT f_findnext (DIR* dp, FILINFO* fno);							/* Find next file */
FRESULT f_mkdir (const TCHAR* path);								/* Create a sub directory */
//创建一个子文件夹
FRESULT f_unlink (const TCHAR* path);								/* Delete an existing file or directory */
//删除存在的文件或文件夹
FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new);	/* Rename/Move a file or directory */
//重命名或移动文件(文件夹)
FRESULT f_stat (const TCHAR* path, FILINFO* fno);					/* Get file status */
FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask);			/* Change attribute of the file/dir */
FRESULT f_utime (const TCHAR* path, const FILINFO* fno);			/* Change times-tamp of the file/dir */
FRESULT f_chdir (const TCHAR* path);								/* Change current directory */
FRESULT f_chdrive (const TCHAR* path);								/* Change current drive */
FRESULT f_getcwd (TCHAR* buff, UINT len);							/* Get current directory */
FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs);	/* Get number of free clusters on the drive */
FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn);	/* Get volume label */
FRESULT f_setlabel (const TCHAR* label);							/* Set volume label */
FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt);			/* Mount/Unmount a logical drive */
//创建逻辑工作区
FRESULT f_mkfs (const TCHAR* path, BYTE sfd, UINT au);				/* Create a file system on the volume */
FRESULT f_fdisk (BYTE pdrv, const DWORD szt[], void* work);			/* Divide a physical drive into some partitions */
int f_putc (TCHAR c, FIL* fp);										/* Put a character to the file */
//写入一个字符型数据
int f_puts (const TCHAR* str, FIL* cp);								/* Put a string to the file */
//写入字符串
int f_printf (FIL* fp, const TCHAR* str, ...);						/* Put a formatted string to the file */
//写入标准化字符串
TCHAR* f_gets (TCHAR* buff, int len, FIL* fp);						/* Get a string from the file */
//从文件中获取字符串

参考资料

博客参考了以下博文和网站:
链接: https://blog.csdn.net/wangzhiqin365/article/details/107520906.
链接: http://elm-chan.org/fsw/ff/00index_e.html.

  • 10
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值