STM32F469I discovery为SD卡添加文件系统
-----东方青
在我的上一篇文章中,主要提及了单片机驱动SD卡,并且以扇区为单位的对SD卡进行读写,但是很明显,这样的做法估计也只有单片机攻城狮和驱动攻城狮等等这个群体才能看的懂了,其他的群体想看懂,貌似难度较大。所以平常我们使用的SD卡,基本上都是以文件系统的存在访问的。因为所存放在SD卡上的内容是以文件形式存在的,对于普通用户而言,当SD卡插入电脑PC后,访问他的内容就行访问我们电脑的磁盘一样。对于程序员而言,因为文件系统的存在,当操作SD卡时,都可以以文件的打开,读写进行操作,简化了编程的难度。总之各种好处。
本文在此只叙述一个关于轻量级的文件系统的使用,不探讨文件系统如何在SD卡上进行存储分布等等,因为其太过复杂,通常来说,也不是很有必要去理解这个内部的实现,如果真正的使用到特殊应用,再稍微补充就好。下面笼统的介绍一下文件系统。
目前常用的文件系统主要有微软的 FATl2、FATl6、FAT32、NTFS,以及Linux系统下的EXT2、EXT3、EXT4等。由于微软 Windows 的广泛应用,在当前的消费类电子产品中,用得最多的还是 FAT 文件系统,如U盘、MP3、MP4、数码相机等,所以找到一款容易移植和使用、占用硬件资源相对较小而功能又强大的 FAT 开源文件系统,对于单片机系统设计者来说是很重要的。并且对于单片机开发者而言,所要求的文件系统必须满足如下两个要求:
(1)运行占用内存要足够小。
(2)系统稳定强大,易用性强。
FatFs Module 是一种完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计。它完全采用标准C语言编写,所以具有良好的硬件平台独立性,可以移植到8051、PIC、AVR、ARM(包括各个系列的,不过在这里主要针对M系列,其他系列有足够大的内存运行完整的文件系统)等系列单片机上而只需做简单的修改。它支持 FATl2、FATl6 和 FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对 8 位单片机和 16 位单片机做了优化。
FatFs Module一开始就是为了能在不同的单片机上使用而设计的,所以具有良好的层次结构。如下图所示:
整一个文件系统分为三层,二通常普通用户和普通开发者不需要去了解Fatfs Module文件系统的FAT协议和数据结构,只需要调用应用层提供的API(对于普通开发者而言,普通用户直接操作图形界面),比如f_open、f_read、f_write、f_close等接口函数进行操作。中间层 FatFs Module实现了FAT文件读/写协议。FatFs Module 的完全版提供的是ff.c、ff.h文件进行调用。最底层就是关于SD卡的最基本的驱动了,如我的上一篇文章一样,以扇区为单位进行操作SD卡,这就是最底层干的事。二通常我们是需要移植中间层到我们的单片机程序中,即可实现对SD卡以文件系统的方式访问。(注,此段内容来自于百度)。
上文之所以长篇幅介绍FatFs Module文件系统,原因是在ST的例程中已经为我们提供了FatFs Module文件系统作为使用,再因为其为轻量级的文件系统,并且其的运行时占用RAM仅仅有1KB,所以选择它成为了一直必然;另一个原因是FatFs Module文件系统(它是Fatfs的分支,还有其他分支)的设计很实用与SD卡等存储设备。
那么要使用此文件系统,需要做哪些事情呢?下面将一一解答。
1.获取文件系统源码。
官网链接地址:http://elm-chan.org/fsw/ff/00index_e.html
源码肯定是在官网获取了,如下图:
上图表述了关于此文件系统的资源和平台。
2.完成SD卡驱动并移植FatFs Module文件系统。
很幸运,在官方已经提供了移植文件系统的教程,只需要做相应的修改,即可将文件系统移植到程序中,并使用。如下图:
没错,上图就是移植教程了,只需要将上图中提到的6个接口进行配置,即可在SD卡上使用文件系统。
disk_initialize函数为初始化SD卡。
disk_status函数为获取SD卡的状态。
disk_read函数为读取SD卡扇区。
disk_write函数为写SD卡扇区。
disk_ioctl函数为SD卡的特性控制操作。
get_fattime函数为获取FAT文件系统的当前时间。
只需要实现以上函数,即可将文件系统使用与SD卡。
如上图即为FatFs Module文件系统的源码了,其实主要就是diskio.c、ff.c、ff_gen_drv.c这三个文件。这就是前面所说的三层了。二移植要干 就是底层,即diskio.c文件。这个文件中默认的内容为disk_initialize、disk_status、disk_read、disk_write、disk_ioctl、get_fattime这几个函数,并且都为空函数,也就是这些函数中没有内容,需要开发者自己去添加操作硬件的实现,这就是移植,非常简单。如下图:
以上即为移植好的这几个函数了,并且此为ST移植好的,我只是借来用用。我并不想说移植的过程,我的目的在于告诉读者知道该从何入手去移植。
3.使用FatFs Module文件系统。
上图为官网中提供的部分文件系统的接口,这也就是应用层了,对应于ff_gen_drv.c文件。一切就只在于调用了。只有使用方法,在官网中也已经详述了。
到这里,搞讲讲我要做的实验了
(1)首先是初始化好设备,然后在SD卡中创建一个文件,最好在文件中写一段话,然后关闭文件。
(2)再打开文件,将文件的内容读取出来,打印在终端中。
下面就是贴代码时间了。
(1)STM32F469基本初始化和必要变量定义
(2)初始化设备并挂载设备。
如上图,STM32F469的时钟初始化,然后是初始化设备,然后是挂载设备,最后是创建文件系统。
(3)创建文件并往文件中写入字符串。
没得说的,打开名为STM32.TXT的文件,注意使用的条件是FA_CREATE_ALWAYS | FA_WRITE,意味着,当SD卡中的位置存在此文件是,打开文件,否则常见文件,并且文件的属性可写。然后就是通过f_write函数将定义的字符串写入文件中。最后就是关闭文件了。
(4)读取文件中的内容,并打印出来。
如上图,同样是打开文件,但是是以读的方式打开,然后通过函数f_read读取文件的内容,然后关闭文件。最后将读取到的内容通过printf函数打印到终端。
当然,因为是测试程序,所以在退出时,使用FATFS_UnLinkDriver函数将设备卸载,不再控制设备。
(5)实验结果。
将程序Rebuild编译,然后烧录到板卡中,在终端中打印如下图:
如上图所示,说明程序以及运行成功。字符串“This is STM32 working with FatFs”即为从在SD卡中创建的文件STM32.TXT中读取出来的字符串。为了验证正确性,将SD卡拔出板卡,通过读卡器将其与PC电脑连接,得到如下图:
如上图即为SD卡插入PC电脑后的内容了,可以看到它的内容为STM32.TXT文件,并且才文件的属性,创建时间等等也能够查出啦。
4.总结:本文简单的介绍了文件系统的使用,并基于STM32F469平台做了实例验证。本文只给出一个使用轻量级文件系统的使用方法,和使用思路,并未谈及文件系统的实现原理等等。其实这已经实用与大多数的开发。