【STM32+cubemx】0019 HAL库开发:SDIO接口和FATFS文件系统访问TF、SD卡

在实际的项目中,很多情况下需要保存大量的测试数据,这时我们就需要用到TF/SD卡,这两种卡的接口是基本兼容的,只是外形不同。

stm32的部分型号有SDIO接口,cubemx也可以生成TF/SD卡的工程,同时cubemx的中间件甚至集成了FATFS文件系统,几乎可以说一站式解决了所有TF/SD卡的使用问题。

本节我们使用Cubemx生成TF/SD卡的工程,并且使用上FATFS文件系统,使得stm32写入TF/SD卡的数据可以直接通过读卡器在计算机上访问。

本节的例子使用的开发环境是cubemx 6.1.0,pack版本是1.8.0;硬件使用的是stm32f103VET6,它带有SDIO接口。

1)cubemx工程配置

首先我们看一下硬件电路图,这是标准的SDIO接口:

在cubemx中设置SDIO接口的时候,如下图:

选择SDIO接口;

因为硬件上我们连接的是D0~D3,所以选择SD 4bits Wide bus,使用4bit宽度的SDIO总线;选择之后,右侧图中的SDIO相关引脚被选中(变绿),与连接TF卡的引脚对应;

接着设置SDIO的时钟分频,这里我们选择8分频(注意这和存储卡的速率有关,时钟太快的话有可能无法访问存储卡,这里可以先设置为大一点的值,程序成功后再调整得快一些)。

设置SDIO中断使能:

配置中间件FATFS,如下图所示:

选择FATFS中间件,勾选SD Card;

然后设置文件名为英文、缓存在堆(STACK)中(设置为英文是为了节省内存);

注意一下下面的两个512,设置的是扇区的大小,默认是最大和最小都是512不修改;这是因为大部分的TF/SD卡的扇区大小是512字节(512字节一个扇区是在存储卡出厂时就确定了,不能更改,我们在计算机上格式化时,选择的“分配单元大小”一般是簇大小,和扇区大小无关)。

配置FATFS文件系统主要是为了能方便地在计算机上访问存储卡的内容,如果没有文件系统,我们回收存储卡中的数据时,需要使用一些特殊的软件,将卡里的原始数据(十六进制数)全部读出,再找出需要的那一部分,是非常麻烦的。

而使用了文件系统后,stm32可以在存储卡里建立文件,在文件中记录数据;多次记录可以建立不同的文件名;这样我们回收数据时,只需使用读卡器把存储卡连接到计算机上,像访问u盘一样打开对应的那个文件,就能获取数据了。

接着,设置监测引脚,这个引脚是为了检测有无存储卡插入使用的。这个引脚如果硬件上没有,也需要设置一下,否则会报警告;可以先设置一个不使用的硬件作为输入,然后选择该引脚,这里用的是PC5:

最后,需要把堆栈设置得大一些,如下图,因为FATFS文件系统会占用较多的内存,否则会溢出:

到这里,cubemx里的设置就已经完成了,现在可以生成keil的代码工程了。

2)keil中的代码编写

打开生成的keil工程,可以看到已经生成了SDIO和FATFS相关的库函数。

现在我们来改写代码。

首先是监测存储卡是否存在的函数,由于我们硬件上没有连这个,只是设置了一个没有使用的引脚作为监测引脚,所以要屏蔽它的影响。

在fatfs_platform.c文件中添加一行,使得返回值一直为SD_PRESENT,让程序认为存储卡始终存在:

改完上面这一句,就可以使用FATFS文件系统和TF/SD卡了。

我们来编写测试函数,如下图,关键语句都有注释,就不详细解释了:

(完整的工程代码可以在文末关注公众号留言获取)

主函数中,循环调用测试函数,至此,测试代码编写完毕:

3)运行测试程序

先将TF/SD卡在计算机上格式化为FAT32文件系统(分配单元大小如果有4096字节选项尽量选择这个):

将存储卡安装到开发板上,keil工程编译、下载、运行;

串口调试助手的打印内容如下,说明运行成功了:

断电,取出存储卡,用读卡器连接存储卡到计算机上,打开卡内的文件test1.txt,可以看到内部的文件内容,与预期写入的一致,所以写入存储卡成功了:

4)注意事项

a) 关于不同TF/SD卡的速率

不同TF/SD卡的速率,可以依据存储卡上的标识来简单区分,如下图所示:

在使用速率比较低的存储卡时,需要在cubemx中第一步配置SDIO的时钟分频系数时设置得大一些,否则可能会通信失败;如果是高速卡,可以试着调高时钟频率,以获取更快的读写速率;

b) TF/SD卡也可用通过SPI接口访问,没有SDIO接口的一些型号的单片机,可以通过SPI接口来读写存储卡;但是需要先通过SPI接口写指令,才能通信,操作要复杂一些;

c) FATFS是一套开源程序,cubemx中已经移植好了所有的函数接口,所以我们可以直接使用;文中的例程使用的是f_printf()实现的向文件写入,实际上,它还有更一般化的写入函数如f_write()等等,这些函数都在ff.c/ff.h文件中定义,可以直接看FATFS的源码;如果系统要求运行效率要求较高,也可以自行裁剪,比如,如果只使用读存储卡功能,则可以裁剪掉写功能等等。

好了,本节使用SDIO和FATFS访问TF/SD的内容就讲到这里了。

欢迎关注我的公众号,可留言“资料”获取相关资料和软件:

posted @ 2021-12-20 23:25  xiaobaibai_2021  阅读(1857)  评论(0编辑  收藏  举报