当前位置: 首页 > news >正文

深入探索STM32的SPI功能:W25Q64 Flash存储器全攻略

摘要

随着嵌入式系统对存储需求的增长,选择合适的存储设备变得尤为重要。W25Q64 Flash存储器以其8Mbit的存储容量和SPI接口的便捷性,成为STM32微控制器项目中的优选存储方案。本文将深入探索STM32的SPI功能,提供W25Q64 Flash存储器的全面集成指南,包括硬件配置、SPI接口编程和实际代码示例。

1. SPI通信基础

SPI是一种同步串行通信协议,广泛应用于微控制器与外设间的通信。主要特性包括:

  • 主从模式:一个主设备控制多个从设备。
  • 全双工通信:同时发送和接收数据。
  • 时钟同步:数据传输由主设备时钟信号同步。

2. W25Q64 Flash存储器特性

W25Q64是一款串行Flash存储器,具备以下特性:

  • 容量:8Mbit,即1M字节。
  • 组织:分为128个扇区,每扇区含16页,每页256字节。
  • 擦写次数:高达100万次。
  • 工作电压:2.7V至3.6V。

3. 硬件连接

W25Q64与STM32的硬件连接包括:

  • CS(片选)接至STM32 GPIO(如PA4)。
  • SCK(时钟)接至STM32 SPI时钟引脚(如PA5)。
  • MOSI(主设备数据输出)接至STM32 SPI MOSI引脚(如PA7)。
  • MISO(主设备数据输入)接至STM32 SPI MISO引脚(如PA6)。
  • VCC接3.3V,GND接地。

4. SPI接口配置

4.1 硬件SPI初始化

硬件SPI初始化代码示例:

void SPI_Hardware_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB1Periph_SPI1, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_Init(SPI1, &SPI_InitStructure);SPI_Cmd(SPI1, ENABLE);
}
4.2 W25Q64初始化

W25Q64初始化涉及SPI初始化和芯片特定设置。

void W25Q64_Init(void) {SPI_Hardware_Init();// 发送W25Q64的复位指令(如果需要)
}

5. W25Q64 Flash存储器操作

5.1 读取W25Q64 ID

读取ID用于验证W25Q64芯片。

uint16_t W25Q64_ReadID(void) {uint16_t id = 0;SPI_CS_Low();SPI_SendByte(0x90); // READ ID COMMANDid = SPI_ReceiveByte() << 8;id |= SPI_ReceiveByte();SPI_CS_High();return id;
}
5.2 写入W25Q64

页编程是W25Q64写入数据的基本操作。

void W25Q64_WriteByte(uint32_t addr, uint8_t data) {SPI_CS_Low();SPI_SendByte(0x02); // PAGE PROGRAM COMMANDSPI_SendByte(addr >> 16);SPI_SendByte(addr >> 8);SPI_SendByte(addr);SPI_SendByte(data);SPI_CS_High();// 等待写入完成...
}
5.3 从W25Q64读取数据

读取数据操作允许从指定地址读取信息。

uint8_t W25Q64_ReadByte(uint32_t addr) {uint8_t data;SPI_CS_Low();SPI_SendByte(0x03); // READ DATA COMMANDSPI_SendByte(addr >> 16);SPI_SendByte(addr >> 8);SPI_SendByte(addr);data = SPI_ReceiveByte();SPI_CS_High();return data;
}

6. 完整示例代码

以下是STM32与W25Q64通信的完整示例代码。

int main(void) {SystemInit();W25Q64_Init();uint16_t id = W25Q64_ReadID();printf("W25Q64 ID: 0x%X\r\n", id);uint32_t testAddr = 0x000000; // 测试地址uint8_t testData = 0xAA; // 测试数据W25Q64_WriteByte(testAddr, testData); // 写入数据// 延迟一段时间,等待数据写入完成for (volatile int i = 0; i < 0x100000; i++);uint8_t readData = W25Q64_ReadByte(testAddr); // 读取数据if (readData == testData) {printf("Write and Read Test Passed.\r\n");} else {printf("Write and Read Test Failed.\r\n");}while(1) {// 其他应用代码}
}

7. 结论

本文深入探索了STM32的SPI功能,并提供了W25Q64 Flash存储器的全攻略。从SPI通信的基础到W25Q64的特性,再到具体的硬件连接和SPI接口编程,本文为读者提供了全面的集成方案。示例代码进一步演示了如何在实际项目中应用这些知识,帮助读者深入理解和掌握SPI通信技术。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

