RT-Thread配置SPI-Flash(W25Q256)

RT-Thread配置SPI-Flash(W25Q256)

1.开启SPI总线

新建一个空白的RT-Thread项目,本文基于STM32F103芯片。
首先在drivers目录下打开board.h文件,找到SPI对应部分。根据指导,一步一步做下去。

在这里插入图片描述

1.1打开SPI及SFUD

打开RT-Thread Settings,点击更多配置来到组件一栏,勾选如下。

在这里插入图片描述

1.2打开SPI宏定义

board.h文件中,打开SPI宏定义。

在这里插入图片描述

1.3产生初始化函数

使用stm32cubemx产生初始化函数,将其粘贴于board.c文件末尾。

在这里插入图片描述

然后选择芯片型号->填写项目名称,双击IOC文件后如图操作。

在这里插入图片描述

复制初始化函数到board.c文件。在这里插入图片描述

1.4打开SPI驱动

在drivers目录下的stm32f1xx_hal_conf.h文件中打开SPI驱动。

在这里插入图片描述

配置完成,编译下载,使用list_device指令查看设备,可以看到SPI总线已经存在了。

在这里插入图片描述

2.挂载片外flash

接下来,我们将片外flash(W25Q256)挂到SPI总线上。

在application目录下,新增flash.c文件。

static int rt_hw_spi_flash_init(void)
{
    //此处为片选引脚
    rt_hw_spi_device_attach(W25Q_SPI_BUS_NAME, W25Q_SPI_DEVICE_NAME, GPIOA, GPIO_PIN_4);
    
    //flash名称要正确
    if (RT_NULL == rt_sfud_flash_probe("W25Q256", W25Q_SPI_DEVICE_NAME))
    {
        return -RT_ERROR;
    };

    return RT_EOK;
}

/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);

经过验证,flash已经挂载成功.

在这里插入图片描述

下面开始搭建FAL。

3.搭建FAL抽象层

FAL是RT-Thread的一个软件包,主要是用于Flash 抽象层的实现,负责管理 Flash 设备和 Flash 分区。关于FAL的详细功能,大家可以参考RT-Thread软件包友情链接。文档非常详细,这里也参考了文档中的内容。

3.1添加FAL

打开RT-Thread Settings点击立即添加,然后搜索FAL。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.2配置FAL

因为我们只用到了片外flash,所以可以将fal_cfg.h中关于片外flash的部分删除,并且定义自己的分区表。

samples->porting->fal_cfg.h复制到inc中并修改为:

#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_

#include <rtconfig.h>
#include <board.h>

#define NOR_FLASH_DEV_NAME             "W25Q256"    /*一定要改为自己的flash名称*/

/* ===================== Flash device Configuration ========================= */
extern struct fal_flash_dev nor_flash0;

/* flash device table(定义设备表,删掉了片上flash) */
#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \
    &nor_flash0,                                                     \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table ps:可根据需要自行分区*/ 
#define FAL_PART_TABLE                                                               \
{                                                                                   \
    {FAL_PART_MAGIC_WORD, "easyflash", NOR_FLASH_DEV_NAME,         0, 1024*1024, 0}, \
    {FAL_PART_MAGIC_WORD,  "download", NOR_FLASH_DEV_NAME, 1024*1024, 1024*1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */

#endif /* _FAL_CFG_H_ */


此处暂时并未做太大改动,可以根据需要自行分区、命名。

3.3初始化FAL

main.c文件中,包含fal.h并调用fal_init()初始化程序。

在这里插入图片描述

3.4验证

在这里插入图片描述

### 配置 RT-Thread 支持 W25Q128 SPI Flash 为了使 RT-Thread 系统能够支持 W25Q128 SPI Flash 芯片,需要完成以下几个方面的配置: #### 1. 修改 SFUD_FLASH_CHIP_TABLE 表 由于默认情况下 `sfud` 并未提供对 GD25Q128 的支持[^2],因此需要手动扩展其芯片表。具体方法是在 `/sfud/inc/sfdu_flash_def.h` 文件中的 `SFUD_FLASH_CHIP_TABLE` 添加新的条目。 以下是修改后的代码片段: ```c #define SFUD_FLASH_CHIP_W25Q128_NAME "W25Q128" #define SFUD_FLASH_CHIP_W25Q128_SIZE (0x2000000) // 32MB #define SFUD_FLASH_CHIP_W25Q128_BLOCK_SIZE (0x10000) // 64KB erase block size #define SFUD_FLASH_CHIP_W25Q128_PAGE_SIZE (0x100) // Page size is 256 bytes const struct sfud_flash sfud_flash_chips[] = { ... {SFUD_MF_WINBOND, SFUD_FLASH_CHIP_W25Q128_NAME, SFUD_FLASH_CHIP_W25Q128_SIZE, SFUD_FLASH_CHIP_W25Q128_BLOCK_SIZE, SFUD_FLASH_CHIP_W25Q128_PAGE_SIZE}, }; ``` 此部分定义了新芯片的相关参数,包括容量、擦除块大小以及页大小等属性。 #### 2. 初始化函数调整 参照已有实现方式,在应用层创建一个新的初始化入口用于绑定硬件资源并探测指定型号的闪存设备是否存在。下面是一个可能的例子: ```c #include <rtthread.h> #include <rtdevice.h> #include <board.h> static int rt_hw_spi_flash_init(void) { // 片选引脚设置 rt_hw_spi_device_attach(W25Q_SPI_BUS_NAME, W25Q_SPI_DEVICE_NAME, GPIOA, GPIO_PIN_4); // 探测flash设备是否可用 if (RT_NULL == rt_sfud_flash_probe("W25Q128", W25Q_SPI_DEVICE_NAME)) { return -RT_ERROR; } return RT_EOK; } INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init); ``` 上述代码通过调用 `rt_sfud_flash_probe()` 函数来验证目标存储器的身份标识符与实际连接上的物理装置相匹配的情况;如果成功,则继续执行后续逻辑流程[^1]。 另外值得注意的是关于SPI通信协议的选择上,默认采用普通的单线模式即可满足大多数应用场景下的需求[^3]。但如果追求更高的传输效率或者特殊功能的话也可以考虑启用DUAL/QUAD I/O选项。 最后一步就是确保项目编译环境已经包含了必要的头文件路径以及库链接项等内容之后重新构建整个工程解决方案就可以了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

范子琦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值