创建基于RTThread的项目工程,根据自己的情况创建,理论上stm32F(x)系列的单片机都是通用的代码;

然后打开spi驱动并通过cubemx配置初始化spi的代码



这里的代码是我用STM32CubeMx生成的,你们可以直接使用下面这段代码修改成自己的SPI端口和SPIx就省去配置了。

void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(spiHandle->Instance==SPI2){/* USER CODE BEGIN SPI2_MspInit 0 *//* USER CODE END SPI2_MspInit 0 *//* SPI2 clock enable */__HAL_RCC_SPI2_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/**SPI2 GPIO ConfigurationPB12     ------> SPI2_NSSPB13     ------> SPI2_SCKPB14     ------> SPI2_MISOPB15     ------> SPI2_MOSI*/GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/* USER CODE BEGIN SPI2_MspInit 1 *//* USER CODE END SPI2_MspInit 1 */}
}

创建app文件

#include <rtthread.h>
#include <board.h>
#include "rtdevice.h"
#include "./sfud/inc/sfud.h"
#include <dfs_posix.h> /* 当需要使用文件操作时,需要包含这个头文件 */#define W25Q_SPI_DEVICE_NAME     "spi20"/*** 总线上挂载设备 spi20* @return*/
static int bsp_spi_attach_init(void)
{__HAL_RCC_GPIOB_CLK_ENABLE();// spi10 表示挂载在 spi1 总线上的 0 号设备,PC0是片选,这一步就可以将从设备挂在到总线中。rt_err_t ret = rt_hw_spi_device_attach("spi2", "spi20", GPIOB, GPIO_PIN_12);if(ret < 0){rt_kprintf("flash attach spi2 failed");return -RT_ERROR;}return RT_EOK;
}static void bsp_spi_w25q_sample(int argc, char *argv[])
{struct rt_spi_device *spi_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 设备获取设备句柄 */spi_dev_w25q = (struct rt_spi_device *)rt_device_find(name);//根据 SPI 设备名称查找设备获取设备句柄if (!spi_dev_w25q){rt_kprintf("spi sample run failed! can't find %s device!\n", name);}else{/* 方式1:使用 rt_spi_send_then_recv()发送命令读取ID */rt_spi_send_then_recv(spi_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]);}
}
/*** 注册为块设备* @return*/
static int bsp_spi_block_device_init(void)
{if (RT_NULL == rt_sfud_flash_probe("W25Q128", "spi20"))  //注册块设备,这一步可以将外部flash抽象为系统的块设备{LOG_E("flash sfud failed\n");return -RT_ERROR;};return RT_EOK;
}/*** 挂载文件系统* @return*/
static int bsp_spi_flash_mnt_init(void)
{//    dfs_mkfs("elm", "W25Q128");//格式化设备if(dfs_mount("W25Q128", "/", "elm", 0, 0)==0)//挂载文件{LOG_I("dfs mount success\r\n");return RT_EOK;}else {LOG_E("dfs mount failed\r\n");return -RT_ERROR;}
}static void readwrite_sample(void)
{int fd, size;char s[] = "write file text!", buffer[80];/* 以创建和读写模式打开 /text.txt 文件,如果该文件不存在则创建该文件*/fd = open("/updata.bin", O_WRONLY | O_CREAT);if (fd >= 0){write(fd, s, sizeof(s));close(fd);rt_kprintf("Write done.\n");}/* 以只读模式打开 /text.txt 文件 */fd = open("/updata.bin", O_RDONLY);if (fd >= 0){size = read(fd, buffer, sizeof(buffer));close(fd);rt_kprintf("read: %s \n", buffer);if (size < 0)return ;}
}/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(readwrite_sample, readwrite sample);
///* 组件自动初始化 */
INIT_COMPONENT_EXPORT(bsp_spi_flash_mnt_init);
///* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(bsp_spi_w25q_sample, spi w25q sample);
INIT_DEVICE_EXPORT(bsp_spi_attach_init);
/* 导出到自动初始化 */
INIT_DEVICE_EXPORT(bsp_spi_block_device_init);

然后开始编译

打开控制台调试测试

挂载文件系统失败了,检查DFS配置

