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

news2024/9/24 23:23:50

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

    • 一、准备工作
      • 1.1 准备好开发板和SD卡
      • 1.2 创建RT-Thread项目
    • 二、配置RT-Thread
      • 2.1 打开文件系统相关配置
      • 2.2 打开SD卡相关配置
      • 2.3 打开RTC配置
      • 2.4 重新生成Keil项目文件
    • 三、编译、烧录、运行
      • 3.1 编译项目
      • 3.2 下载程序
      • 3.3 运行程序
    • 四、在msh中操作SD卡
      • 4.1 查看设备
      • 4.2 格式化SD卡
      • 4.3 挂载文件系统
      • 4.4 简单的文件读写测试
      • 4.5 简单的目录操作测试
    • 五、本篇小结
    • 六、参考链接

本篇将介绍——如何在正点原子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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2084191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网站建设完成后, 营销型网站如何做seo

营销型网站的SEO优化旨在提高网站在搜索引擎中的排名,从而吸引更多潜在客户并促进销售。以下是营销型网站SEO的详细解析: 关键词研究与优化 目标受众分析:了解目标受众的搜索习惯和需求,确定适合的关键词。使用工具来发现相关关键…

RV1126的GPIO计算和使用

1、获取GPIO芯片对应的序号值 先读取下/sys/kernel/debug/gpio的值,得到每个GPIO芯片的序号范围,如GPIO芯片0就为0~31。 2、根据GPIO硬件编号计算出系统内使用的GPIO序号 根据GPIO的编号,比如说GPIO3_B0,前面GPIO3代表看GPIO3的信…

傻瓜操作:GraphRAG、Ollama 本地部署及踩坑记录

目录 一、GraphRAG 介绍1.引言2.创新点3. 算法4. 数据和实验结果5.不足和展望 二、本地部署1.为什么要本地部署2.环境准备3. GraphRAG 安装3.1 下载 GraphGAG3.2 安装依赖包3.3 创建数据目录3.4 项目初始化3.5 修改配置文件 3.6 修改.env文件3.7 修改源码 4. Indexing5. query5…

Linux关于压缩之后文件更大的解释

记录于24年八月29 使用vim命令创建了lianxi1和lianxi2并在里面填写了一些内容,发现使用gzip和zip压缩后文件反而更大 事后问了一下ai回答了我的疑惑 压缩算法开销:如前所述,压缩文件需要存储额外的元数据和文件结构信息。这种开销在处理非常…

C++ TinyWebServer项目总结(13. 多进程编程)

本章讨论Linux多进程编程的以下内容: 复制进程映像的fork系统调用和替换进程映像的exec系列系统调用。僵尸进程以及如何避免僵尸进程。进程间通信(Inter Process Communication,IPC)最简单的方式:管道。三种System V进…

浏览器插件利器--allWebPluginV2.0.0.18-alpha版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品,致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器,实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

[MRCTF2020]Unravel!!

使用zsteg查看图片有隐藏文件,没有头绪,先放弃 使用zsteg和010editor查看都发现一个png图片 把JM.png拷贝到kali,使用binwalk分离,得到一个aes.png 使用010editor查看wav,发现尾部有可疑的字符串,拷贝出来备…

记一次应急响应之网站暗链排查

目录 前言 1. 从暗链而起的开端 1.1 暗链的介绍 1.2 暗链的分类 2. 在没有日志的情况下如何分析入侵 2.1 寻找指纹 2.2 搜索引擎搜索fofa资产搜索 2.2.1 fofa资产搜索 2.2.2 bing搜索引擎搜索 3.通过搭建系统并进行漏洞复现 4. 应急响应报告编写 前言 免责声明 博文…

二叉树(binary tree)遍历详解

一、简介 二叉树常见的遍历方式包括前序遍历、中序遍历、后序遍历和层序遍历等。我将以下述二叉树来讲解这几种遍历算法。 1、创建二叉树代码实现 class TreeNode:def __init__(self,data):self.datadataself.leftNoneself.rightNonedef createTree():treeRootTreeNode(F)N…

大模型提示词工程技术3-提示词输入与输出的优化的技巧详细介绍

