STM32
登录
直播中
杨雪
7年用户
1100经验值
私信
关注
[问答]
正点原子探索者stm32f407 rt-thread文件系统怎么使用?
开启该帖子的消息推送
正点原子探索者
STM32
f407 rt-thread文件系统怎么使用?
回帖
(1)
王建军
2021-11-25 11:52:32
硬件说明:正点原子探索者stm32f407,板载SPI-FLASH W25Q128
系统说明:RT-Thread 3.1.2(以上的其他版本也可以)
在rt-thread-v3.1.2rt-threadbspstm32stm32f407-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童鞋来说最简单不过了。
[tr]
FinSH 命令
描述
[/tr]
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 = %dn", buf.st_size); else rt_kprintf("text1.txt file not fonudn");}/* 导出到 msh 命令列表中 */MSH_CMD_EXPORT(stat_sample, show text.txt stat sample); 重新编译代码,烧写程序到开发板,然后串口工具输入以下命令:
硬件说明:正点原子探索者stm32f407,板载SPI-FLASH W25Q128
系统说明:RT-Thread 3.1.2(以上的其他版本也可以)
在rt-thread-v3.1.2rt-threadbspstm32stm32f407-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童鞋来说最简单不过了。
[tr]
FinSH 命令
描述
[/tr]
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 = %dn", buf.st_size); else rt_kprintf("text1.txt file not fonudn");}/* 导出到 msh 命令列表中 */MSH_CMD_EXPORT(stat_sample, show text.txt stat sample); 重新编译代码,烧写程序到开发板,然后串口工具输入以下命令:
举报
更多回帖
rotate(-90deg);
回复
相关问答
正点
原子
探索者
STM32F407
上手指南
2021-04-02
3739
怎样去设计一种基于
stm32f407
和Lan8720的
rt-thread
操作
系统
2021-10-26
2017
RT-Thread
文件系统
的基本知识和使用方法
2021-03-30
3655
如何对
stm32F407
探索者
进行测试呢
2021-10-21
971
STM32F407
探索者
如何显示图片?
2020-08-23
1854
MicroPython IDE运行
文件
出错问题请问是什么原因?
2023-02-17
453
使用
正点
原子
f407
-atk-explorer IIC读取at24c02失败是什么原因?
2022-03-28
1825
用
RT-Thread
Studio怎么配置
STM32F407
的TCPSERVER服务呢?
2022-12-29
280
请问有
STM32F407
以太网的相关资料吗?
2019-10-21
1498
如何在
RT-Thread
中利用标准BSD Socket API来开发网络应用
2021-03-30
2763
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分