0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ART-Pi外部SPI Flash使用elmfatfs文件系统流程记录

冬至子 来源:IcyFeather 作者:IcyFeather 2023-11-21 11:39 次阅读

SPI 介绍

SPI 原理:

1.jpg

FAL (Flash Abstraction Layer) Flash 抽象层

1.jpg

DFS (Device File System) 设备虚拟文件系统

DFS 的层次架构图:

1.jpg

ROMFS

ARTPI 外部 SPI Flash

ARTPI 有一个外部 SPI Flash,空间为 16-Mbytes,使用的是 ARTPI 的 SPI1 接口

查阅 Flash 的数据手册可知,扇区大小为 4KB,也就是 4096B:

1.jpg

整体思路

在 meunconfig 中开启 DFS,本教程使用 elmfatfs 文件系统,需要将 elmfatfs 挂载到 RT-Thread 的 DFS 上,所以 elmfatfs 也要开启:

1.jpg

注意要把扇区大小改成上面查阅的 4096:

1.jpg

当然,不要忘记在 meunconfig 中开启 SPI Flash filesystem:

1.jpg

此时 scons --target=mdk5 然后编译下载,运行结果会是这样:

1.jpg

显示两个报错:

一是 Flash 上面的 filesystem 分区(在上方输出的 FAL 分区表种可以找到,对应的定义在 fal_cfg.h 文件中)挂载到 /flash 上失败了;二是 lfs 文件系统没有找到

我们在 filesystem.c 中找到了报错对应的代码:

1.jpg

2.jpg

可以看出来这部分代码是挂载 lfs 文件系统,于是上面报错的原因找到了:我们使用的是 elm-FATFS 系统,需要手动修改一下挂载代码。

1.jpg

我们创建设备的时候是 BLK 设备,要用 fal_blk_device_create 这个函数。

代码修改之后是这样:

1.jpg

2.jpg

3.jpg

照葫芦画瓢写个 elm 系统的挂载,主要的区别有:

1.注册设备用的 fal_blk_device_create 而非 fal_mtd_nor_device_create
2.挂载到 / 而非 /flash
3.文件系统使用 elm 而非 rom

修改完之后重新编译下载,发现依旧报错,运行 ls 查看一下情况,发现是这样:

1.jpg

再次返回查看代码,原来是这里导致的:

1.jpg

使用了 romfs,然后开启了 flash 和 sdcard 两块区域。这里我们需要默认不使用 ROMFS,改成这样:

1.jpg

另外在 menuconfig 中查看,发现这个宏是默认开启的,找到是在 boards/Kconfig 中默认选择了,需要注释掉:

1.jpg

1.jpg

到对应的选项取消掉这个宏:

1.jpg

最终,filesystem.c 的代码完整版如下:

