1.按照官方文档得知,需要参考这三个文件,进行新增修改处理。

2.我的是STM32L496,所以我新增了这三个文件,分别到fal/inc下和fal/src下,fal目录下的SConscipt脚本中,注释掉了这两句话,因为已经将src和inc下的文件添加到工程中了,后面的语句

3.修改fal_cfg.h,分区定义成我想要的,首先片上的定义了1MB,一个分区。片外的spi flash定义了两个分区,一个15MB,一个1MB。

4、修改fal_flash_sfud_port.c,此文件时对片外的flash进行定义,他使用了sfud框架,这种串行方式是兼容几乎所有的片外flash的无敌操作方式。所以里面的函数基本不用改,只需要改定义的大小,我的spi flash 是16MB,所以修改为16MB大小。

5、修改fal_flash_stm32l4_port.c文件,此文件是对片上的flash操作的方式方法定义

1)头文件包含自己的hal库文件。

2)因为我的bsp包中hal库文件,有对片上flash的读写接口,所以我将此文件中的读写接口调用我们hal接口即可

修改片上flash大小为我要用的1MB大小

6、之后编译报错,同时上述几个函数找不到,原因是我应该包含HAL_Drivers下的druvers里drv_flash中的drv_flash.h文件,不是hal的头文件。

修改后编译报错,提示此文件找不到

是因为libraries下的HAL_Drivers驱动中的drivers中的SConscript脚本中,因BSP_USING_ON_CHIP_FLAS宏没有打开,头文件路径没再环境中

所以要改下此目录下的Kconfg,让menuconfig配置时,将BSP_USING_ON_CHIP_FLASH可打开

修改后menuconfig,将宏打开后,保存退出menuconfig

重新scons --target=iar生成工程,编译报错,因为我将stm32f2_onchip变量改成了l4,但没全改完,改成l4后,和fal_flash_stm32l4_port.c中定义的一样后,编译通过

主函数调用这个代码

烧录运行报错,提示片外的flash没找到

定位到是在此文件报错,将不符合的值打出来看下什么

打印后此值为45,应该是块设备的值才对,说明这个变量赋值没赋值好。

不应该强制更改rt_spi_device->parent.type这个值,要找到原因,原因是sfud驱动的rt_sfud_flash_probe_ex函数去注册这个设备为块类型

增加drv_qspi_flash驱动文件,文件里增加加此代码,让menuconfig时,可配置,系统起来时自动运行此函数,让其注册W25Q128设备,使用SFUD探测qspi0从这个flash设备,注册该设备为块类型。rt_spi_bus_attach_device_cspin,SPI 驱动会注册 SPI 总线,SPI 设备需要挂载到已经注册好的 SPI 总线上,此函数用于挂载一个 SPI 设备到指定的 SPI 总线,并向内核注册 SPI 设备。并且可以依赖RT-Thread的PIN框架来绑定SPI的片选引脚(cs_pin),避免了不同bsp的上层应用对片选引脚操作不统一的问题。一般 SPI 总线命名原则为 spix, SPI 设备命名原则为 spixy ,如 spi10 表示挂载在 spi1 总线上的 0 号设备。cs_pin可以通过PIN框架rt_pin_get函数来获取,也可以使用BSP级提供的GET_PIN宏定义来获取。user_data 在用户使用不到的情况下可以设置为RT_NULL。

Kconfig

Sconscript脚本

之后编译运行报错

原因是虽然添加了drv_qspi.c文件,但是该文件的宏没打开,导致qspi总线没有注册上

利用kconfig,将BSP_USING_QSPI宏打开,

重新menuconfig配置后,生成工程,编译烧录运行,提示数据长度配置不对

是因为挂载 SPI 设备到 SPI 总线后没有配置 SPI 设备的传输参数。

rt_err_t rt_spi_configure(struct rt_spi_device *device, struct rt_spi_configuration *cfg)

可以参考spi_flash_sfud.c中的默认配置

增加如下代码

编译烧录后,测试正常

但是后来主函数崩了

定位崩溃原因是因为,qspi总线注册时,关于enter_qspi_mode这个函数指针指向了非法地址处,这个是切换qspi总线模式的,我先给他赋值为NULL

