欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-24 09:06:43
...

硬件说明:正点原子探索者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

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

第二步:进入Hardware Driver Config--->on-chip Peripheral Drivers开启SPI BUS

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

第三步:进入RT-Thread Components--->Device virtual file system开启elm-chan fatfs

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

第四步:配置elm-chan fatfs

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

第五步:保存退出,使用pkgs --update更新代码

然后使用scons --target=mdk5生成Keil mdk5工程文件

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

 

编译成功后,打开工程,编译代码,应该是正常编译,没有错误的。

然后我们修改下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;
}

编译后,烧录程序到开发板中。

串口工具应该会有以下提示:

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

需要注意的是,我这里之前已经格式化过SPI-FLASH了,所以这里就直接挂载成功了。如果是第一次烧写,这里应该是挂载失败的。

挂载失败的话,我们需要重新格式化一次FLASH。

在串口终端输入命令:mkfs -t elm W25Q128

然后输入reboot重启系统即可正常挂载

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

挂载好文件系统后,我们就可以使用文件系统相关的一些命令了。

RT_Thread的Finsh中支持以下跟文件系统相关的命令,这些命令对于熟悉Linux童鞋来说最简单不过了。

FinSH 命令 描述
ls 显示文件和目录的信息
cd 进入指定目录
cp 复制文件
rm 删除文件或目录
mv 将文件移动位置或改名
echo 将指定内容写入指定文件,当文件存在时,就写入该文件,当文件不存在时就新创建一个文件并写入
cat 展示文件的内容
pwd 打印出当前目录地址
mkdir 创建文件夹
mkfs 格式化文件系统

这里做一些简单的串口示范:

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

关于在程序中应用文件系统相关操作:

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);

重新编译代码,烧写程序到开发板,然后串口工具输入以下命令:

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

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);

重新编译代码,烧写程序到开发板,然后串口工具输入以下命令:

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

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);

重新编译代码,烧写程序到开发板,然后串口工具输入以下命令:

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

更多的示例代码可参考RT-Thread帮助文档

相关标签: stm32_rt-thread