【STM32开发笔记】使用RT-Thread的SDIO驱动和FATFS实现SD卡文件读写

本篇将介绍——如何在正点原子STM32探索者V3开发板上使用RT-Thread的SDIO驱动和FATFS文件系统组件实现SD卡上的文件读写。

开始本篇实验前,需要搭建RT-Thread开发环境,可以参考我之前的文章:【正点原子STM32探索者V3开发板体验】体验RT-Thread 5.0.0版本

正点原子STM32探索者V3开发板上使用RT-Thread驱动SD卡实现文件读写只需要三步:

  • 配置FATFS和SDIO功能
  • 编译项目代码
  • 烧录程序到开发板

对,你没看错,不用写代码,只需要改改配置,编译、烧录、运行就可以了!

一、准备工作

1.1 准备好开发板和SD卡

开始本篇实验之前,需要准备一个MicroSD卡,我这里准备的是一个32G的闪迪卡:

1684077723967_1

1.2 创建RT-Thread项目

和上一篇文章类似,首先打开RT-Thread Env工具, 并跳转到rt-thread源码的bsp/stm32/stm32f407-atk-explorer子目录。

然后,使用如下scons命令,创建RT-Thtread项目:

scons --dist --target=mdk --project-name=rtt_sdio --project-path=D:\Hardware\ST\ExplorerV3_STM32F407\Elecfans_03\rtt_sdio

如下图所示:

image-20230514233258958

注:如果已有RT-Thread项目,则可以跳过此步骤。

该命令执行完成后,就可以看到创建的目录和文件了:

image-20230514234444663

其中,rtt_sdio.uvprojx即为刚刚scons命令生成的Keil项目文件。

二、配置RT-Thread

PS:这个以RT-Thread Env工具为例,对RT-Thread进行配置,如果是使用RT-Thread Studio创建项目,进行配置也是类似的。

2.1 打开文件系统相关配置

RT-Thread Env命令行窗口跳转到项目所在目录后,执行meuconfig命令并回车,打开配置界面:

image-20230514235631571

常用操作说明:

  • 上下键,移动光标
  • 回车键,进入配置项
  • ESC键,退出当前配置,返回上一级配置
  • 空格键,选中或取消光标所在配置项
  • “/”键,搜索界面

在 Hardware Drivers Config -> Onboard Periopheral Drivers 配置中,选中 Enable File System:

image-20230515000405085

PS:该配置项选(BSP_USING_FS)中后,会自动选中RT_USING_DFSRT_USING_DFS_ROMFS配置项。

2.2 打开SD卡相关配置

选中 Hardware Drivers Config -> Onboard Periopheral Drivers -> Enable File System (BSP_USING_FS)配置项后,继续回车:

image-20230515000807136

选中Enable SDCARD配置项目,如上图所示。

然后左右移动底部光标到Save菜单上,回车保存,提示保存为.config

image-20230515000949724

回车后,弹出提示说配置已写入到.config了:

image-20230515001105800

敲回车,界面将会返回配置界面。

此时,我们的对项目配置的修改已经保存到.config文件了,我们只需要连续按ESC键即可退出配置界面。

2.3 打开RTC配置

类似的,找到并打开如下配置项:

image-20230515005549253

该配置项用于打开RTC功能,以实现计时功能(PS:文件系统需要计时功能)。

2.4 重新生成Keil项目文件

由于刚刚我们修改了配置项,开启了文件系统和SD卡相关的配置项目,需要重新生成Keil项目文件,才能正常编译成功。

在当前项目目录中,使用如下命令,重新生成Keil项目文件:

scons --target=mdk --project-name=rtt_sdio

如下图所示:

image-20230515001911043

三、编译、烧录、运行

3.1 编译项目

由于我安装的是Keil 5.37,需要先切换默认便器才可以正常编译通过。

切换默认编译器,具体操作为:

  1. 鼠标右击Project视图中的rt-thread目录,选择“Options for Target - rt-thread”,弹出菜单,如下图所示:

    image-20230513212304758

  2. 在弹出的Options for Target - rt-thread界面中,下拉ARM Compiler,选择Use default compiler version 6,即使用默认的版本6编译器;

  3. 点击底部的OK,确认。

修改完默认编译器后,点击编译图标(或者按快捷键F7进行编译),将会开始编译:

image-20230513212505313

编译完成后,Build Output将会看到:

image-20230515002320418

有一个Error,重新编译一下,可以直接看得清楚,不用往回找是哪个文件编译报错:

image-20230515002447162

报错信息说:

  • board/ports/drv_filesystem.c文件中,声明变量romfs_rootstatic
  • rt-thread/components/dfs/filesystems/romfs\dfs_romfs.h文件中,声明变量romfs_root为非static

前后声明不一致,导致报错,解决方法很简单,drv_filesystem.c中的static去掉即可

修改后,再次重新编译,就可以编译通过了:

image-20230515002912425

3.2 下载程序

