RT-Thread studio SPI+SFUD+W25Q64
一、RT-Thread-W25Q64-SPI配置一SPI配置1、创建工程后打开设置使能SPI2、修改board.h头文件内容3、打开stm32cube-使能对应SPI通道引脚根据所使用的SPI通道进行设置W25Q64使用SPI2,相关设置如下所示4、生成代码关闭stm32cubemx修改stm32f4xx_hal_config_bak.h文件如框选所示使能 SPI 外设模块的宏定义5、将生成的SPI初始化函数复制到board.c文件末尾原来文件中函数的内容注释掉将复制的SPI初始化函数粘贴到board.c文件中末尾如下图所示随后将原来文件中的初始化函数注释掉二读取W25Q64SPI片选W25Q64芯片挂载设备struct rt_spi_device *spi_w25q64; //片选SPI和挂载W25Q64 void spi_init() { struct rt_spi_configuration cfg; //先把w25qxx挂载在SPI2总线上(pb12是W25Q的片选引脚) rt_hw_spi_device_attach(spi2, spi20, GPIOB, GPIO_PIN_12); //查找设备 spi_w25q64(struct rt_spi_device *)rt_device_find(spi20); if(spi_w25q64RT_NULL){ rt_kprintf(spi_w25q find failed...\n); } else { rt_kprintf(spi_w25q find success...\n); } //配置w25q-spi模式 cfg.data_width8; cfg.modeRT_SPI_MODE_3|RT_SPI_MASTER|RT_SPI_MSB;//模式3主机高位先行 cfg.max_hz5*1000*1000;//5M rt_spi_configure(spi_w25q64, cfg); //此时可以查看设备是否已注册 } MSH_CMD_EXPORT(spi_init,spi bus);读取设备ID指令0x90方法一//读取id方法1 void spi_read_id1() { rt_uint8_t id[5]{0};// struct rt_spi_message msg1,msg2; rt_uint8_t w25_read_id0x90;//读取ID指令 msg1.send_bufw25_read_id; msg1.recv_bufRT_NULL; msg1.length1; msg1.cs_take1; msg1.cs_release0; msg1.nextmsg2; msg2.send_bufRT_NULL; msg2.recv_bufid; msg2.length5; msg2.cs_take0; msg2.cs_release1; msg2.nextRT_NULL; //制造商0XEF 设备IDxx rt_spi_transfer_message(spi_w25q64, msg1); rt_kprintf(w25q128 ID is %x%x \n,id[3],id[4]); } MSH_CMD_EXPORT(spi_read_id1,spi_read_id);方法二//读取id方法2 //先发送后接收数据函数 //rt_spi_send_then_recv(device, send_buf, send_length, recv_buf, recv_length) void spi_read_id2() { rt_uint8_t id[5]{0}; //存储id rt_uint8_t w25_read_id0x90;//读取ID指令 rt_spi_send_then_recv(spi_w25q64, w25_read_id, 1, id, 5); rt_kprintf(w25q128 ID is %x%x \n,id[3],id[4]); } MSH_CMD_EXPORT(spi_read_id2,spi_read_id);完整代码如下所示#includertthread.h #includertdevice.h #includedrv_spi.h #includedrivers/spi.h struct rt_spi_device *spi_w25q64; //片选SPI和挂载W25Q64 void spi_init() { struct rt_spi_configuration cfg; //先把w25qxx挂载在SPI2总线上(pb12是W25Q的片选引脚) rt_hw_spi_device_attach(spi2, spi20, GPIOB, GPIO_PIN_12); //查找设备 spi_w25q64(struct rt_spi_device *)rt_device_find(spi20); if(spi_w25q64RT_NULL){ rt_kprintf(spi_w25q find failed...\n); } else { rt_kprintf(spi_w25q find success...\n); } //配置w25q-spi模式 cfg.data_width8; cfg.modeRT_SPI_MODE_3|RT_SPI_MASTER|RT_SPI_MSB;//模式3主机高位先行 cfg.max_hz5*1000*1000;//5M rt_spi_configure(spi_w25q64, cfg); //此时可以查看设备是否已注册 } MSH_CMD_EXPORT(spi_init,spi bus); //读取id方法1 void spi_read_id1() { rt_uint8_t id[5]{0};// struct rt_spi_message msg1,msg2; rt_uint8_t w25_read_id0x90;//读取ID指令 msg1.send_bufw25_read_id; msg1.recv_bufRT_NULL; msg1.length1; msg1.cs_take1; msg1.cs_release0; msg1.nextmsg2; msg2.send_bufRT_NULL; msg2.recv_bufid; msg2.length5; msg2.cs_take0; msg2.cs_release1; msg2.nextRT_NULL; //制造商0XEF 设备IDxx rt_spi_transfer_message(spi_w25q64, msg1); rt_kprintf(w25q128 ID is %x%x \n,id[3],id[4]); } MSH_CMD_EXPORT(spi_read_id1,spi_read_id); //读取id方法2 //先发送后接收数据函数 //rt_spi_send_then_recv(device, send_buf, send_length, recv_buf, recv_length) void spi_read_id2() { rt_uint8_t id[5]{0}; //存储id rt_uint8_t w25_read_id0x90;//读取ID指令 rt_spi_send_then_recv(spi_w25q64, w25_read_id, 1, id, 5); rt_kprintf(w25q128 ID is %x%x \n,id[3],id[4]); } MSH_CMD_EXPORT(spi_read_id2,spi_read_id);编译运行结果二、W25Q64SFUD一增加SFUD配置在第一章节一SPI配置基础上增加二编写代码SPI片选SFUD探测初始化int w25q_sfud_test() { //片选挂载设备 // rt_hw_spi_device_attach(bus_name, device_name, cs_gpiox, cs_gpio_pin) rt_hw_spi_device_attach(spi2, spi20, GPIOB, GPIO_PIN_12); //探测设备 // rt_sfud_flash_probe(spi_flash_dev_name, spi_dev_name) //使用sfud探测spi20设备并将spi20连接的flash初始化为块设备名称w25q128 if(rt_sfud_flash_probe(W25Q64, spi20)RT_NULL) { rt_kprintf(w25q64 prob failed...\n); return -RT_ERROR; } return RT_EOK; } MSH_CMD_EXPORT(w25q_sfud_test,sfub test);写入数据和读取数据测试sfud_flash_t test_sfud; int w25q_read_write_test() { const uint8_t test_data[]this is w25q sfud test data!; uint8_t read_data[50]{0}; //获取设备句柄 /* * 使用 rt_sfud_flash_find 或者 rt_sfud_flash_find_by_dev_name 获取设备句柄 */ //test_sfudrt_sfud_flash_find(spi20); test_sfudrt_sfud_flash_find_by_dev_name(W25Q64); if(test_sfudRT_NULL) { rt_kprintf(find sufd_flash failed...\n); return -RT_ERROR; } else { rt_kprintf(find sufd_flash success...\n); } //调用API进行读写操作 //写flash rt_kprintf(write flash...\n); // sfud_write(flash, addr, size, data) // sfud_erase_write(flash, addr, size, data) // sfud_write(test_sfud, 13, sizeof(test_data), test_data); sfud_erase_write(test_sfud, 13, sizeof(test_data), test_data); //读flash rt_kprintf(read flash...\n); sfud_read(test_sfud, 13, sizeof(test_data), read_data); rt_kprintf(read data:%s...\n,read_data); } MSH_CMD_EXPORT(w25q_read_write_test,sfub read write test);