最后的测试

【STM32】通过RTThread驱动W25QXXX相关推荐

  1. STM32利用STM32CubeMX驱动SDRAM

    STM32利用STM32CubeMX驱动SDRAM 本次发布FMC总线驱动SDRAM的博客,为下次发布LTDC外设驱动RGB屏的博客做准备.利用STM32CubeMX和HAL库,生成的工程代码具有很强 ...

  2. w25q16 SPI RTthread 驱动

    参考文档(stm32 w25q128裸机驱动)https://blog.csdn.net/weixin_42108484/article/details/91474489 经测试能够正常读写flash ...

  3. STM32 USB转串口驱动安装不成功出现黄色感叹号解决方法!

    STM32 USB转串口驱动安装不成功出现黄色感叹号解决方法! 参考文章: (1)STM32 USB转串口驱动安装不成功出现黄色感叹号解决方法! (2)https://www.cnblogs.com/ ...

  4. STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085和串口只发送数据不能接收数据问题

    STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085的问题讨论:http://www.rt-thr ...

  5. STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085和不能接收数据问题讨论

    STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085的问题讨论:http://www.rt-thr ...

  6. STM32之继电器驱动(上下拉电阻)

    事情的经过:今天买了一个5V继电器,商家说可以用STM32驱动,所以准备用STM32引脚直接驱动,后来,上午试了2小时,引脚一直有电平变化(配置为推挽输出),但是继电器就是没有反应,直接接上5V的电源 ...

  7. RT-Thread驱动——RTC PCF8563

    1 介绍 1.1 RTC选择   RTC选择不外乎就两种,独立外挂和CPU集成,精度要求不高或者联网的情况下使用集成RTC即可,可节约成本.独立RTC的选择则比较多,从低端到高精度的,各大厂商都有可选 ...

  8. K_A11_002 基于STM32等单片机驱动DS18B20串口与OLED0.96双显示

    K_A11_002 基于STM32等单片机驱动DS18B20 串口与OLED0.96双显示 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接 ...

  9. K_A11_008 基于STM32等单片机驱动SHT30和SHT31 串口与OLED0.96双显示

    K_A11_008 基于STM32等单片机驱动SHT30和SHT31 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接 ...

最新文章

  1. 安全自动化在于信任,而非技术
  2. java logout_Java Core.logout方法代码示例
  3. 从实现角度分析js原型链
  4. vue-awesome-swiper 的使用
  5. python 拓扑排序 dfs bfs_bfs与dfs的优缺点?
  6. One order search的框架代码里,硬编码了要去取Interaction object相关的数据
  7. 2.5. SciTE
  8. spring + springmvc + mybatis + mysql 整合使用案例
  9. 请求方报超时,服务日志中记录的时间却少有超时
  10. cisco 2801 配置voip
  11. 新手入门:我的Mac文件管理使用心得
  12. 上位机与欧姆龙PLC的Fins tcp通讯
  13. VMware下载(官网)
  14. 解决“无法删除文件:无法读源文件或磁盘”
  15. Java语言实现文本转语音
  16. 蓝牙小车换一个蓝牙串口助手就不管用了?
  17. Java服务器处理图片上传
  18. 真无线蓝牙耳机排名前十的品牌,公认佩戴舒适性好的蓝牙耳机分享
  19. 简述与机器学习相关的十大常用Python库,极简化算法编程
  20. sql和mysql哪个好学_SQL和MySQl有什么区别?

热门文章

  1. 下拉点击跳到指定链接(类同友情链接)
  2. Java后台+微信公众号红包发放实现
  3. linux系统登陆微信,在Deepin 20系统下实现电脑端登陆两个微信账号的方法
  4. 学历对做软件测试的影响
  5. java高校实验室预约管理系统
  6. 通过读取csv/xml数据并且结合使用allure展示测试报告,验证开发中的add()和reduct()操作(在@allure.story分别实现相加减)
  7. SolidWorks2020每次新建零件图时提示默认模板无效的解决办法
  8. 域名备案、服务器备案和网站备案有什么区别?
  9. 第五篇:mig读写时序下板实现
  10. 盘点那些恶搞C++小程序