

在RT-Thread中配置QSPI引脚并启用外部Flash(如W25Q64JV)需要手动实现板级支持包(BSP)的适配。以下是完整的配置步骤和原理说明:
QSPI引脚的配置通常在板级驱动文件中实现,例如:
board/drv_qspi.c:QSPI控制器驱动board/drv_qspi_flash.c:Flash设备初始化board/Kconfig:通过menuconfig配置选项// 定义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
}在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在drv_qspi.c中完成:
rt_qspi_bus_device在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);为外部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
}引脚复用配置
QSPI引脚是复用的,需通过PIN_MODE_AF_PP设置为复用推挽模式,并在CubeMX或手动配置正确的复用功能号(AF)。
QSPI地址映射
STM32的QSPI支持内存映射模式(XIP),外部Flash会被映射到MCU的地址空间(如0x90000000)。通过链接脚本将数据分配到该区域。
SFUD驱动
RT-Thread的SFUD(串行Flash通用驱动)自动识别Flash型号,无需单独实现读写函数。
BSP_USING_QSPI_FLASH --->
[*] Enable QSPI Flashlist_device命令查看是否注册了qspi10和W25Q64设备。mkfs -t lfs /dev/W25Q64格式化Flash并挂载文件系统。stm32xxxx_hal_msp.c中开启QSPI时钟(__HAL_RCC_QSPI_CLK_ENABLE())。通过以上步骤,即使不依赖ART-Pi的BSP,也能在自定义板卡上成功启用外部QSPI Flash。
举报
更多回帖