编译烧录后,fal初始化时提示片外的flash没找到,应该是块设备,但不知道为什么到了这值变成了230多,应该是1

查问题找到原因,因为我使用sfud框架的spi探测spi设备时,将flash注册的设备名字注册为W25Q128,但fal_init初始化去查找flash设备时,用的名字是norflash0,所以导致没有成功找到flash设备

将探测并注册flash设备的名称改为norflash0后正常,编译烧录测试正常,至此基于STM32L496,使用rt-thread5.1.0源码自动生成的工程,就将spi flash(w25q128)+liffies文件系统挂载好了。

/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-5-22 Rain Park first version
* 2023-12-03 Meco Man support nano version
*/ #include <board.h>
#include <rtthread.h>
#include <drv_gpio.h>
#ifndef RT_USING_NANO
#include <rtdevice.h>
#endif /* RT_USING_NANO */ #define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h> #include <fal.h>
#include <dfs_fs.h> /* 当需要使用文件操作时,需要包含这个头文件 */
#include <unistd.h> #define FS_PARTITION_NAME "filesystem" #define LED0_PIN GET_PIN(E, 9) void filesystem_init(void)
{
struct rt_device *mtd_dev = RT_NULL; /* 初始化 fal */
fal_init();
/* 生成 mtd 设备 */
mtd_dev = fal_mtd_nor_device_create(FS_PARTITION_NAME); if (!mtd_dev)
{
LOG_E("Can't create a mtd device on '%s' partition.", FS_PARTITION_NAME);
}
else
{
/* 挂载 littlefs */
if (dfs_mount(FS_PARTITION_NAME, "/", "lfs", 0, 0) == 0)
{
LOG_I("Filesystem initialized!");
}
else
{
/* 格式化文件系统 */
dfs_mkfs("lfs", FS_PARTITION_NAME); /* 挂载 littlefs */
if (dfs_mount("filesystem", "/", "lfs", 0, 0) == 0)
{
LOG_I("Filesystem initialized!");
}
else
{
LOG_E("Failed to initialize filesystem!");
}
}
} } void file_read_write_test(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 ;
} } int main(void)
{
int count = 1;
/* set LED0 pin mode to output */
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); filesystem_init(); file_read_write_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;
}

