战舰V3系列04:添加spi flash驱动及文件系统
本系列以 oneos2.3.0 提供的 STM32F103ZE 模板为基础,将 oneos 在战舰 V3 上运行起来,并逐步适配相关外设,计划周更
本系列相关代码将上传 gitee 供测试体验,仓库: https://gitee.com/dreamfly233/OneOS/tree/projects_OneOS-v2.3.0/
这是本系列的第4期,添加spi flash驱动,并进行挂载文件系统的实验,同时实现与SD卡同时挂载使用
参考文档:
准备项:
复制上个教程的sstm32f103zet6-atk-warship_v3-sdcard文件夹,并重命名为stm32f103zet6-atk-warship_v3-sdcard-spiflash
cubemx配置:
下面是战舰V3 spi flash部分的原理图:
F_CS片选引脚为PB12
打开projects\stm32f103zet6-atk-warship_v3-sdcard-spiflash\board\CubeMX_Config 下 的 cubemx 工程文件(CubeMX_Config.ioc),参照原理图进行配置:
勾选使能SPI2的中断:
检查spi的配置参数,一般默认即可
完成以上配置后点击GENERATE CODE生成代码
menuconfig配置及生成工程
在stm32f103zet6-atk-warship_v3-sdcard-spiflash文件夹打开oneos-cube并进入menuconfig
定位到 Drivers→ SPI下,勾选Using SPI Bus/Device device drivers
定位到Drivers→ SFLASH,勾选support sflash drivers项
- spiflash的日志同样依赖dlog输出,若上一步勾选了sflash debug information项,确保dlog已勾选即可
定位到Drivers→ SFLASH→ support sflash drivers → sflash supporte pre-defined chip info项,勾选上自己的spi flash型号,多余的型号可不勾选:
- 注意:战舰开发板前期为W25Q128,后期可能为NM25Q128,根据板上丝印自行确定
确保这里的文件系统已使能:
按esc退出保存配置,并使用scons --ide=mdk5生成mdk工程
打开project.uvprojx工程
分区表在board\ports\fal_cfg.c文件,参考下图修改(注意,该文件在fal_part.c通过include被包含,该.c文件无需也不能手动加入工程编译)
w25q128:128Mb(16兆字节)的分区表参考
编译下载,可在shell看到启动信息和分区表
如下图:这里识别到了flash型号W25Q128
在shell中使用device查看生成的设备:
这里不太明白sfbus.spi2被注册为字符设备的作用
spi挂载文件系统测试
- 注意:spi flash需要在挂载前通过分区名创建块设备,使用fal_blk_device_create函数
由于需要同时挂载2个设备,将sdmmc_test.c从工程移除,新建一个fs_mount_manage.c并加入工程
创建一个mount函数和对应的unmount函数管理设备挂载,简单参考Linux的mount命令实现:
使用方式:在shell使用mount/unmount命令实现挂载/卸载文件系统
我们先简单测试一下将spi flash挂载到根目录,使用 “mount filesystem /” 命令将filesystem块设备挂载到根目录:
- 注意:首次使用spi flash前需要在filesystem块设备上创建文件系统,若挂载失败,尝试调用mkfs命令创建文件系统再次挂载:“mkfs -t fat filesystem”
- mkfs命令将格式化该块设备,确保没有重要文件(若操作sd0将对SD卡进行格式化)
若要挂载SD卡,可以卸载spi flash,然后挂载sd0:
若要同时挂载,需要先将一个设备挂载到根目录,若挂载路径不存在,则需要创建另一个设备的挂载路径(即创建文件夹),然后将另一设备挂载到该路径:
此时SD卡和spi flash均已挂载,可以正常操作SD卡和spi flash内的文件,或互相拷贝、移动文件