相关文章:

深入探索STM32的SPI功能:W25Q64 Flash存储器全攻略

摘要 随着嵌入式系统对存储需求的增长&#xff0c;选择合适的存储设备变得尤为重要。W25Q64 Flash存储器以其8Mbit的存储容量和SPI接口的便捷性&#xff0c;成为STM32微控制器项目中的优选存储方案。本文将深入探索STM32的SPI功能&#xff0c;提供W25Q64 Flash存储器的全面集成…...

【SQL Server数据库】带函数查询和综合查询(1)

目录 1&#xff0e;统计年龄大于30岁的学生的人数。 2&#xff0e;统计数据结构有多少人80分或以上。 3.查询“0203”课程的最高分的学生的学号。 4&#xff0e;统计各系开设班级的数目(系名称、班级数目)&#xff0c;并创建结果表。 5&#xff0e;选修了以“01”开头的课…...

使用WebService接口进行数据通信

使用WebService接口进行数据通信 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何使用WebService接口进行数据通信。WebService是一种基于Web…...

AI进阶指南第五课,大模型相关概念(知识库,微调)

虽然前面大概讲了一下大模型的一些基本概念&#xff0c;但是那些都比较偏向于大模型本身&#xff0c;但是我们使用的时候如果只靠大模型肯定是不行的。 就好比如果一个人只有一个脑子&#xff0c;其他什么部位也没有的话&#xff0c;那场面。&#xff08;感觉现在网上的AI图片…...

【深度学习基础】`view` 和 `reshape` 的参数详解

目录 基本概念参数详解 示例view 和 reshape 在具体应用中的参数解释参数解释 更多示例高维张量示例非连续内存示例 总结 基本概念 view 和 reshape 都用于调整张量的形状&#xff0c;它们的参数是新的形状&#xff0c;每个维度的大小可以指定为具体的数值或者 -1。-1 表示这个…...

【笔记】Spring Cloud Gateway 实现 gRPC 代理

Spring Cloud Gateway 在 3.1.x 版本中增加了针对 gRPC 的网关代理功能支持,本片文章描述一下如何实现相关支持.本文主要基于 Spring Cloud Gateway 的 官方文档 进行一个实践练习。有兴趣的可以翻看官方文档。 由于 Grpc 是基于 HTTP2 协议进行传输的&#xff0c;因此 Srping …...

云顶之弈数据网站

摘要&#xff1a;随着云顶之弈游戏的广泛流行&#xff0c;玩家对于游戏数据的查询和最新资讯的获取需求呈现出显著增长的趋势。设计一款云顶之弈数据网站&#xff0c;为玩家提供便捷、高效的数据查询和资讯浏览服务&#xff0c;能满足玩家对于游戏数据的快速查询和实时资讯获取…...

Linux(Ubuntu)下源码开发整个流程完成版本(下载->编译->模拟器运行)

写这篇文章没别的意思, 年纪大了记性不好, 这次工作中下载,编译遇到了一些之前没遇到的问题,所以就所幸记录一下, 以便日后能快速查阅 好了, 正题开始 首先我们下载AOSP源代码开始 AOSP源代码下载 首先找到官网https://source.android.google.cn/ 进入后最上面点击获取源代…...

el-form表单实现校验

前端表单实现&#xff0c; rules 属性传入约定的验证规则&#xff0c;并将 form-Item 的 prop 属性设置为需要验证的特殊键值即可。 <el-form ref"ruleFormRef" :model"interviewForm" label-position"left" require-asterisk-position"…...

一台TrinityCore服务器客户端连接网速慢(未解决)

在FreeBSD开bhyve安装Ubuntu&#xff0c;然后安装了TrinityCore服务器&#xff0c;在只是经过一层NAT&#xff0c;两边都是局域网的情况下&#xff0c;连接速度竟然很慢&#xff0c;慢到600ms。 服务器安装见&#xff1a;尝试在FreeBSD 的jail、bhyve里安装TrinityCore-CSDN博…...

[系统运维|Xshell]宿主机无法连接上NAT网络下的虚拟机进行维护?主机ping不通NAT网络下的虚拟机,虚拟机ping的通主机!解决办法

遇到的问题&#xff1a;主机ping不通NAT网络下的虚拟机&#xff0c;虚拟机ping的通主机 服务器&#xff1a;Linux&#xff08;虚拟机&#xff09; 主机PC&#xff1a;Windows 虚拟机&#xff1a;vb&#xff0c;vm测试过没问题&#xff0c;vnc没测试不清楚 虚拟机网络&#xff1…...