大模型提示词工程技术3-提示词输入与输出的优化的技巧详细介绍。《大模型提示词工程技术》的作者:微学AI,这是一本专注于提升人工智能大模型性能的著作,它深入浅出地讲解了如何通过优化输入提示词来引导大模型生成高质量、准确的输出。书中不…

腾讯地图三维模型加载GLTF,播放模型动画

腾讯地图三维模型加载,播放模型动画 关键代码 const clock new THREE.Clock();console.log(gltf)// 确保gltf对象包含scene和animations属性if (gltf && gltf.scene && gltf.animations) {// 创建AnimationMixer实例,传入模型的scenec…

【51单片机】2-3-1 【I/O口】【电动车防盗报警项目】震动传感器实验1—震动点灯

1.硬件 51单片机最小系统LED灯模块震动传感器模块 2.软件 main.c程序 #include "reg52.h"sbit led1 P3^7;//根据原理图(电路图),设备变量led1指向P3组IO口的第7口 sbit vibrate P3^3;//Do接到了P3.3口void Delay2000ms() //…

力扣刷题--2185. 统计包含给定前缀的字符串【简单】

题目描述 给你一个字符串数组 words 和一个字符串 pref 。 返回 words 中以 pref 作为 前缀 的字符串的数目。 字符串 s 的 前缀 就是 s 的任一前导连续字符串。 示例 1: 输入:words [“pay”,“attention”,“practice”,“attend”], pref “at…

用 Higress AI 网关降低 AI 调用成本 - 阿里云天池云原生编程挑战赛参赛攻略

作者介绍:杨贝宁,爱丁堡大学博士在读,研究方向为向量数据库 《Higress AI 网关挑战赛》正在火热进行中,Higress 社区邀请了目前位于排行榜 top5 的选手杨贝宁同学分享他的心得。下面是他整理的参赛攻略: 背景 我们…

Jmeter(十四)Jmeter分布式部署测试

单个接口测试,我们使用谷歌的插件postman 多个接口测试,我们使用Jmeter进行测试 一、使用工具测试 1、使用Jmeter对接口测试 首先我们说一下为什么用Posman测试后我们还要用Jmeter做接口测试,在用posman测试时候会发现的是一个接口一个接…

存储实验:基于华为存储实现存储双活(HyperMetro特性)

目录 什么是存储双活仲裁机制 实验需求实验拓扑实验环境实验步骤1. 双活存储存储初始化(OceanStor v3 模拟器)1.1开机,设置密码1.2登录DM,修改设备名、系统时间和导入License1.3 设置接口IP 2. 仲裁服务器配置(Centos7…

C++ 两线交点程序(Program for Point of Intersection of Two Lines)

示例图 给定对应于线 AB 的点 A 和 B 以及对应于线 PQ 的点 P 和 Q,找到这些线的交点。这些点在 2D 平面中给出,并带有其 X 和 Y 坐标。示例: 输入:A (1, 1), B (4, 4) C (1, 8), D (2, 4) 输出:给定直…

关于vue2运行时filemanager-webpack-plugin报错isFile is undefind

当我们在运行时报此错误时,在vue.config.js里找一下filemanager-webpack-plugin的配置路径。 new FileManagerPlugin({onEnd: {delete: [./dist.zip],archive: [{ source: ./dist, destination: ./dist.zip }]}}) 在对应的路径下建一个dist文件夹

scrapy--子类CrawlSpider中间件

免责声明:本文仅做分享参考~ 目录 CrawlSpider 介绍 xj.py 中间件 部分middlewares.py wyxw.py 完整的middlewares.py CrawlSpider 介绍 CrawlSpider类:定义了一些规则来做数据爬取,从爬取的网页中获取链接并进行继续爬取. 创建方式&#xff…

七年老玩家《王者荣耀》分析一:【市场与用户以及社交功能】

目录 市场与用户 王者荣耀在不同国家和地区的市场渗透率 王者荣耀的主要收入来源以及增长趋势 王者荣耀的用户活跃度和玩家留存率在最近几年的变化情况 王者荣耀面临的主要竞争对手以及如何在竞争中保持领先地位 《英雄联盟手游》(LOL) 《虚荣》&a…