RT-Thread论坛
直播中

卢表镜

8年用户 1109经验值
私信 关注
[问答]

ART-Pi中启用外部flash是在哪里配置了qspi的引脚呢?

1、我目前是自己学习画了一块儿板子,想要学习rtthread+lvgl,我在添加完lvgl包的时候报错rom超了。于是了解到需要使用外部flash。我的板子上也连接了QSPI接口的W25Q64JV。由于我是按照以芯片建立工程,并没有使用ART-PI的工程。
2、我目前了解到在ART-PI工程中会有这个下载算法。

在这个链接文件要配置地址

3、于是我有个好奇的点是在工程中没看到有QSPI的配置,于是我去查找QSPI的io是有复用引脚的,也就是说不是绝对的像晶振连接那样子的io固定就是那两个。那么想请教一下各位这个qspi的配置是怎么一回事呢。
提前谢谢各位佬!

回帖(1)

凤求凰

2025-10-20 17:02:25

在RT-Thread中配置QSPI引脚并启用外部Flash(如W25Q64JV)需要手动实现板级支持包(BSP)的适配。以下是完整的配置步骤和原理说明:




1. QSPI引脚配置位置


QSPI引脚的配置通常在板级驱动文件中实现,例如:



  • board/drv_qspi.c:QSPI控制器驱动

  • board/drv_qspi_flash.c:Flash设备初始化

  • board/Kconfig:通过menuconfig配置选项


关键代码示例(drv_qspi.c)


// 定义QSPI引脚(根据你的硬件连接修改)
#define QSPI_CLK_PIN    GET_PIN(D, 3)   // CLK -> PD3
#define QSPI_CS_PIN     GET_PIN(D, 6)   // CS  -> PD6
#define QSPI_IO0_PIN    GET_PIN(D, 11)  // IO0 -> PD11
#define QSPI_IO1_PIN    GET_PIN(D, 12)  // IO1 -> PD12
#define QSPI_IO2_PIN    GET_PIN(E, 2)   // IO2 -> PE2
#define QSPI_IO3_PIN    GET_PIN(D, 13)  // IO3 -> PD13

static void MX_QSPI_Init(void)
{
    rt_pin_mode(QSPI_CLK_PIN, PIN_MODE_AF_PP);  // 复用推挽输出
    rt_pin_mode(QSPI_CS_PIN, PIN_MODE_AF_PP);
    // 配置其他IO引脚...

    hqspi.Instance = QUADSPI;
    hqspi.Init.ClockPrescaler = 2;         // 时钟分频
    hqspi.Init.FifoThreshold = 4;
    hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE;
    HAL_QSPI_Init(&hqspi);  // 初始化HAL库QSPI
}



2. 完整配置流程


步骤1:启用QSPI外设驱动


board/Kconfig中添加配置选项:


config BSP_USING_QSPI
    bool "Enable QSPI BUS"
    default n

config BSP_USING_QSPI_FLASH
    bool "Enable QSPI Flash (W25Q64)"
    select BSP_USING_QSPI
    select RT_USING_SFUD        # 启用SFUD通用驱动
    select RT_SFUD_USING_QSPI   # 使用QSPI模式
    default n

步骤2:实现QSPI初始化


drv_qspi.c中完成:



  • 引脚复用配置

  • QSPI时钟使能

  • HAL层初始化

  • 注册为rt_qspi_bus_device


步骤3:适配SFUD驱动


drv_qspi_flash.c中探测Flash并注册块设备:


#include "spi_flash_sfud.h"

int rt_hw_qspi_flash_init(void)
{
    rt_qspi_device_t qspi_dev = rt_qspi_device_attach("qspi1", "qspi10", RT_NULL, 4);
    if (rt_sfud_flash_probe("W25Q64", "qspi10") == RT_NULL) {
        return -RT_ERROR;
    }
    return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_qspi_flash_init);

步骤4:修改链接脚本(.ld文件)


为外部Flash分配地址空间:


MEMORY
{
    ROM (rx)   : ORIGIN = 0x08000000, LENGTH = 128K    /* 内部Flash */
    RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 512K    /* 内部RAM */
    QSPI (rx)  : ORIGIN = 0x90000000, LENGTH = 8M      /* 外部QSPI Flash */
}

SECTIONS
{
    .qspi_section : {
        *(.qspi_fs)    /* 文件系统数据 */
        *(.lvgl_assets) /* LVGL资源 */
    } >QSPI
}



3. 关键原理说明




  1. 引脚复用配置

    QSPI引脚是复用的,需通过PIN_MODE_AF_PP设置为复用推挽模式,并在CubeMX或手动配置正确的复用功能号(AF)。




  2. QSPI地址映射

    STM32的QSPI支持内存映射模式(XIP),外部Flash会被映射到MCU的地址空间(如0x90000000)。通过链接脚本将数据分配到该区域。




  3. SFUD驱动

    RT-Thread的SFUD(串行Flash通用驱动)自动识别Flash型号,无需单独实现读写函数。






4. 验证步骤



  1. 在menuconfig中启用:
    BSP_USING_QSPI_FLASH  --->
        [*] Enable QSPI Flash

  2. 编译并烧录固件。

  3. 在终端使用list_device命令查看是否注册了qspi10W25Q64设备。

  4. 使用mkfs -t lfs /dev/W25Q64格式化Flash并挂载文件系统。




5. 自定义板卡注意事项



  • 引脚检查:确保原理图的QSPI引脚与MCU的QSPI复用功能匹配(参考STM32数据手册)。

  • 时钟配置:在stm32xxxx_hal_msp.c中开启QSPI时钟(__HAL_RCC_QSPI_CLK_ENABLE())。

  • 信号完整性:QSPI时钟频率较高(通常50-100MHz),需确保PCB走线等长。


通过以上步骤,即使不依赖ART-Pi的BSP,也能在自定义板卡上成功启用外部QSPI Flash。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分