正点原子探索者stm32f407 rt-thread 文件系统使用
硬件说明:正点原子探索者stm32f407,板载SPI-FLASH W25Q128
系统说明:RT-Thread 3.1.2(以上的其他版本也可以)
在rt-thread-v3.1.2\rt-thread\bsp\stm32\stm32f407-atk-explorer下,打开env配置工具,
第一步:进入Hardware Driver Config--->Onboard Peripheral Drivers开启SPI FLASH
第二步:进入Hardware Driver Config--->on-chip Peripheral Drivers开启SPI BUS
第三步:进入RT-Thread Components--->Device virtual file system开启elm-chan fatfs
第四步:配置elm-chan fatfs
第五步:保存退出,使用pkgs --update更新代码
然后使用scons --target=mdk5生成Keil mdk5工程文件
编译成功后,打开工程,编译代码,应该是正常编译,没有错误的。
然后我们修改下main.c文件
加入挂载文件系统的代码:
void spiflash_test(void)
{
rt_device_t dev;
dev = rt_device_find("W25Q128");
RT_ASSERT(dev != RT_NULL);
if (dev != RT_NULL)
{
/* Filesystem Initialization */
#if defined(RT_USING_DFS) && defined(RT_USING_DFS_ELMFAT)
/* mount sd card fat partition 1 as root directory */
//需要格式化完后才可以
if (dfs_mount("W25Q128", "/", "elm", 0, 0) == 0)
{
rt_kprintf("File System initialized!\n");
}
else
{
rt_kprintf("File System initialzation failed!\n");
}
#endif /* RT_USING_DFS && RT_USING_DFS_ELMFAT */
}
}
然后在main函数中调用即可
int main(void)
{
int count = 1;
/* set LED0 pin mode to output */
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
spiflash_test();//测试文件系统代码
while (count++)
{
rt_pin_write(LED0_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED0_PIN, PIN_LOW);
rt_thread_mdelay(500);
}
return RT_EOK;
}
编译后,烧录程序到开发板中。
串口工具应该会有以下提示:
需要注意的是,我这里之前已经格式化过SPI-FLASH了,所以这里就直接挂载成功了。如果是第一次烧写,这里应该是挂载失败的。
挂载失败的话,我们需要重新格式化一次FLASH。
在串口终端输入命令:mkfs -t elm W25Q128
然后输入reboot重启系统即可正常挂载
挂载好文件系统后,我们就可以使用文件系统相关的一些命令了。
RT_Thread的Finsh中支持以下跟文件系统相关的命令,这些命令对于熟悉Linux童鞋来说最简单不过了。
FinSH 命令 | 描述 |
---|---|
ls | 显示文件和目录的信息 |
cd | 进入指定目录 |
cp | 复制文件 |
rm | 删除文件或目录 |
mv | 将文件移动位置或改名 |
echo | 将指定内容写入指定文件,当文件存在时,就写入该文件,当文件不存在时就新创建一个文件并写入 |
cat | 展示文件的内容 |
pwd | 打印出当前目录地址 |
mkdir | 创建文件夹 |
mkfs | 格式化文件系统 |
这里做一些简单的串口示范:
关于在程序中应用文件系统相关操作:
1.读写文件示例,在该示例代码中,首先会使用 open()
函数创建一个文件 text.txt,并使用 write() 函数在文件中写入字符串 “RT-Thread Programmer!\n”
,然后关闭文件。再次使用 open()
函数打开 text.txt 文件,读出其中的内容并打印出来,最后关闭该文件。在main.c中增加函数
static void readwrite_sample(void)
{
int fd, size;
char s[] = "RT-Thread Programmer!", buffer[80];
rt_kprintf("Write string %s to test.txt.\n", s);
/* 以创建和读写模式打开 /text.txt 文件,如果该文件不存在则创建该文件 */
fd = open("/text.txt", O_WRONLY | O_CREAT);
if (fd>= 0)
{
write(fd, s, sizeof(s));
close(fd);
rt_kprintf("Write done.\n");
}
/* 以只读模式打开 /text.txt 文件 */
fd = open("/text.txt", O_RDONLY);
if (fd>= 0)
{
size = read(fd, buffer, sizeof(buffer));
close(fd);
rt_kprintf("Read from file test.txt : %s \n", buffer);
if (size < 0)
return ;
}
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(readwrite_sample, readwrite sample);
重新编译代码,烧写程序到开发板,然后串口工具输入以下命令:
2.更改文件名示例:程序会创建一个操作文件的函数 rename_sample()
并导出到 msh 命令列表。该函数会调用 rename()
函数, 将名为 text.txt 的文件改名为 text1.txt。在main.c中增加测试代码
static void rename_sample(void)
{
rt_kprintf("%s => %s", "/text.txt", "/text1.txt");
if (rename("/text.txt", "/text1.txt") < 0)
rt_kprintf("[error!]\n");
else
rt_kprintf("[ok!]\n");
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(rename_sample, rename sample);
重新编译代码,烧写程序到开发板,然后串口工具输入以下命令:
3. 获取文件状态示例,程序会创建一个操作文件的函数 stat_sample()
并导出到 msh 命令列表。该函数会调用 stat()
函数获取 text1.txt 文件的文件大小信息。在main.c中增加示例代码如下所示:
static void stat_sample(void)
{
int ret;
struct stat buf;
ret = stat("/text1.txt", &buf);
if(ret == 0)
rt_kprintf("text1.txt file size = %d\n", buf.st_size);
else
rt_kprintf("text1.txt file not fonud\n");
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(stat_sample, show text.txt stat sample);
重新编译代码,烧写程序到开发板,然后串口工具输入以下命令:
更多的示例代码可参考RT-Thread帮助文档
上一篇: 关于MySQL外键的简单学习教程
下一篇: 微信支付开发维权通知实例