查看: 2427|回复: 0

54...STM32F469I discovery为SD卡添加文件系统

[复制链接]
  • TA的每日心情
    难过
    2021-2-27 22:16
  • 签到天数: 1568 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2018-1-13 17:12:37 | 显示全部楼层 |阅读模式
    分享到:
    我们使用的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一开始就是为了能在不同的单片机上使用而设计的,所以具有良好的层次结构。如下图所示:

    1.png

    整一个文件系统分为三层,二通常普通用户和普通开发者不需要去了解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.获取文件系统源码。

    源码肯定是在官网获取了,如下图:

    2.png

    上图表述了关于此文件系统的资源和平台。

    2.完成SD卡驱动并移植FatFs Module文件系统。

    很幸运,在官方已经提供了移植文件系统的教程,只需要做相应的修改,即可将文件系统移植到程序中,并使用。如下图:

    3.png

    没错,上图就是移植教程了,只需要将上图中提到的6个接口进行配置,即可在SD卡上使用文件系统。

    disk_initialize函数为初始化SD卡。

    disk_status函数为获取SD卡的状态。

    disk_read函数为读取SD卡扇区。

    disk_write函数为写SD卡扇区。

    disk_ioctl函数为SD卡的特性控制操作。

    get_fattime函数为获取FAT文件系统的当前时间。

    只需要实现以上函数,即可将文件系统使用与SD卡。

    4.png

    如上图即为FatFs Module文件系统的源码了,其实主要就是diskio.c、ff.c、ff_gen_drv.c这三个文件。这就是前面所说的三层了。二移植要干 就是底层,即diskio.c文件。这个文件中默认的内容为disk_initialize、disk_status、disk_read、disk_write、disk_ioctl、get_fattime这几个函数,并且都为空函数,也就是这些函数中没有内容,需要开发者自己去添加操作硬件的实现,这就是移植,非常简单。如下图:

    17.png





    以上即为移植好的这几个函数了,并且此为ST移植好的,我只是借来用用。我并不想说移植的过程,我的目的在于告诉读者知道该从何入手去移植。

    3.使用FatFs Module文件系统。

    10.png

    上图为官网中提供的部分文件系统的接口,这也就是应用层了,对应于ff_gen_drv.c文件。一切就只在于调用了。只有使用方法,在官网中也已经详述了。

    到这里,搞讲讲我要做的实验了

    (1)首先是初始化好设备,然后在SD卡中创建一个文件,最好在文件中写一段话,然后关闭文件。

    (2)再打开文件,将文件的内容读取出来,打印在终端中。

    下面就是贴代码时间了。

    (1)STM32F469基本初始化和必要变量定义

    11.png

    (2)初始化设备并挂载设备。

    12.png

    如上图,STM32F469的时钟初始化,然后是初始化设备,然后是挂载设备,最后是创建文件系统。

    (3)创建文件并往文件中写入字符串。

    13.png

    没得说的,打开名为STM32.TXT的文件,注意使用的条件是FA_CREATE_ALWAYS | FA_WRITE,意味着,当SD卡中的位置存在此文件是,打开文件,否则常见文件,并且文件的属性可写。然后就是通过f_write函数将定义的字符串写入文件中。最后就是关闭文件了。

    (4)读取文件中的内容,并打印出来。

    14.png

    如上图,同样是打开文件,但是是以读的方式打开,然后通过函数f_read读取文件的内容,然后关闭文件。最后将读取到的内容通过printf函数打印到终端。

    当然,因为是测试程序,所以在退出时,使用FATFS_UnLinkDriver函数将设备卸载,不再控制设备。

    (5)实验结果。

    将程序Rebuild编译,然后烧录到板卡中,在终端中打印如下图:

    15.png

    如上图所示,说明程序以及运行成功。字符串“This is STM32 working with FatFs”即为从在SD卡中创建的文件STM32.TXT中读取出来的字符串。为了验证正确性,将SD卡拔出板卡,通过读卡器将其与PC电脑连接,得到如下图:

    16.png

    如上图即为SD卡插入PC电脑后的内容了,可以看到它的内容为STM32.TXT文件,并且才文件的属性,创建时间等等也能够查出啦。

    4.总结:本文简单的介绍了文件系统的使用,并基于STM32F469平台做了实例验证。本文只给出一个使用轻量级文件系统的使用方法,和使用思路,并未谈及文件系统的实现原理等等。其实这已经实用与大多数的开发。


    7.png
    9.png
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 01:16 , Processed in 0.127227 second(s), 23 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.