FATFS文件系统函数
对于FATFS文件系统的相关函数,在FATFS中,都有详细的介绍和示例代码。链接地址如下:
FATFS 文件系统。
1 挂载函数f_mount
挂载函数用于将SD卡挂载到系统中。在官方网站上挂载函数的描述如下:
参数 | 含义 |
---|---|
FATFS * fs | 文件系统对象的指针 |
const TCHAR path | 逻辑驱动器号 “0:/” |
BYTE opt | 操作符: 0在第一次访问时挂载,1强制挂载以检查是否能够正常工作 |
在执行任何文件/目录操作之前,需要使用f_mount函数为逻辑驱动器注册文件系统对象。完成此过程后,文件/目录API函数即可开始工作。
官方的示例demo如下:可以看到挂载和取消挂载是和文件系统的指针和逻辑驱动号相关的。首先声明一个文件系统指针,然后为其动态开辟空间,开辟完空间后,进行挂载,在之后重新挂载以重新初始化文件系统。最后将取消挂载(将逻辑分区挂载到空,以取消挂载???),最后释放动态开辟的空间。
2 打开文件f_open
参数 | 含义 |
---|---|
FIL *fp | 指向空白文件对象的指针 |
const TCHAR * path | 指向以空值结尾的字符串的指针,该字符串指定要打开或创建的文件名,例如“img.bmp” |
BYTE MODE | 对文件操作的模式 |
其中对文件操作的模式有如下说明。这些操作模式还是比较熟悉的。
看一下示例demo就很容易理解这个函数了。这个示例demo中,又引出了这个对文件的读写的函数,那么接下来就看看这些读写函数。
/* Copy a file "file.bin" on the drive 1 to drive 0 */
int main (void)
{
FATFS fs0, fs1; /* Work area (filesystem object) for logical drives */
FIL fsrc, fdst; /* File objects */
BYTE buffer[4096]; /* File copy buffer */
FRESULT fr; /* FatFs function common result code */
UINT br, bw; /* File read/write count */
/* Gives work area to each logical drive */
f_mount(&fs0, "0:", 0);
f_mount(&fs1, "1:", 0);
/* Open source file on the drive 1 */
fr = f_open(&fsrc, "1:file.bin", FA_READ);
if (fr) return (int)fr;
/* Create destination file on the drive 0 */
fr = f_open(&fdst, "0:file.bin", FA_WRITE | FA_CREATE_ALWAYS);
if (fr) return (int)fr;
/* Copy source to destination */
for (;;) {
f_read(&fsrc, buffer, sizeof buffer, &br); /* Read a chunk of data from the source file */
if (br == 0) break; /* error or eof */
f_write(&fdst, buffer, br, &bw); /* Write it to the destination file */
if (bw < br) break; /* error or disk full */
}
/* Close open files */
f_close(&fsrc);
f_close(&fdst);
/* Unregister work area prior to discard it */
f_mount(0, "0:", 0);
f_mount(0, "1:", 0);
return (int)fr;
}
3 写文件f_write
参数 | 含义 |
---|---|
FIL *fp | 指向空白文件对象的指针 |
const void * buff | 要写入的缓冲buffer |
UINT btw | 要写入的字节数 |
UINT * bw | 返回一个写入了多少字节的信息到一个变量中,通过这个指针来传递 |
f_write这个函数就将buffefr中的数据,写入到文件中,通过btw(byte write)来指示要写入的数据的长度,通过返回的信号bw(verilog写多了的啥都是信号了哈哈哈哈)来指示写入了多少字节的数据。
还要关注函数的返回值,起始就是一个枚举,写入的状态的返回值就下面这机中见名知意了。
4 读取数据f_read
读取文件跟写入就是镜像关系了
5 指针移动函数f_lseek
该函数能够移动已经打开的文件的读写指针,也可以用来扩充文件。简单来说,就是将指针移动到下次要读写的位置。
参数 | 含义 |
---|---|
FIL *fp | 文件对象 |
FSIZE_t ofs | 偏移地址(DWORD(32bit) || QWORD(64bit) ) |
6 文件同步函数f_sync
文件同步函数能够将cache中的数据刷新到文件中,使用f_sync函数,能够在突发情况出现时,使文件中的数据,得以保存。