编译成功后,我们需要将生成的二进制程序代码文件烧录到开发板上。

开始测试之前,我们需要先将MicroSD卡插入开发板(建议断电操作,PC端先断开):

1684082073388_1

插入SD卡后,检查开发板和PC之间的USB线和JTAG调试器连接。

由于我使用的是JLink调试器,因此还需要修改项目的调试器设置(Keil项目默认的调试器设置是ULINK)。

修改Keil项目的调试设置,具体操作如下(这里以JLink为例):

  1. 鼠标右击Project视图中的rt-thread目录,选择“Options for Target - rt-thread”,弹出菜单,如下图所示:

    image-20230513212906957

  2. 在弹出的Options for Target - rt-thread界面中,切换到Debug标签页面,如下图所示:

    image-20230513212855244

  3. Use右边的下拉,选择J-LINK/J-TRACE Cortex,然后点击右侧的Settings,弹出Cortex JLink/JTrace Target Driver Setup界面,如下图所示:

    image-20230513213022905

    这里,我修改了Port为SW,代表使用SWD接口(JTAG也可以),Max表示最大时钟信号频率,修改为50M下载速度更快。

    看到成功识别了 ARM CoreSight JTAG-DP,说明JLINK调试器已经成功识别到主控芯片了。

  4. 切换到Flash Download标签页,勾选Reset and Run,便于调试,如下图所示:

    image-20230507231213195

  5. 最后点击确定,回到Options for Target - Blinky界面,点击OK,保存设置;

以上准备就绪后,在Keil中,点击Download按钮(或者F8快捷键),开始下载程序到开发板:

image-20230515004540561

3.3 运行程序

烧录完成后,连接串口,输入help命令回车可以看到:

image-20230515005959756

可以看到文件系统相关的操作命令:

  • mkfs,可以用于创建文件系统
  • mount,可以用于挂载文件系统
  • umount,可以用于卸载文件系统

还有文件相关的操作命令:

  • cp,拷贝文件
  • mv,移动或重命名文件
  • cat,显示文件内容
  • echo,可用于创建或写入文件

四、在msh中操作SD卡

烧录完成后,我们就可以在RT-Thread的msh环境中愉快地操作SD卡了。

4.1 查看设备

输入list device命令并回车,可以查看设备:

image-20230515005225062

这里sd0为分区,后续会对他进行操作。

4.2 格式化SD卡

初次使用的SD卡,可能没有文件系统,或者文件系统不是FAT格式的,需要将SD卡格式化为FAT文件系统,后续才能挂载成功。

**注意:**格式化操作会导致SD卡上已有数据全部丢失;因此,在执行格式化操作前,请确认SD卡上没有重要数据,或者你已对SD卡上的重要数据进行了备份。

mkfs命令用法:

image-20230515005357798

接下来,我们可以通过mkfs命令对SD卡进行格式化:

image-20230515010744716

mkfs执行会持续一段时间,请耐心等待(具体因不同SD卡容量和速度等级而异,我的32GB卡消耗了几秒钟)。

4.3 挂载文件系统

接下来,我们可以在串口终端内使用mount命令将SD卡挂载到根目录:

image-20230515010842473

mount -h可以查看mount命令的用法:

image-20230515010914866

另外需要注意的是,fstype参数使用的是elm(这里的elm实际就是FATFS)。

4.4 简单的文件读写测试

前面提到echo命令比较特殊,可以写文件,接下来使用echo写文件,cat读文件,ls查看文件:

image-20230515011137043

这里使用了ls、echo、cat命令,进行了文件读写操作。

4.5 简单的目录操作测试

接下来,进行简单的目录操作演示。

image-20230515011224240

这里首先使用了pwd查看当前工作目录,然后演示了ls、mkdir、cd命令;

如果你是对RT-Thread了解不多的朋友,看到这里可能会非常惊奇——在一个可以运行在单片机的RTOS上,居然可以这么方便的进行文件系统、目录、文件操作。

五、本篇小结

可以看到,在基于RT-Thread系统的项目中,我们没有添加任何代码,就可以实现SD卡进行文件系统和件相关操作。这是因为RT-Thread系统正点原子STM32探索者V3开发板的BSP中已经支持了SDIO功能,另外RT-Thread系统本身包含了SDIO驱动框架、FATFS支持,以及相关的命令。因此,我们可以在shell中非常方便的进行文件系统相关操作,以及文件相关操作。

六、参考链接

  1. RT-Thread Env工具下载: https://www.rt-thread.org/download.html#download-rt-thread-studio
  2. RT-Thread Env 用户手册: https://www.rt-thread.org/document/site/#/development-tools/env/env
  3. RT-Thread 5.0.0 发布声明: https://mp.weixin.qq.com/s/x9Sb3hc_GxV5VYfagGKhcA
  4. RT-Thread RTC设备文档:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/rtc/rtc
  5. RT-Thread 虚拟文件系统: https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/filesystem/filesystem
  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码工许师傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值