rtthread qspi w25q256
查询qspi配置过程
文件路径: /drivers/board.h
/*-------------------------- QSPI CONFIG BEGIN --------------------------*//** if you want to use qspi you can use the following instructions.** STEP 1, open qspi driver framework support in the RT-Thread Settings file** STEP 2, define macro related to the qspi* such as #define BSP_USING_QSPI** STEP 3, copy your qspi init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the end of board.c file* such as void HAL_QSPI_MspInit(QSPI_HandleTypeDef* hqspi)** STEP 4, modify your stm32xxxx_hal_config.h file to support qspi peripherals. define macro related to the peripherals* such as #define HAL_QSPI_MODULE_ENABLED**/
#define BSP_USING_QSPI
注释中详细描述了qspi配置过程,
1使能rtt qspi驱动
- 打开 RT-Thread Settings
选择SPI功能后,右键详细配置:分别勾选
|
|---->设备驱动程序
| |---->使能SPI总线/设备驱动程序 √
| |---->使能QSPI模式 √
2 使能使用 qspi bsp
- 打开 /drivers/board.h
使能 #define BSP_USING_QSPI
3 初始化qspi硬件
通过 stm32cubemx工具使能qspi硬件,在一下路径
\Core\Src\stm32f7xx_hal_msp.c中将HAL_QSPI_MspInit拷贝到 /drivers/board.c中
void HAL_QSPI_MspInit(QSPI_HandleTypeDef* qspiHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(qspiHandle->Instance==QUADSPI){/* QUADSPI clock enable */__HAL_RCC_QSPI_CLK_ENABLE();__HAL_RCC_GPIOE_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOD_CLK_ENABLE();/**QUADSPI GPIO ConfigurationPE2 ------> QUADSPI_BK1_IO2PB2 ------> QUADSPI_CLKPB10 ------> QUADSPI_BK1_NCSPD11 ------> QUADSPI_BK1_IO0PD12 ------> QUADSPI_BK1_IO1PD13 ------> QUADSPI_BK1_IO3*/GPIO_InitStruct.Pin = GPIO_PIN_2;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI;HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);}
}
4 打开相应的HAL库
- 打开 /drivers/ stm32f7xx_hal_conf.h
使能 #define HAL_QSPI_MODULE_ENABLED
使能 #define HAL_SPI_MODULE_ENABLED
5 编译验证
烧录,在串口终端输入**/demo>list_device**
qspi1 SPI Bus 0
uart1 Character Device 2
pin Miscellaneous Device 0
可以看到spi总线
挂载W25qspi设备
- 添加 qspiflash挂载代码
/*** 读取qspi状态寄存器2* @param device : qspi设备* @return*/
char w25qxx_read_status_register2(struct rt_qspi_device *device)
{/* 0x35 read status register2 */char instruction = 0x35, status;rt_qspi_send_then_recv(device, &instruction, 1, &status, 1);//读取状态寄存器return status;
}
/*** qspi写使能* @param device : qspi设备*/
void w25qxx_write_enable(struct rt_qspi_device *device)
{/* 0x06 write enable */char instruction = 0x06;rt_qspi_send(device, &instruction, 1);//发送数据
}
/*** 使能qspi模式* @param device : qspi设备*/
void w25qxx_enter_qspi_mode(struct rt_qspi_device *device)
{char status = 0;/* 0x38 enter qspi mode */char instruction = 0x38;char write_status2_buf[2] = {0};/* 0x31 write status register2 */write_status2_buf[0] = 0x31;status = w25qxx_read_status_register2(device);//读取状态寄存器2if (!(status & 0x02))//判读当前flash通信模式{status |= 1 << 1;w25qxx_write_enable(device); //w25q写使能write_status2_buf[1] = status; //写状态寄存器rt_qspi_send(device, &write_status2_buf, 2);//rt_qspi_send(device, &instruction, 1);//设置qspi模式rt_kprintf("flash already enter qspi mode\n");rt_thread_mdelay(10);}
}/***挂在设备到qspi总线上* @return 挂载状态*/
static rt_err_t rt_hw_qspi_flash_with_sfud_init(void)
{/*W25Q256挂在qspi总线上*/rt_err_t ret = stm32_qspi_bus_attach_device("qspi1", "qspi10", RT_NULL, 4, w25qxx_enter_qspi_mode, RT_NULL);if (ret != RT_EOK){rt_kprintf("qspi attach device failed\n");return -RT_ERROR;}rt_kprintf("qspi attach device success\n");return RT_EOK;
}/*设备自动初始化 */
INIT_DEVICE_EXPORT(rt_hw_qspi_flash_with_sfud_init);
- 编译验证
烧录,在串口终端输入
list_device
device type ref count
-------- -------------------- ----------
qspi10 SPI Device 0
qspi1 SPI Bus 0
uart1 Character Device 2
pin Miscellaneous Device 0
- 设备id读取测试
```c#define W25Q_SPI_DEVICE_NAME "qspi10"static void qspi_w25q_sample(int argc, char *argv[])
{struct rt_spi_device *qspi_dev_w25q;char name[RT_NAME_MAX];rt_uint8_t w25x_read_id = 0x90;rt_uint8_t id[5] = {0};if (argc == 2){rt_strncpy(name, argv[1], RT_NAME_MAX);}else{rt_strncpy(name, W25Q_SPI_DEVICE_NAME, RT_NAME_MAX);}/* 查找 spi 设备获取设备句柄 */qspi_dev_w25q = (struct rt_spi_device *)rt_device_find(name);//根据 SPI 设备名称查找设备获取设备句柄if (!qspi_dev_w25q){rt_kprintf("qspi sample run failed! can't find %s device!\n", name);}else{/* 方式1:使用 rt_spi_send_then_recv()发送命令读取ID */rt_qspi_send_then_recv(qspi_dev_w25q, &w25x_read_id, 1, id, 5);//先发送后接收数据idrt_kprintf("use rt_qspi_send_then_recv() read w25q ID is:%x%x\n", id[3], id[4]);}
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(qspi_w25q_sample, qspi w25q sample);
可以看到spi总线 和 QSPI设备
创建 快设备
- 使能 SFUD
打开 RT-Thread Settings
选择SPI功能后,右键详细配置:分别勾选
|
|---->设备驱动程序
| |---->使能SPI总线/设备驱动程序 √
| |---->使能QSPI模式 √
| |---->使能串行Flash通用驱动程序(SFUD) √
| |---->使能QSPI模式 √
| |---->使能自动探针探测Flsh JEDEC SFDP √
| |---->使能Flash 芯片信息表 √
- 添加创建快设备代码
/*** 创建块设备* @return*/
static int rt_hw_qspi_block_device_init(void)
{/* W25Q256 注册为快设备*/if (RT_NULL == rt_sfud_flash_probe("W25Q256", "qspi10")){rt_kprintf("flash sfud failed\n");return -RT_ERROR;}rt_kprintf("flash sfud success\n");return RT_EOK;
}/*设备自动初始化 */
INIT_DEVICE_EXPORT(rt_hw_qspi_block_device_init);
- 编译验证
烧录,在串口终端输入
list_device
device type ref count
-------- -------------------- ----------
W25Q256 Block Device 0
qspi10 SPI Device 0
qspi1 SPI Bus 0
uart1 Character Device 2
pin Miscellaneous Device 0
可以看到spi总线 和 QSPI设备 快设备
挂载文件系统
- 使能 fatfs
打开 RT-Thread Settings
选择fatfs功能后,右键详细配置:分别勾选
|
|---->设备虚拟文件系统
| |---->使能设备虚拟文件系统 √
| |---->使能elm chan FatFs √
| |---->elm chan 的FatFs,通用Fat 文件系统模块
| |---->设置要处理的最大扇区大小 4096(根据flash参数决定)
- 添加挂载文件系统代码
static int mnt_init(void)
{dfs_mkfs("elm", "W25Q256");//格式化设备if(dfs_mount("W25Q256", "/", "elm", 0, 0)==0)//挂载文件{rt_kprintf("dfs mount success\r\n");return RT_EOK;}else {rt_kprintf("dfs mount failed\r\n");return -RT_ERROR;}
}
/* 组件自动初始化 */
INIT_COMPONENT_EXPORT(mnt_init);
注意:
挂载文件系统过程中可能出现
[E/DFS] File system (elm) was not found.
是由于程序先执行了挂载文件系统,但是文件系统并未准备完成
INIT_COMPONENT_EXPORT(elm_init);
可以可能到elm的初始化也是在组件层,,因此挂载文件系统可以将其改为应用自动初始化
INIT_APP_EXPORT(mnt_init);
- 编译验证
烧录,在串口终端输入
ls
Directory /:
rtthread qspi w25q256相关推荐
- 1.25 Cubemx_STM32H743II—QSPI
文章目录 1.QSPI--W25Q256介绍 1.1 地址分配 1.2 特征 1.3 硬件框图 1.4 时序图 1.3 QSPI 的 1 线,2 线,4 线,SDR 和 DDR 模式 1.3.1 1线 ...
- 教程:AT32F435 QSPI 读写W25Q256
本文使用的是雅特力 AT32F435VGT7作为测试QSPI接口的单片机主要参数如下: 封装:LQFP100 Flash:1024KB RAM:384KB 最大主频:288MHz QSPI接口Flas ...
- RT-Thread 基于QSPI驱动LY68L6400-SRAM
前言 使用的是RTThread 标准版,主控是STM32H743,SRAM是LY68L6400,使用QSPI QSPI和SPI的区别 个人理解最大的区别就是SPI是串行,数据输出,而QSPI跟像并行输 ...
- stm32qspi内存映射_stm32 QSPI内存映射模式
使用Stm32 F767,需要使用内存映射模式,参考STM32F769_DISCO开发板的源码,使用了内存映射模式.用来驱动W25Q256,参数如下: //---------------------- ...
- STM32F7xx —— QSPI
STM32F7xx -- QSPI 目录 STM32F7xx -- QSPI 一.QSPI 二.几个重要的函数 三.几个重要的结构 四.QSPI接口设计(仅供参考) 五.QSPI驱动W25Q256 一 ...
- rt-thread通过spi连接W25Q32后无法读取ID
注意,cs引脚必须由rtt控制,但是我这个cs引脚用的是PA15,它默认是jlink的引脚,所以首先要将jlink禁用,如下: rcu_periph_clock_enable(RCU_AF);rcu_ ...
- 【RT-Thread Smart】ART-Pi Smart 开发板开箱及爱之初次体验
ART-Pi Smart 开发板开箱及爱之初次体验 首先, 感谢RT=Thread给的试用机会, 感谢熊大的指导. 本文ART-Pi Smart开箱及初次体验内置应用 标题开箱 收到有几天了.我们一步 ...
- STM32H7外设配置速查【QSPI部分】
QSPI协议 QSPI是Queued SPI(队列串行外围接口)的缩写,是由摩托罗拉公司推出的SPI协议的一个扩展,比SPI应用更加广泛,现在的FLASH.SRAM等存储器大多支持QSPI协议--QS ...
- IOT-OS之RT-Thread(十一)--- FAL分区管理与easyflash变量管理
文章目录 一.FAL管理与示例 1.1 FAL软件包源码获取 1.2 FAL管理 1.3 FAL移植 1.4 FAL使用示例 二.DFS挂载到FAL分区示例 三.Easyflash移植到FAL分区示例 ...
- 【RT-Thread】nxp rt10xx SFUD和FAL组件搭建与使用
开发前准备 硬件平台:nxp rt10xx单片机 IDE: Keil spi设备驱动框架已经搭建完毕(本章使用spi2,flash挂载在该位置) SFUD 简介 SFUD 全称 Serial Flas ...
最新文章
- WinSock五种I/O模型的性能分析
- 修改unity变量名但不丢失序列化值
- layui 自定义request_layui中使用自定义数据格式对数据表格进行渲染
- 每日一句:We are a happy crew in our office.
- openstack版本历史
- RHEL7.0手动安装
- asp.net获取ip地址的方法
- 单播、多播(组播)和广播的区别
- firebug尺寸标尺消失不显示问题
- 摩尔庄园一直显示服务器,《摩尔庄园手游》一直显示获取远端资源号介绍 进不去怎么办...
- 朴实无华,25个常用Matplotlib图的Python模板代码
- TiDB 的现在和未来
- 2-2日期时间类型基础
- 通俗易懂理解几何光学(六)光学系统的像质评价
- 基于51单片机的智能汽车雨刮器的程序设计proteus仿真
- spring简单教程
- 数学对于人类意味着什么
- 表单验证 手机号输入框
- 存储器的整体概述(内存、外存、ROM、RAM)
- 在fluent计算时如何设置非稳态时的时间步长