相关新闻

Windows任务栏美化终极指南:3分钟免费打造圆角悬浮效果

Windows任务栏美化终极指南:3分钟免费打造圆角悬浮效果

Windows任务栏美化终极指南:3分钟免费打造圆角悬浮效果 【免费下载链接】RoundedTB Add margins, rounded corners and segments to your taskbars! 项目地址: https://gitcode.com/gh_mirrors/ro/RoundedTB 厌倦了Windows系统千篇一律的矩形任务栏吗&#x…

2026/9/22 4:01:24 阅读更多 →
DNS从电话簿到百科全书:TXT记录、服务发现与云原生架构实践

DNS从电话簿到百科全书:TXT记录、服务发现与云原生架构实践

1. 从“电话簿”到“百科全书”:DNS角色的悄然演变 我们每天都在和DNS打交道,但绝大多数人可能只把它理解为一个“网络电话簿”——你输入一个域名,比如 www.example.com ,它告诉你对应的IP地址是 93.184.216.34 ,…

2026/9/10 6:22:34 阅读更多 →
Python字符串操作全解析:从基础概念到实战应用

Python字符串操作全解析:从基础概念到实战应用

1. 从“人狗大作战”到“虚空之花”:为什么字符串是Python的基石 最近在社区里看到不少有趣的讨论,从“人狗大作战”的Python代码,到“虚空之花”的字符串下载,再到处理可能超过一万位的“大整数”字符串运算。这些看似五花八门的…

