注:FATFS文件系统官方网址(内含各种函数具体功能及参数配置):
FATFS文件系统官方网址
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 数据类型的定义
准备工作:
1:给SD卡注册工作区
FATFS fs; //SD 卡逻辑驱动器的工作区
f_mount(&fs,“0:”,1); //为SD卡逻辑驱动器注册工作区
2:创建文件夹
f_mkdir(“0:\\shiyan”);//创建 (shiyan) 文件夹
第一步:创建文件
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);
}
第一步:打开文件
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]
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.