/*

Copyright (c) 2006-2022, RT-Thread Development Team

SPDX-License-Identifier: Apache-2.0

Change Logs:
Date Author Notes
2018-12-13 balanceTWK add sdcard port file 2019-06-11 WillianChan Add SD card hot plug detection
/
#include
#ifdef BSP_USING_FS
#if DFS_FILESYSTEMS_MAX < 4
#error "Please define DFS_FILESYSTEMS_MAX more than 4"
#endif
#if DFS_FILESYSTEM_TYPES_MAX < 4
#error "Please define DFS_FILESYSTEM_TYPES_MAX more than 4"
#endif
#include
#ifdef BSP_USING_SDCARD_FS
#include
#include "drv_sdio.h"
#endif
#ifdef BSP_USING_SPI_FLASH_FS
#include "fal.h"
#endif
#define DBG_TAG "app.filesystem"
#define DBG_LVL DBG_INFO
#include
#ifdef RT_USING_DFS_ROMFS /
默认不使用 ROMFS */
#include "dfs_romfs.h"
static const struct romfs_dirent _romfs_root[] =
{
{ROMFS_DIRENT_DIR, "flash", RT_NULL, 0},
{ROMFS_DIRENT_DIR, "sdcard", RT_NULL, 0}
};
const struct romfs_dirent romfs_root =
{
ROMFS_DIRENT_DIR, "/", (rt_uint8_t )_romfs_root, sizeof(_romfs_root) / sizeof(_romfs_root[0])
};
#endif
#ifdef BSP_USING_SDCARD_FS
/
SD Card hot plug detection pin */
#define SD_CHECK_PIN GET_PIN(D, 5)
static void _sdcard_mount(void)
{
rt_device_t device;
device = rt_device_find("sd0");
if (device == NULL)
{
mmcsd_wait_cd_changed(0);
sdcard_change();
mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
device = rt_device_find("sd0");
}
if (device != RT_NULL)
{
if (dfs_mount("sd0", "/sdcard", "elm", 0, 0) == RT_EOK)
{
LOG_I("sd card mount to '/sdcard'");
}
else
{
LOG_W("sd card mount to '/sdcard' failed!");
}
}
}
static void _sdcard_unmount(void)
{
rt_thread_mdelay(200);
dfs_unmount("/sdcard");
LOG_I("Unmount "/sdcard"");
mmcsd_wait_cd_changed(0);
sdcard_change();
mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
}
static void sd_mount(void parameter)
{
rt_uint8_t re_sd_check_pin = 1;
rt_thread_mdelay(200);
if (rt_pin_read(SD_CHECK_PIN))
{
_sdcard_mount();
}
while (1)
{
rt_thread_mdelay(200);
if (!re_sd_check_pin && (re_sd_check_pin = rt_pin_read(SD_CHECK_PIN)) != 0)
{
_sdcard_mount();
}
if (re_sd_check_pin && (re_sd_check_pin = rt_pin_read(SD_CHECK_PIN)) == 0)
{
_sdcard_unmount();
}
}
}
#endif /
BSP_USING_SDCARD_FS */
int mnt_spi_flash_init(void)
{
struct rt_device flash_dev = RT_NULL;
#ifndef RT_USING_WIFI
fal_init();
#endif
flash_dev = fal_blk_device_create("filesystem");
if (flash_dev)
{
//mount filesystem
if (dfs_mount(flash_dev->parent.name, "/", "elm", 0, 0) != 0)
{
LOG_W("mount to '/' failed! try to mkfs %s", flash_dev->parent.name);
dfs_mkfs("elm", flash_dev->parent.name);
if (dfs_mount(flash_dev->parent.name, "/", "elm", 0, 0) == 0)
{
LOG_I("mount to '/' success!");
}
}
else
{
LOG_I("mount to '/' success!");
}
}
else
{
LOG_E("Can't create block device filesystem or bt_image partition.");
}
}
int mount_init(void)
{
#ifdef RT_USING_DFS_ROMFS /
默认不使用ROMFS */
if (dfs_mount(RT_NULL, "/", "rom", 0, &(romfs_root)) != 0)
{
LOG_E("rom mount to '/' failed!");
}
#endif
#ifdef BSP_USING_SPI_FLASH_FS
mnt_spi_flash_init();
#if 0
struct rt_device flash_dev = RT_NULL;
#ifndef RT_USING_WIFI
fal_init();
#endif
flash_dev = fal_mtd_nor_device_create("filesystem");
if (flash_dev)
{
//mount filesystem
if (dfs_mount(flash_dev->parent.name, "/flash", "lfs", 0, 0) != 0)
{
LOG_W("mount to '/flash' failed! try to mkfs %s", flash_dev->parent.name);
dfs_mkfs("lfs", flash_dev->parent.name);
if (dfs_mount(flash_dev->parent.name, "/flash", "lfs", 0, 0) == 0)
{
LOG_I("mount to '/flash' success!");
}
}
else
{
LOG_I("mount to '/flash' success!");
}
}
else
{
LOG_E("Can't create block device filesystem or bt_image partition.");
}
#endif
#endif
#ifdef BSP_USING_SDCARD_FS
rt_thread_t tid;
rt_pin_mode(SD_CHECK_PIN, PIN_MODE_INPUT_PULLUP);
tid = rt_thread_create("sd_mount", sd_mount, RT_NULL,
2048, RT_THREAD_PRIORITY_MAX - 2, 20);
if (tid != RT_NULL)
{
rt_thread_startup(tid);
}
else
{
LOG_E("create sd_mount thread err!");
}
#endif
return RT_EOK;
}
INIT_APP_EXPORT(mount_init);
#endif /
BSP_USING_FS */

重新生成、编译、下载,运行结果如下:

1.jpg

大功告成!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1700

    浏览量

    91297
  • RT-Thread
    +关注

    关注

    31

    文章

    1272

    浏览量

    39906
  • FatFS文件系统

    关注

    0

    文章

    12

    浏览量

    7518
  • DFS
    DFS
    +关注

    关注

    0

    文章

    26

    浏览量

    9151
  • ART-Pi
    +关注

    关注

    0

    文章

    23

    浏览量

    1284