2026/9/15 22:41:24 阅读更多 →

最新新闻

dva图片加载慢?3步优化方案保姆级教程

dva图片加载慢?3步优化方案保姆级教程

dva图片加载慢?3步优化方案保姆级教程 官方文档翻了三遍还是没搞懂?别急,DVA在图片处理上的性能坑,我踩过,你也肯定踩过。这篇 保姆级教程 不绕弯子,直接上干货,帮你把首屏加载时间砍掉一半。 性能瓶颈定位…

2026/9/22 4:00:26 阅读更多 →
告别只会写HelloWorld: 免费家装设计源码里的3个项目搭建陷阱

告别只会写HelloWorld: 免费家装设计源码里的3个项目搭建陷阱

告别只会写HelloWorld: 免费家装设计源码里的3个项目搭建陷阱 别再说“我懂语法”,看看你的代码怎么跑起来。 很多后端开发朋友,Python、Java、Go 都学过,LeetCode…

2026/9/22 4:00:25 阅读更多 →
优酷影院开发速查手册:搞定大厂面试不踩坑

优酷影院开发速查手册:搞定大厂面试不踩坑

优酷影院开发速查手册:搞定大厂面试不踩坑 看了一堆教程还是不会写项目?别慌,这锅教程不背,背的是你没把知识串联成系统。很多兄弟在掘金技术社区发帖吐槽,学了三年Python,一上项目就懵,面试时被问个视频流处理或者高并发场景,脑子一片空白。其…

2026/9/22 4:00:25 阅读更多 →
Python except图解原理:5个血泪坑让你少加班

Python except图解原理:5个血泪坑让你少加班

Python except图解原理:5个血泪坑让你少加班 刚把项目从 Python 3.7 升级到 3.11,测试环境一跑,满屏的 UnboundLocalError 和 Exception ignored in…

2026/9/22 4:00:24 阅读更多 →
数据管理员实战:搞定版本升级 API 变更的速查手册

数据管理员实战:搞定版本升级 API 变更的速查手册

数据管理员实战:搞定版本升级 API 变更的速查手册 刚把生产环境数据库驱动从 5.7 升到 8.0,或者把 ORM 框架换了个大版本,是不是瞬间懵了?熟悉的 connection.cursor() 报错, SELECT…

2026/9/22 4:00:22 阅读更多 →
RSA算法原理图解:3个步骤搞定加密完整示例

RSA算法原理图解:3个步骤搞定加密完整示例

RSA算法原理图解:3个步骤搞定加密完整示例 你从网上复制了一段 RSA 加密代码,导入项目后直接报错 ValueError: b'...' is not a valid base64 string…

2026/9/22 3:59:22 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →