从驱动到应用:RT-Thread环境下的SDIO开发指南

天资达人 科技创新 2025-06-30 4647 0

目录

硬件介绍

搭建开发环境

配置 SDIO 驱动

挂载文件系统

文件读写测试

演示视频

源码工程

总结

本文主要讲述RT-Thread环境下的SDIO开发指南,基于MCXN947开发板。

1 硬件介绍

本次测评的是SDIO模块。

SDIO接口是在SD内存卡接口的基础上发展起来的接口,SDIO接口兼容以前的SD内存卡,并且可以连接SDIO接口的设备。

比如SDIO可以访问micro SD卡、SD卡等存储类设备,或蓝牙、WIFI、GPS等无线设备。

这次测试的是使用SDIO接口访问micro SD卡,即所谓的TF卡,TF卡的引脚定义和SD卡会有所不同:

9969a3bc-53bb-11f0-986f-92fbcf53809c.png

FRDM-MCXN947提供对应的驱动文件是bsp_sdhc.c

SDHC是大容量SD卡,也就是SD High Capacity,支持最大32GB大小容量。

SDHC,Secure Digital High Capacity,大容量SD,也就是说,超过2G的SD都叫SDHC,因为早期的SD使用的是FAT16文件系统,并不支持大容量,而SDHC升级为FAT32,才支持2G以上的大容量。

2 搭建开发环境

Keil :v5.32,官方推荐5.36及以上

RT-Thread env-windows-1.5.0

构建工程:

获取 RT-Thread 当前最新的工程 https://github.com/RT-Thread/rt-thread/

通过 env 工具进入 BSP目录:

rt-thread-master\bsp\nxp\mcx\mcxn\frdm-mcxn947

拷贝 rt-thread-master\bsp\nxp\mcx\tools\sdk_dist.py到刚才的BSP目录

执行

scons--dist --target=mdk5

生成的工程在dist目录,进入到dist下的project目录,需要做以下两个修改:

删除 sdk_dist.py,上传服务器或本地备份的时候不需要此文件

修改工程目录的Kconfig,否则menuconfig会找不到Libraries文件夹下的其它Kconfig

99871fdc-53bb-11f0-986f-92fbcf53809c.png

最后在生成的工程下执行

pkgs--update

到这里,就可以在KEIL愉快的玩耍了。

3 配置 SDIO 驱动

芯片的 SDIO 外设驱动

99a754f0-53bb-11f0-986f-92fbcf53809c.png

RT-Thread 的 SD/MMC 设备驱动

99b34a3a-53bb-11f0-986f-92fbcf53809c.png

这里使用的是 elm-chan fatfs,即fat32;而 DFS 是对各种文件系统的抽象层,用于适配不同的文件系统

99c00798-53bb-11f0-986f-92fbcf53809c.png

配置完成后,保存到新的 .config, 并在env工具下执行:

scons--target=mdk5

4 挂载文件系统

main.c包含头文件,编译新生成的源文件,并下载到我们的开发板。

#include"dfs_fs.h"

如果挂载失败,可以优先进行这两个动作:

检查卡座的引脚是否存在虚焊

TF卡没有被格式化为FAT32文件系统,插入下面第10行代码进行格式化

#ifdefRT_USING_SDIO rt_thread_mdelay(2000); if(dfs_mount("sd","/","elm",0,NULL) ==0) { rt_kprintf("sd mounted to /\n"); } else { rt_kprintf("sd mount to / failed\n"); dfs_mkfs("elm","sd"); }#endif

我这里使用的是闪迪 16GB TF卡,使用读卡器可以看到TF卡已经成功被格式化

99ccc80c-53bb-11f0-986f-92fbcf53809c.png99dbb09c-53bb-11f0-986f-92fbcf53809c.png

5 文件读写测试

回到主干 rt-thread-master\examples 目录,将目录名为 file 的文件夹拷贝到 sdio-project\rt-thread\components\utilities\file

测试准备

99ec0122-53bb-11f0-986f-92fbcf53809c.png

这里参照其它单元测试案例写 Kconfig 文件 和 SConscript 文件

Import('rtconfig')frombuilding import*

cwd =GetCurrentDir()src =Glob('*.c')

CPPPATH=[cwd]

group=DefineGroup('FilesUnitTest', src, depend=['RT_USING_FILE_IO_TEST'], CPPPATH=CPPPATH)

Return('group')

menu"File IO Unit Test"

config RT_USING_FILE_IO_TEST bool"RT-Thread File TestCases" defaultn endmenu

99fa64e2-53bb-11f0-986f-92fbcf53809c.png9a0514e6-53bb-11f0-986f-92fbcf53809c.png9a187554-53bb-11f0-986f-92fbcf53809c.png

配置完成后,保存到新的 .config, 并在env工具下执行:

scons--target=mdk5

在KEIL重新编译,烧录,开始测试

6 测试结果

读写的速度跟卡本身,DMA,文件系统等等因素有关,这里仅表示单个文件的读写测试结果。

通过串口助手发送指令 readwrite 来进行测试,MCU接收到指令后,会写入240字节到目标文件

用法:readwrite + [filename]

9a693eb2-53bb-11f0-986f-92fbcf53809c.png

通过串口助手发送指令 writespeed 来进行测试,MCU接收到指令后,会写入1048576(1M)字节到目标文件,并输出计算出的写入速度,速度为565KB/s

用法:writespeed + [filename]

9a76690c-53bb-11f0-986f-92fbcf53809c.png

通过串口助手发送指令 readspeed 来进行测试,MCU接收到指令后,会去读取目标文件,这里测试是紧跟着上一写测试进行的,测试出速度为1938KB/s

用法:readspeed + [filename]

9a8697d2-53bb-11f0-986f-92fbcf53809c.png

9 总结

在RT-Thread的设备驱动框架下,NXP现成的驱动还是十分完善,可以快速的跳过设备的驱动,进而聚焦应用程序的开发。同时RT-Thread的生态十分强大,此次测试组件也是现成的代码,基本上是“零代码”测评。