文档介绍:该【正点原子探索者stm32f407rtthread文件系统使用】是由【鼠标】上传分享,文档一共【8】页,该文档可以免费在线阅读,需要了解更多关于【正点原子探索者stm32f407rtthread文件系统使用】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。正点原⼦探索者stm32f407rt-threa⽂d件系统使⽤
硬件说明:正点原⼦探索者stm32f407,板载SPI-FLASH W25Q128
系统说明:RT-Thread (以上的其他版本也可以)
在rt-thread-\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⼯程⽂件
编译成功后,打开⼯程,编译代码,应该是正常编译,没有错误的。
⽂件
加⼊挂载⽂件系统的代码:
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 格式化⽂件系统
这⾥做⼀些简单的串⼝⽰范:
关于在程序中应⽤⽂件系统相关操作:
⽂件⽰例,在该⽰例代码中,⾸先会使⽤ open() 函数创建⼀个⽂件 ,并使⽤ write() 函数在⽂件中写⼊字符串“ RT-Thread
Programmer!\n,”然后关闭⽂件。再次使⽤ open() 函数打开 ⽂件,读出其中的内容并打印出来,最后关闭该⽂件。
加函数
static void readwrite_sample(void)
{
int fd, size;
char s[] = "RT-Thread Programmer!", buffer[80];
rt_kprintf("Write string %s to .\n", s);
以/* 创建和读写模式打开 /⽂t 件,如果该⽂件不存在则创建该⽂件 */
fd = open("/", O_WRONLY | O_CREAT);
if (fd>= 0)
{
write(fd, s, sizeof(s));
close(fd);
rt_kprintf("Write done.\n");
}
以/*只 读模式打开 /⽂t 件 */
fd = open("/", O_RDONLY);
if (fd>= 0)
{
size = read(fd, buffer, sizeof(buffer));
close(fd);
rt_kprintf("Read from file : %s \n", buffer);
if (size < 0)
return ;
}
}
/* 导出到 msh命 令列表中 */
MSH_CMD_EXPORT(readwrite_sample, readwrite sample);
重新编译代码,烧写程序到开发板,然后串⼝⼯具输⼊以下命令:
⽂件名⽰例:程序会创建⼀个操作⽂件的函数 rename_sample() 并导出到 msh 命令列表。该函数会调⽤r ename() 函数, 将名为
的⽂件改名为 。
static void rename_sample(void)
{
rt_kprintf("%s => %s", "/", "/");
if (rename("/", "/") < 0)
rt_kprintf("[error!]\n");
else
rt_kprintf("[ok!]\n");
}
/* 导出到 msh命 令列表中 */
MSH_CMD_EXPORT(rename_sample, rename sample);
重新编译代码,烧写程序到开发板,然后串⼝⼯具输⼊以下命令:
3. 获取⽂件状态⽰例,程序会创建⼀个操作⽂件的函数 stat_sample() 并导出到 msh 命令列表。该函数会调⽤s tat() 函数获取 ⽂
件的⽂件⼤⼩信息。⽰例代码如下所⽰:
static void stat_sample(void)
{
int ret;
struct stat buf;
ret = stat("/", &buf);
if(ret == 0)
rt_kprintf(" file size = %d\n", );
else
rt_kprintf(" file not fonud\n");
}
/* 导出到 msh命 令列表中 */
MSH_CMD_EXPORT(stat_sample, show stat sample);
重新编译代码,烧写程序到开发板,然后串⼝⼯具输⼊以下命令:
更多的⽰例代码可参考