收藏 人收藏

    评论

    相关推荐

    ART-Pi Smart开发板开箱及爱之初次体验

    ART-Pi Smart 开发板初次尝鲜,ART-Pi Smart开箱及初次体验内置应用.
    的头像 发表于 05-03 16:25 4957次阅读
    <b class='flag-5'>ART-Pi</b> Smart开发板开箱及爱之初次体验

    ART-Pi Studio工程下NimBLE软件包的使用

    本文主要介绍 ART-Pi Studio 工程下 NimBLE 软件包的使用
    的头像 发表于 08-26 10:31 1643次阅读

    怎样在ART-Pi H750上移植TouchGFX呢

    QSPI-FLASH烧录算法在ART-Pi H750上移植TouchGFX(三)——移植TouchGFX到RT-Thread系统ART-Pi H750上移植TouchGFX(四)——
    发表于 02-22 06:01

    Art_Pi学习笔记汇总

    1、Art-Pi学习笔记1:驱动SDIO和USB设备做TF读卡器操作系统:WIN10开发平台:RT-Thread StudioOS版本:4.0.3之前在某宝入手了一片H743的开发板,卖家虽然提供了
    发表于 03-18 14:27

    基于ART-Pi Smart平台的设计方案推荐

    ART-Pi Smart 平台上实现视频播放功能;由于ART-Pi Smart 没有音频模块,所以没有实现音频的解码播放。在上一篇分享中,我们在 ART-Pi Smart 平台上实现了视频解码
    发表于 03-24 16:56

    ART-PI在MDK中使用SDIO设备的方法

    一、ENV使能SDIO1.1.在kconfig增加配置因为ART-PI的SDIO2连接的是wifi,所以这里我们使用SDIO1。1.2.ENV中使能SDIO1.3.使能文件系统1.4.使用SD设备
    发表于 04-11 10:07

    使用ART-Pi ST-LINK的步骤教程

    J-LINK下载Segger STLinkReflash小工具(ART-Pi 硬件交流群文件有,想了解更多ART-PI请加QQ群: 1016035998)。启动STLinkReflash.exe,后
    发表于 04-11 10:10

    关于ART-PI的基本使用例程简单描述

    ,Download选项部分表示,将生成的文件下载至外部QSPI Flash中。5.通过XShell Serial COM9连接ART-PI6.输入ifconfig确认网卡状态7.确认P
    发表于 06-01 15:06

    ART-PI文件系统SPI Flash上的使用

    1、文件系统SPI Flash上的使用  ENV使能SPI_Flash  添加Kconfig配置  menu “Onboard Peripheral Drivers”  config
    发表于 09-22 15:18

    ART-PI编译报错提示flash溢出如何解决

    ART-PI 芯片flash太小只有128k,编译报错,提示flash 溢出如何解决,工程是通过stm32cube mx生成的帮忙看看谢谢提示,H750.elf section .rodata
    发表于 12-29 14:57

    ART-PI挂载文件系统,终端报错怎么解决?

    ART-PI 挂载文件系统,终端报错,用list_device能够显示sd0
    发表于 08-20 15:59

    SPI外部FLASH文件系统

    本文档使用 TAB = 4 对齐,使用keil5默认配置打开阅读比较方便。 【*】程序简介 -工程名称:SPI-外部文件系统 -实验平台: 秉火STM32 F429 开发板 -MDK版本:5.16
    发表于 12-13 15:16 5次下载
    <b class='flag-5'>SPI</b>—<b class='flag-5'>外部</b><b class='flag-5'>FLASH</b><b class='flag-5'>文件系统</b>

    【STM32H750】玩转ART-Pi(一)——使用STM32CUBMX生成TouchGFX工程

    QSPI-FLASH烧录算法在ART-Pi H750上移植TouchGFX(三)——移植TouchGFX到RT-Thread系统ART-Pi H750上移植TouchGFX(四)——
    发表于 12-28 19:20 10次下载
    【STM32H750】玩转<b class='flag-5'>ART-Pi</b>(一)——使用STM32CUBMX生成TouchGFX工程

    【技术三千问】之《玩转ART-Pi》,看这篇就够了!

    2.在 ART-Pi 平台有没有人成功使用 openocd 可以直接烧写到外部 Quad spi flash 的?[链接]
    发表于 01-25 18:44 2次下载
    【技术三千问】之《玩转<b class='flag-5'>ART-Pi</b>》,看这篇就够了!

    RT-Thread外部SPI Flash分区挂载为U盘

    首先需要配置好ART-Pi 外部 16MB SPI Flash 挂载为FatFS 文件系统文件系统
    发表于 04-06 10:02 2025次阅读
    RT-Thread<b class='flag-5'>外部</b><b class='flag-5'>SPI</b> <b class='flag-5'>Flash</b>分区挂载为U盘