2.8 rt-thread spi flash挂载w25q128 littliefs补充的更多相关文章

  1. RT Thread SPI设备 使用

    后记: 之前,我把SPI的片选在Cubemx中配置成了SPI_NSS.现在我给它改为了GPIO_OUTPUT.  同时参考了别人的类似的一个操作无线模块(采用SPI设备驱动)的例子程序(清楚了RTT的 ...

  2. RT Thread 通过ENV来配置SFUD,操作SPI Flash

    本实验基于正点原子stm32f4探索者板子 请移步我的RT Thread论坛帖子. https://www.rt-thread.org/qa/forum.php?mod=viewthread& ...

  3. Jlink使用技巧之烧写SPI Flash存储芯片

    前言 大多数玩单片机的人都知道Jlink可以烧写Hex文件,作为ARM仿真调试器,但是知道能烧写SPI Flash的人应该不多,本篇文章将介绍如何使用JLink来烧写或者读取SPI Flash存储器, ...

  4. RTT下spi flash+elm fat文件系统移植小记

    背景: MCU:STM32F207 SPI flash: Winbond W25Q16BV OS: RTT V1.1.1 bsp: STM32F20x 1 将spi_core.c,spi_dev.c及 ...

  5. spi flash偶尔出现写入错误的情况

    spi flash W25Q128会偶尔出现写入错误的情况,会发现读出的值和写入的值不一致,需加入2次读出比较判断. W25QXX_Read(&temp_date_count,0x000000 ...

  6. openwrt spi flash 分区适配过程

    openwrt spi flash 分区适配过程 这里基于 openwrt mt7620a 平台来跟踪,主要是想理清 dts 里的分区描述是如何一步步转化成内核分区行为. 先来看看 dts 中关于分区 ...

  7. RTThread DFS文件系统使用: 基于使用SFUD驱动的SPI FLASH之上的ELM FATFS文件系统

    参考博文: 博文很长,但是实际要操作的步骤没几下. http://m.elecfans.com/article/730878.html  为了防止几年后文章链接找不到,我把文章复制过来了 /***** ...

  8. 【原创】All in One i.MXRT1050/RT1020 SPI Flash Algorithm for J-Flash

    2020年,这个给大家一种很漫长的恍惚感的一年,终于是过去了.这一年我们很多新的人生第一次就这么被发生了,第一次居家办公这么长时间(很多人肥膘都长了不少,我却瘦了2斤,不知是工作太积极了还是被家里小怪 ...

  9. Nand Flash,Nor Flash,CFI Flash,SPI Flash 之间的关系

    前言:    在嵌入式开发中,如uboot的移植,kernel的移植都需要对Flash 有基本的了解.下面细说一下标题中的中Flash中的关系 一,Flash的内存存储结构    flash按照内部存 ...

  10. 【iCore、iCore2 双核心板】EPCS 实验(SPI Flash)(基于Verilog语言)

    _____________________________________ 深入交流QQ群: A: 204255896(1000人超级群,可加入) B: 165201798(500人超级群,满员) C ...

随机推荐

  1. C# system.Threading.Timer和system.Timers中的定时器

    它们都可以用于在指定时间间隔后执行代码.然而,它们在实现和用法上有一些差异. System.Threading.Timer: System.Threading.Timer 是基于线程的定时器,它属于 ...

  2. Postgresql12主备流复制操作过程以及原理【pg_basebackup】

    原理介绍:流复制(Streaming Replication).流复制提供了将 WAL 记录连续发送并应用到从服务器以使其保持最新状态的功能.通过流复制,从服务器不断从主服务器同步相应的数据, 同时, ...

  3. .NET AI 生态关键拼图:全面解读 AI Extensions 和 Vector Extensions 如何重塑.NET开发生态

    引言 关注.NET AI和.NET Vector原生开发已有半年之久了,其核心组件在历经这半年预发布期的持续迭代后,终于于5月16日和5月20日逐步发布了..在此之前,基于预发布版本撰写的文章和调试工 ...

  4. FastDFS分布式文件服务器搭建以及Golang和Python调用

    FastDFS 1.介绍 FastDFS是基于http协议的分布式文件系统,其设计理念是一切从简.主要解决了海量数据存储的问题,特别适合系统中的中小文件的存储和在线服务.中小文件的范围大致为4KB-5 ...

  5. 一个开源免费、功能丰富的 WPF 自定义控件资源库

    前言 今天大姚给大家分享一个开源免费(MIT license).功能丰富的 WPF 自定义控件资源库:WPF-ControlBase. WPF 介绍 WPF 是一个强大的桌面应用程序框架,用于构建具有 ...

  6. AI 运维诊断全攻略,深入浅出 OceanBase 系列直播重磅来袭!

    社区的 #数据库 与 #AI 爱好者们 当 SQL 遇见 AI 的系列直播即将开启! 今晚 19:30,聚焦#AI 时代的运维与诊断,带你共享 #大模型辅助数据库运维 的一线实战经验,探索 #Ocea ...

  7. 十三、buildroot 系统package新增应用 编写步骤

    4.7.package 添加配置文件 4.7.1.操作步骤 1.集成普通包 如 my-custom-package 在 my-custom-package 目录中创建 Config.in 文件 con ...

  8. ES索引迁移优化:3倍速ReIndex + 零感知切换

    在大模型驱动的时代,向量模型.索引抽取模型.文本切分模型(chunking)的迭代速度令人目不暇接,几乎每几个月就要升级一次.随之而来的,是Elasticsearch索引结构的频繁变更需求.然而,ES ...

  9. JavaScript Quine揭秘:如何让程序输出自身源代码?

    介绍 如何写一段javascript程序,输出自身的源代码?这个问题非常有意思,大家不妨先尝试一下,反正在尝试了半个小时之后,我果断放弃了. 这种能输出自身的程序在英文里被称为quine. 准备知识 ...

  10. C# 对字符串进行UrlEncode/UrlDecode

    https://www.cnblogs.com/li150dan/p/13492280.html //对字符进行UrlEncode编码 string text= System.Web.HttpUtil ...