STM32
直播中

杨雪

7年用户 1103经验值
私信 关注
[问答]

正点原子探索者stm32f407 rt-thread文件系统怎么使用?

正点原子探索者STM32f407 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); 重新编译代码,烧写程序到开发板,然后串口工具输入以下命令:


举报

更多回帖

发帖
×
20
完善资料,
赚取积分