C 语言实例 - 查找数组中最大的元素值

查找数组中最大的元素值。 实例 1 #include <stdio.h>int main() {int array[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};int loop, largest;largest array[0];for(loop 1; loop < 10; loop) {if( largest < array[loop] ) largest array[loop];}printf("最大…...

MySQL之可扩展性(七)

可扩展性 通过集群扩展 理想的扩展方案时单一逻辑数据库能够存储尽可能多的数据&#xff0c;处理尽可能多的查询&#xff0c;并如期望的那样增长。许多人的第一想法就是建立一个"集群"或者"网格"来无缝处理这些事情&#xff0c;这样应用就无须去做太多工…...

微服务框架中Nacos的个人学习心得

微服务框架需要学习的东西很多&#xff0c;基本上我把它分为了五个模块&#xff1a; 第一&#xff1a;微服务技术模块 分为三个常用小模块&#xff1a; 1.微服务治理&#xff1a; 注册发现 远程调用 配置管理 网关路由 2.微服务保护&#xff1a; 流量控制 系统保护 熔断降级 服…...

Unity Animator 运行时修改某个动画状态的播放速度

1.添加动画参数&#xff0c;选择需要动态修改速度的动画状态 2.在属性面板种设置速度倍速参数...

阿里云常用的操作

阿里云常见的产品和服务 容器服务 可以查看容器日志、监控容器cpu和内存&#xff0c; 日志服务 SLS 可以查看所有服务的日志&#xff0c; Web应用防火墙 WAF 可以查看 QPS. 阿里云查看集群&#xff1a; 点击 “产品和服务” 中的 容器服务&#xff0c;可以查看 集群列表&…...

【MATLAB源码-第231期】基于matlab的polar码编码译码仿真,对比SC,SCL,BP,SCAN,SSC等译码算法误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 极化码&#xff08;Polar Code&#xff09; 极化码&#xff08;Polar Code&#xff09;是一种新型的信道编码技术&#xff0c;由土耳其裔教授Erdal Arıkan在2008年提出。极化码在理论上被证明能够在信道容量上达到香农极限…...

创新实训(十三) 项目开发——实现用户终止对话功能

思路分析&#xff1a; 如何实现用户终止AI正在进行的回答&#xff1f; 分析实现思路如下&#xff1a; 首先是在用户点击发送后&#xff0c;切换终止对话&#xff0c;点击后大模型终止对话&#xff0c;停止sse&#xff0c;不再接收后端的消息。同时因为对话记录存入数据库是后…...

基于Java+MySQL停车场车位管理系统详细设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…...

LeetCode 53.最大子数组和(dp)

给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1a;…...

IOS17闪退问题Assertion failure in void _UIGraphicsBeginImageContextWithOptions

最近项目更新到最新版本IOS17&#xff0c;发现一个以前的页面突然闪退了。原来是IOS17下&#xff0c;这个方法 UIGraphicsBeginImageContext(CGSize size) 已经被移除&#xff0c;原参数如果size为0的话&#xff0c;会出现闪退现象。 根据说明&#xff0c;上述方法已经被替换…...

float8格式

产生背景 在人工智能神经元网络中&#xff0c;一个参数用1字节表示即可&#xff0c;或者说&#xff0c;这是个猜想&#xff1a;因为图像的颜色用8比特表示就够了&#xff0c;所以说&#xff0c;猜想神经元的区分度应该小于256。 数字的分配 8比特有256个码位&#xff0c;分为…...

云效BizDevOps上手亲测

云效BizDevOps上手亲测 什么是云效项目协作Projex配置2023业务空间原始诉求字段原始诉求工作流创建原始诉求配置2023产品空间创建主题业务原始诉求关联主题配置2023研发空间新建需求需求关联主题 与传统区别云效开发流程传统开发流程云效BizDevOps 操作体验 什么是云效 在说到…...

亚太杯赛题思路发布(中文版)

导读&#xff1a; 本文将继续修炼回归模型算法&#xff0c;并总结了一些常用的除线性回归模型之外的模型&#xff0c;其中包括一些单模型及集成学习器。 保序回归、多项式回归、多输出回归、多输出K近邻回归、决策树回归、多输出决策树回归、AdaBoost回归、梯度提升决策树回归…...

【Linux】部署 GitLab 服务

