Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
BSP
flash
STM32
[dfs][on-chip]如何不用外设在STM32片上FLASH做一个文件系统
发布于 2022-06-09 00:15:40 浏览:2106
订阅该版
[tocm] ## 简介 RT-THREAD很多应用都是基于文件系统的,像micropython等等,提到文件系统,大家都想到的是SDCARD或者SPI FLASH等外挂的文件系统。但是有些小伙伴手上是STM32-nucleo开发板,这类开发板只有核心板,没有其他外设,这个时候想跑文件系统的example就比较麻烦了,这篇文章就是手把手教大家如何在STM32开发板上构建一个on-chip的文件系统。当然这个文件系统也不会很大,根据你的片上FLASH来划分的,这个划分不能把app那部分给格式化掉。可以将FLASH空闲的一块区域作为文件系统。 本文主要面向群体需求: - 想用STM32,但是没有外设实现文件系统的 - STM32的内部FLASH 有剩余空间的,想利用起来做文件系统的(至少10KB)。 ## 原理讲解 原理可以参考一下文档中心的文档[虚拟文件系统](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/filesystem/filesystem) 大致意思是,用RT-THREAD中的虚拟文件系统,像elm等文件系统类型,然后采用FAL组件作为底层,然后再讲FLASH操作实现即可。 ## 操作方法 下面我以STM32L496ZG-NUCLEO开发板的使用方式来作为一个操作步骤,其他的STM32系列都可以参考这个方式来添加文件系统。 ### 第一步 选择组件 选择虚拟文件系统elm和FAL组件 ![在这里插入图片描述](https://img-blog.csdnimg.cn/10ec8bfade3b4771ace42d92f7f5d343.png#pic_center) 选择elm文件系统类型 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d10317ebe4594479bc5f005b947c2753.png#pic_center) ### 第二步 配置sector大小 这一步很关键,你需要知道文件系统是以FLASH的块作为擦除的最小单元的,所以文件系统的单位要和你的内部FLASH里面的大小要一致。通过看芯片手册,我们知道L496ZG的FLASH 块大小是0x800(2048),如下图所示,配置块大小为2048。这里需要根据你的STM32的page size来配置,具体要参考你的STM32的芯片手册 ![在这里插入图片描述](https://img-blog.csdnimg.cn/dd4b7c51f0294c9d8ae3629d629c04bb.png#pic_center) ### 第三步 生成编译工程 接下来就是执行命令`scons --target=mdk5` 来生成KEIL工程了,这边编译会报错,缺少fal_cfg.h文件 这边根据fal文档中样例的说明提供一个example,讲fal_cfg.h放到bsp的board目录下面 这边需要注意的是后面那个flash部分的大小,STM32L496ZG是1M 内部flash,我把这个1M分成两块,一块前面的512KB存放APP(这部分可以根据的代码量大小进行缩小,注意不能小于你生成bin的大小,否则会影响app正常运行), 后面512KB我把它设置成flash 设备,进行文件系统操作。 ``` #ifndef _FAL_CFG_H_ #define _FAL_CFG_H_ #include
#include
extern const struct fal_flash_dev stm32_onchip_flash; /* flash device table */ #define FAL_FLASH_DEV_TABLE \ { \ &stm32_onchip_flash \ } /* ====================== Partition Configuration ========================== */ #ifdef FAL_PART_HAS_TABLE_CFG /* partition table */ #define FAL_PART_TABLE \ { \ {FAL_PART_MAGIC_WORD, "app", "onchip_flash", 0, 512*1024, 0}, \ {FAL_PART_MAGIC_WORD, "flash", "onchip_flash", 512*1024, 512*1024, 0}, \ } #endif #endif /* _FAL_CFG_H_ */ ``` ### 第四步 添加加载代码 根据文档中心的说明,我们需要添加如下代码,这个代码可以暂时放到main.c里面测试使用 ``` int main(void) { fal_init(); #define FS_PARTITION_NAME "flash" struct rt_device *mtd_dev; mtd_dev = fal_blk_device_create(FS_PARTITION_NAME); if (dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == 0) { rt_kprintf("Filesystem initialized!"); } else { dfs_mkfs("elm", FS_PARTITION_NAME); if (dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) != 0) { rt_kprintf("Failed to initialize filesystem!"); } } /* set LED2 pin mode to output */ rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT); while (1) { rt_pin_write(LED2_PIN, PIN_HIGH); rt_thread_mdelay(500); rt_pin_write(LED2_PIN, PIN_LOW); rt_thread_mdelay(500); } } ``` ### 第五步 编译下载 接下来就是编译下载测试环节了。按照下面的命令操作,就可以看到文件系统起来了。由于文件系统并不一定影响到app,所以只要你的app不影响到文件系统,每次烧入之后,文件系统里面的内容都还在的哦。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/a31cce2c0af44f78928e6ff35ae557e5.png#pic_center) ## 总结 这种方式应该很多大佬都知道,这边我只是总结一下步骤,方便新接触RT-THREAD的小伙伴因为没有能搞起来文件系统而停止前进的步伐。理论上按照上面的步骤操作大部分的只有单芯片的带有内部FLASH的芯片都可以把文件系统加起来,STM32因为官方已经支持drv_flash.c所以更容易。 也欢迎大家来完善一下手上STM32开发板的bsp,将ON-CHIP flash功能加进去。 具体如何完善,可以参考我这个PR https://github.com/RT-Thread/rt-thread/pull/6056 本文已参与「开源摘星计划」,欢迎正在阅读的你加入。 活动链接: https://github.com/weopenprojects/WeOpen-Star
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
RTT_逍遥
https://github.com/supperthomas
文章
37
回答
503
被采纳
76
关注TA
发私信
相关文章
1
STM32 407 串口接收数据 系统卡死
2
RTT nrf24l01 设备驱动程序
3
stm32f10x串口只能发送数据,无法接收
4
第一次尝试移植rt-thread 到stm32F103系列问题
5
有人把stm32L07xx的bsp移到rtt上来了吗?求一个
6
rt-thread线程调度异常在stm32f103芯片上
7
RTT是否支持STM32F429
8
请问谁有 STM32F40x HAL + RT-THREAD 模板
9
rt-thread在stm32f411下的移植问题
10
针对STM32F7系列平台的MPU,Cache特性,需要注意哪些问题?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
7
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
张世争
1
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
2
次点赞
Ghost_Girls
1
篇文章
6
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部