STM32F1开发指南笔记44----SPI FLASH 文件系统FatFs多功能测试

上个实验我们实现了FatFs的格式化、读文件和写文件功能,这个已经满足很多部分的运用需要。有时,我们需要更多的文件操作功能,FatFs还提供了不少的功能,比如设备存储空间信息获取、读写文件指针定位、创建目录、文件移动和重命名、文件或目录信息获取等等功能。我们接下来这个实验内容就是展示FatFs众多功能,提供一个很好的范例,以后有用到相关内容,参考使用非常方便。

本实验主要使用FatFs软件功能,不需要其他硬件模块,使用与FatFs移植实验相同硬件配置即可。
上个实验我们已经移植好了FatFs,这个例程主要是应用,所以简单起见,直接拷贝上个实验的工程文件,保持FatFs底层驱动程序,我们只改main.c文件内容,实现应用程序。

STM32F1开发指南笔记44----SPI FLASH 文件系统FatFs多功能测试

STM32F1开发指南笔记44----SPI FLASH 文件系统FatFs多功能测试

首先是设备存储信息获取,目的是获取设备总容量和剩余可用空间。f_getfree函数是设备空闲簇信息获取函数(一个簇由若干个扇区组成),有3个形参,第一个参数为逻辑设备编号,第二个参数为返回空闲簇数量,第三个参数为返回指向文件系统对象的指针。通过计算可得到设备总的扇区个数以及空闲扇区个数,对于SPI FLASH芯片我们设置每个扇区为4096字节大小。这样很容易就算出设备存储信息。

接下来是文件读写指针定位和格式化输入功能测试。文件定位在一些场合非常有用,比如我们需要记录多项数据,但每项数据长度不确定,但有个最长长度,我们就可以使用文件定位lseek函数功能把数据存放在规定好的地址空间上。当我们需要读取文件内容时就使用文件定位函数定位到对应地址读取。
使用文件读写操作之前都必须使用f_open函数打开文件,打开文件时读写指针是在文件起始位置的,马上写入数据的话会覆盖原来文件内容的。这里,我们使用f_lseek函数定位到文件末尾位置,再写入内容。f_lseek函数有2个形参,第一个参数为文件对象指针,第二个参数为需要定位的字节数,这个字节数是相对文件起始位置的,比如设置为0,则将文件读写指针定位到文件起始位置了,设置为 f_size(&fnew)-1,则将文件读写指针定位到文件末尾了。

f_printf函数是格式化写入函数,需要把ffconf.h文件中的_USE_STRFUNC配置为1才支持。f_printf函数用法类似C库函数printf函数,只是它将数据直接写入到文件中。

最后是目录创建和文件移动和重命名功能。使用f_opendir函数可以打开路径(这里不区分目录和路径概念,下同),如果路径不存在则返回错误,使用f_closedir函数关闭已经打开的路径。新版的FatFs支持相对路径功能,使路径操作更加灵活。f_opendir函数有2个形参,第一个参数为指向路径对象的指针,第二个参数为路径。f_closedir函数只需要指向路径对象的指针一个形参。
f_mkdir函数用于创建路径,如果指定的路径不存在就创建它,创建的路径存在形式就是文件夹。f_mkdir函数只要一个形参,就是指定路径
f_rename函数是带有移动功能的重命名函数,它有2个形参,第一个参数为源文件名称。第二个参数为目标名称。目标名称可附带路径,如果路径与源文件路径不同就移动文件到目标路径下。

STM32F1开发指南笔记44----SPI FLASH 文件系统FatFs多功能测试

f_stat函数用于获取文件的属性,有2个形参,第一个参数为文件路径,第二个参数为返回指向文件信息结构体变量的指针。文件信息结构体变量包含文件的大小、最后修改时间和日期、文件属性、短文件名以及长文件名等信息。

STM32F1开发指南笔记44----SPI FLASH 文件系统FatFs多功能测试

STM32F1开发指南笔记44----SPI FLASH 文件系统FatFs多功能测试

scan_files函数用来扫描指定路径下的文件。比如我们设计一个mp3播放器,我们需要提取mp3格式文件,诸如*.txt、.c文件我们统统不要,这时我们就必须扫描路径下所有文件并把.mp3或*.MP3格式文件提取出来。这里我们不是提取特定格式文件,而是把所有文件名称都通过串口打印出来。

我们在ffconf.h文件中定义了长文件名称支持(_USE_LFN=2),一般有用到简体中文文件名称的都要长文件名支持。短文件名称是8.3格式,即名称是8个字节,后缀名是个字节,对于使用英文名称还可以,使用中文名称就很容易长度不够用。使能了长文件名支持后,使用之前需要指定文件名的存储区还有存储区的大小。

接下来就是使用f_opendir函数打开指定的路径。如果路径存在就使用f_readdir函数读取路径下的内容,f_readdir函数可以读取路径下的文件或文件夹,并保存信息到文件信息对象变量内。f_readdir有2个形参,第一个参数为指向路径对象变量的指针,第二个参数为指向文件信息对象的指针。f_readdir函数另外一个特性是自动读取下一个文件对象,即循环运行该函数可以读取该路径下的所有文件。所以,在程序中,我们使用for循环让f_readdir函数读取所有文件,并在读取所有文件之后退出循环。

在f_readdir函数成功读取到一个对象时,我们还不清楚它是一个文件还是一个文件夹,此时我们就可以使用文件信息对象变量的文件属性来判断了,如果判断得出是个文件那我们就直接通过串口打印出来就好了。如果是个文件夹,我们就要进入该文件夹扫描,这时就重新调用扫描函数scan_files就可以了,形成一个递归调用结构,只是我们这次用的参数与最开始时候是不同的,现在是使用子文件夹名称。

STM32F1开发指南笔记44----SPI FLASH 文件系统FatFs多功能测试

串口在程序调试中经常使用,可以把变量值直观打印到串口调试助手。这个信息非常重要,同样在使用之前需要调用Debug_USART_Config函数完成调试串口初始化。
使用FatFs进行文件操作之前都使用f_mount函数挂载物理设备,这里我们使用SPI FLASH芯片上的FAT文件系统。
接下来我们直接调用miscellaneous函数进行FatFs设备信息获取、文件定位和格式化写入功能以及目录创建和重命名功能测试。调用file_check函数进行文件信息获取测试。
scan_files函数用来扫描路径下的所有文件,fpath是我们定义的一个包含100个元素的字符型数组,并将其赋值为SPI FLASH芯片物理编号对于的根目录。这样允许scan_files函数将打印SPI FLASH芯片内FatFs所有文件到串口调试助手。注意,这里定义的fpath数组是必不可少的,因为scan_files函数本身是个递归函数,要求实际参数有较大的缓存区