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/10/9 2:55:42 阅读更多 →
DNS从电话簿到百科全书:TXT记录、服务发现与云原生架构实践

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

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

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

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

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

2026/10/9 2:41:11 阅读更多 →

最新新闻

机器学习入门第一性原理:线性模型核心推导与工程实践

机器学习入门第一性原理:线性模型核心推导与工程实践

1. 为什么线性模型是机器学习入门的“第一性原理”很多人学机器学习,一上来就被各种深度网络、注意力机制、Transformer 架构唬住了,觉得线性模型太简单、太基础,不值得花时间。但我带了这么多届学生、看了这么多份简历和项目,一个…

2026/10/13 11:02:04 阅读更多 →
HarmonyOS实战:用PixelMap实现图片颜色翻转与负片效果

HarmonyOS实战:用PixelMap实现图片颜色翻转与负片效果

如果你在搜索HarmonyOS开发里关于 PixelMap 的资料,看到最多的解释多半是“PixelMap是一张位图对象”。这句话没错,但基本等于没说。真正上手做图像处理时你会发现, PixelMap 既不是 Image 组件里那个能直接显示的图片,也不…

2026/10/13 11:02:04 阅读更多 →
免费绘画软件FireAlpaca完全指南:轻量替代PS/SAI的插画与动画实践

免费绘画软件FireAlpaca完全指南:轻量替代PS/SAI的插画与动画实践

1. 我为什么从 PS 和 SAI 换到 FireAlpaca 先交代背景。我一直是个靠画图吃饭的人,平时主要用 Photoshop 做商业插画和排版,但说实话,PS 对我的工作负担太重了:启动慢、吃内存、订阅费一年比一年贵。前几年还流行用 SAI&#xff0…

2026/10/13 11:02:04 阅读更多 →
级联故障风险评估:随机化学算法如何高效搜索最坏停电场景

级联故障风险评估:随机化学算法如何高效搜索最坏停电场景

做电力系统风险评估的同行,应该都遇到过这个尴尬:蒙特卡洛抽样跑了几万次,期望损失算出来漂漂亮亮,可一旦想回答“哪几组初始故障组合能把系统搞瘫”,统计结果往往是“查无此案”。原因很简单,大面积停电属…

2026/10/13 11:02:04 阅读更多 →
全链路 Trace 标签化染色与慢执行步骤智能归因

全链路 Trace 标签化染色与慢执行步骤智能归因

在传统的微服务架构中,一次 HTTP 请求通常沿着“网关 -> 业务中台 -> 缓存/数据库”的确定性静态调用拓扑展开,分布式追踪系统(如 Jaeger、Zipkin、SkyWalking)能够非常清晰地展现各服务的 RPC 耗时与依赖拓扑。 然而&#…

2026/10/13 11:02:04 阅读更多 →
C++数组指针字符串:从内存视角彻底搞懂核心难点

C++数组指针字符串:从内存视角彻底搞懂核心难点

我知道很多人第一次翻开郑莉这本《C语言程序设计》,到第六章"数组、指针和字符串"就开始心里打鼓。说实话,我当年也是这样:前面的流程控制、函数调用,照着抄总能写出来,可数组和指针一上来,什么&…

2026/10/13 11:01:04 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →