简介
RT-THREAD很多应用都是基于文件系统的,像micropython等等,提到文件系统,大家都想到的是SDCARD或者SPI FLASH等外挂的文件系统。但是有些小伙伴手上是STM32-nucleo开发板,这类开发板只有核心板,没有其他外设,这个时候想跑文件系统的example就比较麻烦了,这篇文章就是手把手教大家如何在STM32开发板上构建一个on-chip的文件系统。当然这个文件系统也不会很大,根据你的片上FLASH来划分的,这个划分不能把app那部分给格式化掉。可以将FLASH空闲的一块区域作为文件系统。
本文主要面向群体需求:
想用STM32,但是没有外设实现文件系统的
STM32的内部FLASH 有剩余空间的,想利用起来做文件系统的(至少10KB)。
原理讲解
大致意思是,用RT-THREAD中的虚拟文件系统,像elm等文件系统类型,然后采用FAL组件作为底层,然后再讲FLASH操作实现即可。
操作方法
下面我以STM32L496ZG-NUCLEO开发板的使用方式来作为一个操作步骤,其他的STM32系列都可以参考这个方式来添加文件系统。
第一步 选择组件
选择虚拟文件系统elm和FAL组件
选择elm文件系统类型
第二步 配置sector大小
这一步很关键,你需要知道文件系统是以FLASH的块作为擦除的最小单元的,所以文件系统的单位要和你的内部FLASH里面的大小要一致。通过看芯片手册,我们知道L496ZG的FLASH 块大小是0x800(2048),如下图所示,配置块大小为2048。这里需要根据你的STM32的page size来配置,具体要参考你的STM32的芯片手册
第三步 生成编译工程
接下来就是执行命令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不影响到文件系统,每次烧入之后,文件系统里面的内容都还在的哦。
总结
这种方式应该很多大佬都知道,这边我只是总结一下步骤,方便新接触RT-THREAD的小伙伴因为没有能搞起来文件系统而停止前进的步伐。理论上按照上面的步骤操作大部分的只有单芯片的带有内部FLASH的芯片都可以把文件系统加起来,STM32因为官方已经支持drv_flash.c所以更容易。
也欢迎大家来完善一下手上STM32开发板的bsp,将ON-CHIP flash功能加进去。
原作者:Thomas_Fly
|