STM32F407+RT_Thread使用FATFS文件系统操作SD卡
前言
最近在搞基于rt_thread操作系统的项目,其中使用了fatfs文件系统操作SD卡,过程中遇到了一些问题,解决之后想在这里和大家分享一下。
menuconfig配置
rt_thread下使用SD和FATFS不需要像裸机时那样照着SD卡初始化流程图去抠,直接使用相对应的组件,在env中的menuconfig配置好就可以使用了,这个是真的太舒服了!
1.使能SDIO设备:
Hardware Drivers Config —>
On-chip Peripheral Drivers —>
[*] Enable SDIO
2.配置DFS:
这里在使能SDIO设备后,会自动开启。具体可参考官方文档中的说明。
RT-Thread Components —>
Device virtual file system —>;
这里如果只使用一个SD,那使用默认配置就可以。
3.开启FATFS:
因为rt_thread默认使用fatfs文件系统,所以这个配置也是已经自动开启的。
RT-Thread Components --->
Device virtual file system --->
[*] Enable elm-chan fatfs
elm-chan's FatFs, Generic FAT Filesystem Moudle --->
这里也使用默认配置就可以,具体可以参考官方文档。
至此menuconfig中的配置就完成了。但可能有的资料里会让你再进行一步操作:
Hardware Drivers Config --->
Onboard Peripheral Drivers --->
[*] Enable File System --->
这里如果你只使用一个SD卡的话,我建议就不要开启了,这只会徒增你的烦恼还没有用。
文件系统初始化
文件系统的初始化过程一般分为以下几个步骤:
1.初始化 DFS 组件:
这里使用dfs_init()
实际上在开启DFS功能后,rt_thread已经自动开启了DFS的初始化,并不需要我们人为再次初始化一次,当然如果你不放心的可以手动再初始化一次。
2.初始化具体类型的文件系统:
这里其实就是对所需的文件系统进行注册,使用对应文件系统初始化函数即可,如elm_init()
。同样和上面一样使能对应文件系统后在rt_thread内部会自动开启对应的初始化,不需要人为再次初始化一次,并且,在这里如果你人为进行一次初始化时,控制台就会报错
所以当你出现这种错误时不一定是你最大可使用文件系统数目DFS_FILESYSTEM_TYPES_MAX
小了,还有可能是重复进行初始了。
3.在存储器上创建块设备:
这一步是rt_thread内部完成的无需用户操作。
4.格式化块设备:
在第一次使用SD卡时,要先将SD卡格式化为FAT或FAT32格式,否则可能会无法识别SD卡。这里建议使用int dfs_mkfs(const char * fs_name, const char * device_name);
再进行一次格式化确保没问题,小编本人在最开始使用时就出现了未知问题,在使用上诉方法再次格式化后成功了。
5.挂载块设备到 DFS 目录中:
这一步是唯一需要用户自行操作的一步。
rt_thread_mdelay(100);
if(dfs_mount("sd","/","elm",0,0)==0)
rt_kprintf("File System initialized\n");
else
rt_kprintf("File System init failed\n");
注意在进行挂载前的延时函数,这里一定要加上,在SD初始化时需要先识别到SD后,再进行挂载,而这个识别过程稍微有点久,所以需要延时进行一下等待,如果不延时的话大概率会挂载失败(小编在这里苦了好久)。
至此DFS的初始化就结束了,接下来就可以进行文件的各种管理操作了。
文件操作
相关函数较为简单,请自行参考官方说明文档。在这里包括上述的格式化过程可能会出现如下错误
这种情况就检查一下板子的电气连接有没有问题,一般不会是软件问题,如果是电脑USB口供电,也可能是供电不足的原因。(小编在裸机spi操作SD时就因为这个卡了好久)