潘多拉IoT Board物联网开发板上具有一个使用SPI1驱动的tf卡,原理图如下图所示:
开发板提供的RT-Thread开发包已经包含了BSP驱动,我们只需要使用env工具将所需的驱动添加进来即可使用;env工具的获取和使用方法可参考官方文档https://www.rt-thread.org/document/site/programming-manual/env/env/,这里不作过多介绍,可将env工具添加到右键菜单中方便使用。
添加tf卡驱动和文件系统的操作方法如下:
1.在工程目录下打开 env 工具,输入menuconfig命令配置工程
2.首先在Hardware Drivers Config → Onboard Peripheral Drivers下使能Enable TF_CARD,这个选项会添加BSP_USING_TF_CARD宏定义,同时也会自动打开 RT-Thread Components → Device Drivers中的Using SPI Bus/Device device drivers选项和Using SD/TF card driver with spi选项,添加BSP_USING_SPI1和RT_USING_SPI_MSD两个宏定义;还会打开 RT-Thread Components → Device virtual file system中的Using device virtual file system选项,添加RT_USING_DFS_DEVFS宏定义,如图所示:
3. 在上一步完成打开了RT-Thread的虚拟文件系统VFS,我们使用的TF卡一般是FAT32格式的,所以还需配置VFS使能并配置fatfs文件系统,首先在RT-Thread Components → Device virtual file system中打开Enable elm-chan fatfs选项,打开后会出现fatfs的配置选项elm-chan's FatFs, Generic FAT Filesystem Module --->,进入后可对fatfs进行配置,这里我们打开长文件名支持并选择3LFN缓存在堆上动态分配,并使能可重入支持,详细配置如图:
4.接下来为了实现文件系统的自动挂载,我们可以打开RT-Thread Components → Device virtual file system中的Using mount table for file system选项,这样可以在应用程序源文件中添加文件系统自动挂载表即可实现tf卡文件系统的开机自动挂载,这里将sd0设备挂载到“/”,文件系统为elm-FAT 文件系统,则自动挂载表如下:
#include "dfs_fs.h"
#include "dfs_posix.h"
/* 文件系统自动挂载表 */
const struct dfs_mount_tbl mount_table[]=
{
{"sd0","/","elm",0,0},
{0}
};
当不使用自动挂载功能时应用程序需要开机调用dfs_mount函数挂载sd卡文件系统,这里调用参数为:
/* 挂载TF 卡中的文件系统, 参数elm 表示挂载的文件系统类型为elm-fat 文件系统*/
if (dfs_mount("sd0", "/", "elm", 0, 0) == 0)
{
rt_kprintf("Filesystem initialized!\n");
}
else
{
rt_kprintf("Failed to initialize filesystem!\n");
}
有关RT-Thread虚拟文件系统的详细介绍可以参考官方文档https://www.rt-thread.org/document/site/programming-manual/filesystem/filesystem/
5.以上配置完成了所需宏定义的配置(在rtconfig.h中),然后退出并保存menuconfig配置,输入scons --target=mdk4/mdk5/iar
命令根据所选用的编译器重新生成工程,完成后打开工程文件编译下载到开发板中,在msh中查看帮助可以看到增加了ls,cp,mv,mkdir等自带的文件管理命令,如图所示,可以创建、删除、读写文件进行测试。
这里添加一个文件写入线程测试文件的写入,使用posix文件操作函数:
const char file_rw_name[]="file_rw_test.txt";
/* 文件写线程 */
static void file_w_thread(void *arg)
{
int fd=0,length=0;
static char buffer[1024];
char a='a';
while(1)
{
fd=open(file_rw_name,O_WRONLY|O_CREAT|O_APPEND,0666); //以追加创建方式打开文件
if(fd<0)
{
rt_kprintf("file_w:open file \"%s\" failed!\n",file_rw_name);
}
else
{
memset(buffer, a, sizeof(buffer));
a++;
if(a>'z')
{
a='a';
}
length = write(fd, buffer, sizeof(buffer));
if(length<0)
{
rt_kprintf("write error:%d", rt_get_errno());
}
close(fd); //关闭文件
}
rt_thread_mdelay(1000);
}
}
然后可以通过cat命令查看文件内容是否写入正确。