RT-Thread Studio驱动SD卡
前言
硬件平台:RT-Thread ART-Pi STM32H750XBH6开发板 H750开发板
开发软件:RT-Thread Studio
相关组件:elm FatFs虚拟文件系统、SPI驱动、SD设备驱动和SDIO
参考博客:RT-Thread Studio使用SDIO驱动SD卡挂载文件系统
官方资料:虚拟文件系统
实验目的:使用开发板上的SD卡接口,实现对SD卡数据的读和写。
一、创建基本工程
1、创建Bootloader
打开RT-Thread Studio,按 “文件 -> 新建 -> RT-Thread项目” 路径新建Bootloader工程。
具体配置如下所示:
点击完成后即可得到一个Bootloader程序。
- 打开该程序点击编译
- 编译完成后再带点击下载。、
BootLoader主要用于使用外挂Falsh存储代码时 初始化外挂的Flash、映射物理地址及地址跳转。ART - Pi使用QSPI连接8M的W25Q64。
2、创建项目工程
打开RT-Thread Studio,按 “文件 -> 新建 -> RT-Thread项目” 路径新建led工程。
具体配置如下所示:
点击完成后即可得到一个led闪烁程序。
- 打开该程序点击编译
- 编译完成后再带点击下载。、
- 效果演示:
二、配置RT-Thread Settings
双击左侧项目资源管理器下led工程的“RT-Thread Settings”打开可视化配置。
打开后如下图所示。
鼠标左键单击打开Fatfs、SDIO组件,Ctrl + s保存。
直接编译发现有报错,没有打开BSP_USING_SDIOx。
既然没打开,那就打开它就好了。SDIO属于芯片外围硬件,所以应打开硬件配置。
使能SDIO,选择SDIO1。
为什么是SDIO1而不是SDIO2呢?看开发板的原理图就能确定,SD卡接入了SDIO1中。
重新保存配置并编译,发现没有报错。但是到这里只是成功配置组件,要实现对SD卡数据的读写还需要先挂载文件系统。
因为sd卡使用的dfs属于部件,因此使用”部件自动初始化“函数对其完成注册。在终端输入”list_device“指令可以查看已经挂载的设备。
挂载文件系统代码:
#include "dfs_fs.h"
int sd_init(void)
{
rt_thread_mdelay(100);//这段延时必须加上,系统上电过程中存在延时,否则会出现先挂载后注册块设备sd0的情况
//mkfs("elm","sd0");//挂在前需格式化
if(dfs_mount("sd0","/","elm",0,0)==0) //挂载文件系统,参数:块设备名称、挂载目录、文件系统类型、读写标志、私有数据0
{
rt_kprintf("dfs mount success\r\n");
}
else
{
rt_kprintf("dfs mount failed\r\n");
}
return 0;
}
INIT_COMPONENT_EXPORT(sd_init);
读写SD卡数据
读写数据代码:
#include "dfs_posix.h"
void SD_RW(void)
{
char wbuf[] = "hello world!", rbuf[30] = {0};
int rsize = 0;
int fd = 0; //文件描述符
//写入数据
fd = open("/a.txt", O_WRONLY | O_CREAT); //打开文件,如果不存在就新建一个
if(fd>0)
{
write(fd, wbuf, sizeof(wbuf));
close(fd);
rt_kprintf("write success\r\n");
}
//读取数据
fd = open("/a.txt", O_RDONLY); //使用只读格式打开
if(fd>0)
{
rsize = read(fd, rbuf, 100);
close(fd);
if(rsize>0)
{
rt_kprintf("READ(%d): %s",rsize,rbuf);
}
}
}
(tips:如果要将数据追加在文件末尾而非覆盖数据,打开文件时按位或上 O_APPEND 参数)
三、代码分析
因为选用的硬件平台是RT-Thread官方发布的,所以组件包对硬件已经做好了兼容无需自己去配置板上资源。
若是使用其他硬件平台,可在 ”HAL_SD_MspInit“ 中配置具体使用到的GPIO和模式配置。(可使用CubeMx配置后替换)
ART-Pi SDMMC1的IO分配:
四、效果验证
-
插到电脑上直接看
-
在终端输入”cat + 文件名“
总结
当前只是实现了最基本SD卡数据的读和写,后续再继续研究文件目录的相关操作并把log存到SD卡中。