1、配置实验环境 安装git apt install git 安装docker apt install docker 安装tree apt install tree 2、安装 Gitlab 下载官方库与安装包 下载官方库的安装脚本 curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bas…...

cs与msf权限传递以及mimikatz抓取win2012明文密码

启动服务端 进入客户端 建立监听 制作脚本 客户端运行程序 主机上线 打开msf 调用handler模块 创建监听 11.cs->msf 传递会话 12.传参完成 msf->cs会话传递 抓取密码&#xff08;null&#xff09; 修改注册表 shell reg add "HKEY_LOC…...

C++ 矩阵的最小路径和解法

描述 给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。 数据范围: 1≤𝑛,𝑚≤5001≤n,m≤500,矩阵中任意值都满足 0≤𝑎𝑖,𝑗≤1000≤ai,j​≤100 要求…...

http服务网络请求如何确保数据安全(含python示例源码)

深度学习类文章回顾 【YOLO深度学习系列】图像分类、物体检测、实例分割、物体追踪、姿态估计、定向边框检测演示系统【含源码】 【深度学习】物体检测/实例分割/物体追踪/姿态估计/定向边框/图像分类检测演示系统【含源码】 【深度学习】YOLOV8数据标注及模型训练方法整体流程…...

网络构建关键技术_2.IPv4与IPv6融合组网技术

互联网数字分配机构&#xff08;IANA&#xff09;在2016年已向国际互联网工程任务组&#xff08;IETF&#xff09;提出建议&#xff0c;要求新制定的国际互联网标准只支持IPv6&#xff0c;不再兼容IPv4。目前&#xff0c;IPv6已经成为唯一公认的下一代互联网商用解决方案&#…...

数仓建模—数据生命周期管理

数仓建模—数据生命周期管理 数据生命周期管理 (DLM) 是一种在从数据输入到数据销毁的整个生命周期内管理数据的方法。 数据根据不同的条件分处不同的阶段,随着其完成不同的任务或满足特定要求而逐次经历这些阶段。 一个出色的 DLM 流程提供针对企业数据的结构和组织,帮助实…...

免费建网站软件系统/广州专做优化的科技公司

http://172.20.6.3/Problem_Show.asp?id1237 锻炼搜索的代码能力&#xff0c;不错的题。开始对dfs到底向下传递什么搞不清楚&#xff0c;需要想一下&#xff0c;noip难度的题还有这种情况&#xff0c;果然还是太蒻。代码1 #include<cstdio>2 #include<cstring>3 #…...

网站gif图标/网络营销策划目的

基础规范【建议】使用InnoDB存储引擎【强制】无特殊要求必须使用UTF8字符集【强制】数据表、数据字段必须加入中文注释【强制】禁止使用存储过程、视图、触发器、Event。特殊情况申请评审【强制】不在数据库做运算&#xff0c;cpu计算务必移至业务层命名规范【建议】 命名使用具…...

自己建网站 知乎/正规的培训机构有哪些

回到目录 当我们从MongoDB网站下载安装包之后&#xff0c;它会伴随有一系列的工具&#xff0c;服务器程序mongod是我们耳熟能详的了&#xff0c;客户端mongo和性能检测mongostat我们可能就没有用过了&#xff0c;今天主要是介绍一下mongo这个客户端命令行工具的使用。 测试环境…...

东莞微网站建设/昆明seo关键字推广

属性在这里只是一个统称&#xff0c;它对应两个术语attribute与property。attribute是指用户通过setAttribute设置的自定义属性&#xff0c;其值只能是字符串&#xff0c;如果没有显式定义&#xff0c;用getAttribute取值为undefined。property是指元素固有属性&#xff0c;像t…...

快速建站属于saas吗/app推广拉新平台

概述 线段树就是用一棵二叉树维护某一区间内的某一值&#xff08;最值&#xff0c;和&#xff0c;乘积......)&#xff0c;主要有区间查询和区间修改两种操作&#xff0c;区间修改又有自上而下修改和自下而上修改两种&#xff0c;本人更习惯于自上而下修改。 下面是百度百科对线…...

浚县网站建设/智能营销系统开发

优化前的版本&#xff1a; /*** PHP计算两个时间段是否有交集&#xff08;边界重叠不算&#xff09;** param string $beginTime1 开始时间1* param string $endTime1 结束时间1* param string $beginTime2 开始时间2* param string $endTime2 结束时间2* return bool* author …...