STM32-HAL-SPI-W25Q128FV简单读写测试(2)
文章目录
- 一、Flash的基本读写操作
- 1.1 向芯片中的某个地址(addr:0x02)连续写入不定长的数据并读取
- 代码示例
- 读写流程分析
- 函数分析
- 1.2 向芯片中的某个地址(addr:0x00)写入一个数值
- 代码示例:
- 读写流程分析
具体的配置接上文STM32-HAL-SPI-读写W25Q128FV-JEDEC ID(1)
为了要进行芯片的读写操作,因此要先了解一下芯片的相关读写指令。
- 芯片相关的读写指令
0x50 | 允许写状态寄存器的命令 | 0x05 | 读状态寄存器命令 |
---|---|---|---|
0x01 | 写状态寄存器命令 | 0x9F | 读器件JEDEC ID命令 |
0x06 | 写使能命令 | 0x20 | 擦除扇区命令 |
0x03 | 读数据区命令 | 0xC7 | 批量擦除命令 |
0xA5 | 哑命令,可以为任意值,用于读操作 | 0x01 | 状态寄存器中的正在编程标志(WIP) |
一、Flash的基本读写操作
本次擦写测试非全片擦写,仅仅使用划定大小进行擦写
读写测试地址 | TEST_ADDR | 0 |
---|---|---|
读写测试划定大小 | TEST_SIZE | 4*1024 |
连续擦写起始地址 | 0x02 | |
读写一个数值地址 | 0x00 |
1.1 向芯片中的某个地址(addr:0x02)连续写入不定长的数据并读取
void falsh_Read_Write_Test(void)
向flash芯片写入一串不定长的数据
存储的时候类型都是以字符或者数字
代码示例
void falsh_Read_Write_Test(void)
{ uint8_t i;uint8_t CMP_Flag = 1;uint8_t Tx_Buffer[] = "HelloWorld"; const uint8_t BufferSize = sizeof(Tx_Buffer)/sizeof(Tx_Buffer[0]);//要写入的数据长度uint8_t Rx_Buffer[BufferSize];//缓冲区的大小是待定的/*擦除1个扇区 全部写为0xFF 即全部的bit刷为1*/sf_EraseSector(0x00000000); /*可以不写,因为后面的sf_WriteBuffer自动写前擦除*//*向目标地址写入数据*/sf_WriteBuffer(Tx_Buffer,0x02,BufferSize);printf("写入的数据为:%s 写入数据的大小为:%d \r\n", Tx_Buffer,BufferSize);/*读出目标地址的数据*/sf_ReadBuffer(Rx_Buffer,0x02,BufferSize);printf("读出的数据为:%s\r\n", Rx_Buffer);/*比较目标地址和待读取地址数据*/for(i=0;i<BufferSize;i++){if(Tx_Buffer[i] != Rx_Buffer[i]){CMP_Flag = 0;break;}}if(CMP_Flag == 1)printf("恭喜,Falsh芯片读写不定长数据测试成功!\r\n");elseprintf("What?Falsh芯片读写不定长数据测试失败!\r\n");HAL_Delay(1000); sfReadTest(); /* 读串行Flash数据,并打印出来数据内容 */
}
- 打印出来的数据:
[result]
FF FF 48 65 6C 6C 6F 57 6F 72 6C 64 00 FF FF FF - FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF - FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
... ... (省略很多的FF)FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF - FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
数据长度: 4096字节, 读耗时: 3ms, 读速度: 1365333 Bytes/s
- 执行扇区擦写,全部擦写为
0xFF
,即将每一个比特位写入1,因此可以看到全部都是FF
- 执行写的地址是从
0x02
开始的,因此可以看到第三位的数据才改变 - 后面连续的
11字节
写入预设的字符串 - 但是最后一位补了
\0
,因为字符数组在最后是自动补0
的
读写流程分析
- 定义一个比较标志(CMP_Flag)并初始化为1,用于比较目标地址和待读取地址数据是否一致。
- 定义一个要写入的字符串
Tx_Buffer
,并通过sizeof(Tx_Buffer)/sizeof(Tx_Buffer[0])
获取其长度BufferSize
。 - 调用
sf_EraseSector
函数对存储器中的指定扇区进行擦除。 - 调用
sf_WriteBuffer
函数将Tx_Buffer
写入存储器的指定地址。 - 调用
sf_ReadBuffer
函数从存储器的指定地址读取数据到Rx_Buffer
。 - 使用 for 循环比较
Tx_Buffer
和Rx_Buffer
中的数据是否一致,如果存在不一致的情况,则将 CMP_Flag 置为0。 - 最后根据 CMP_Flag 的值输出测试结果,如果一致则输出 “恭喜,Falsh芯片读写不定长数据测试成功!” 否则输出“What?Falsh芯片读写不定长数据测试失败!”。
函数分析
sf_EraseSector(0x00000000); /*可以不写,因为后面的sf_WriteBuffer自动写前擦除*/
- 扇区擦写函数,可以一次性擦除4K字节的空间,地址为扇区的起始地址,一般设置为4的倍数,如0x0000擦除扇区1 0x2000擦除扇区2。
sf_WriteBuffer(Tx_Buffer,0x02,BufferSize);
- 连续向空间中的某个地址写入一系列数据的函数,这个函数自带擦写功能即在写之前便会自己进行擦写。
sfReadTest();
- 读测试函数,可以将测试区域按字节打印到终端。
1.2 向芯片中的某个地址(addr:0x00)写入一个数值
void falsh_Read_Write_OneData_Test(void)
向Flash芯片写入一个数值,由于Flash的一个字节有8位,因此就是存储一个值的范围是0~255
代码示例:
void falsh_Read_Write_OneData_Test(void)
{ #define n 4 //测试用,指定一个字节uint8_t WriteData[5] = {12,13,14,15,16}; uint8_t ReadData = 0; /*擦除扇区*/sf_EraseSector(0x00000000); //要求地址为4的倍数 /*向目标地址写入数据*/sf_WriteBuffer(&WriteData[n],0x00,1);printf("写入的数据为:%d 写入数据的大小为:%d \r\n", WriteData[4],1);/*读出目标地址的数据*/sf_ReadBuffer(&ReadData,0x00,1);printf("读出的数据为:%d \r\n", ReadData); if(ReadData == WriteData[n])printf("恭喜,Falsh芯片单个数字读写测试成功!\r\n\r\n\r\n");elseprintf("What?Falsh芯片单个数字读写测试失败!\r\n\r\n\r\n");HAL_Delay(1000); sfReadTest(); /* 读串行Flash数据,并打印出来数据内容 */
}
- 查看Flash的读写情况
10 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF - FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF - FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF... ... (省略很多的FF)FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF - FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
数据长度: 4096字节, 读耗时: 3ms, 读速度: 1365333 Bytes/s
- 执行扇区擦写,全部擦写为
0xFF
,即将每一个比特位写入1,因此可以看到全部都是FF
- 执行写的地址是从
0x00
开始的,因此可以看到仅仅第一字节的数据改变
读写流程分析
- 定义一个测试用的字节数
n
,用于指定待写入的数据。 - 定义一个长度为 5 的
WriteData
数组,并将其第 n 个元素赋值为 12,13,14,15,16。 - 调用
sf_EraseSector
函数对存储器中的指定扇区进行擦除。 - 调用
sf_WriteBuffer
函数将WriteData[n]
写入存储器的指定地址。 - 调用
sf_ReadBuffer
函数从存储器的指定地址读取数据到ReadData
。 - 比较
ReadData
和WriteData[n]
是否相等,如果相等则输出“恭喜,Falsh芯片单个数字读写测试成功!”,否则输出“What?Falsh芯片单个数字读写测试失败!”。
相关文章:

STM32-HAL-SPI-W25Q128FV简单读写测试(2)
文章目录 一、Flash的基本读写操作1.1 向芯片中的某个地址(addr:0x02)连续写入不定长的数据并读取代码示例读写流程分析函数分析 1.2 向芯片中的某个地址(addr:0x00)写入一个数值代码示例:读写流程分析 具体的配置接上…...

网易一面:如何设计线程池?请手写一个简单线程池?
说在前面 在40岁老架构师 尼恩的读者社区(50)中,最近有小伙伴拿到了一线互联网企业如极兔、有赞、希音、百度、网易的面试资格,遇到了几个很重要的面试题: 如何设计线程池? 与之类似的、其他小伙伴遇到过的问题还有: …...

网络安全之密码学
目录 密码学 定义 密码的分类 对称加密 非对称加密 对称算法与非对称算法的优缺点 最佳解决办法 --- 用非对称加密算法加密对称加密算法的密钥 非对称加密如何解决对称加密的困境 密钥传输风险 密码管理难 常见算法 对称算法 非对称算法 完整性与身份认证最佳解决…...

第14章 项目采购管理
文章目录 采购管理包括如下几个过程14.2 编制采购计划 462编制采购计划的输出1)采购管理计划2)采购工作说明书3)采购文件 14.2.3 工作说明书(SOW) 14.3 实施采购 47414.3.2 实施采购的方法和技术 476(1&…...
Vite+Vue下的多页面入口配置
我发现多页面入口配置在网上的资料比较乱,今天正好结合我们的开源API分析工具项目(APIcat)更新情况总结一下。 更新vite.config.js 主要配置的更新是在vite.config.js里面要增加build里的rollupOptions,因为vite底层使用了rollu…...

ChatGPT背后的打工人:你不干,有的是AI干
AI“出圈” 如今,数字技术发展速度惊人,AI提高了社会生产效率,更真切地冲击到原有的生产秩序。 年初AI技术的爆发,让国内看到了进一步降本增效的希望。 国内多家互联网企业相继推出类ChatGPT产品,复旦大学邱锡鹏教授…...

【Access】Access:SQL 语句汇总
目录 一、SQL 的功能 二、考试重点 三、关系的定义 (1)新建关系 (2)删除关系 四、SQL 的「数据查询」功能 (1)基本结构 ① Select 语句的基本结构 ② Select 子句 ③ Where 子句 ④ 空值的处…...

【小样本分割 2022 ECCV】SSP
文章目录 【小样本分割 2022 ECCV】SSP摘要1. 介绍2. 相关工作3. 自支持小样本语义分割3.1 动机3.2 自支持原型-SSM3.3 自适应自支持背景原型-ASBP3.4 自支持匹配-SSL 3. 代码 【小样本分割 2022 ECCV】SSP 论文题目:Self-Support Few-Shot Semantic Segmentation 中…...
Friendlycore增加inodes数量
背景:为Nanopim1安装了core系统,tf卡大小64G,安装后正常扩展到了整个tf卡,但是在安装hass的docker显示磁盘空间不够,最终发现是inode被用完了。其inode只有960K,但是16G卡树莓派系统的inodes都是其两倍。 一…...
Latex 定理和证明类环境(amsthm)和(ntheorm)的区别
最近在写毕业论文,出现了一些定理和证明的环境的问题,问题出现在对两个包的理解程度不够的问题上: \RequirePackage{ntheorem} 1、\newtheorem*{proof}{\hspace{2em}证:} 这个是让证明失去计数原则,该命令不能用于 amsthm 2…...
Yolov8改进---注意力全家桶,小目标涨点
💡💡💡💡💡💡💡💡💡💡注意力全家桶💡💡💡💡💡💡💡💡💡💡💡 基于Yolov8的注意力机制研究,提升小目标、遮挡物、难样本等检测性能...

[Linux]网络连接、资源共享
⭐作者介绍:大二本科网络工程专业在读,持续学习Java,输出优质文章 ⭐作者主页:逐梦苍穹 ⭐所属专栏:Linux基础操作。本文主要是分享一些Linux系统常用操作,内容主要来源是学校作业,分享出来的…...

来上海一个月的记录、思考和感悟
作者 | gongyouliu 编辑 | gongyouliu 从4月3号早上来上海,到今天差不多整整一个月了,也是自己正式从杭州离职创业(我更愿意称之为自由职业者,毕竟我没有招聘全职员工,有两个朋友业余时间在帮我)的第一个月…...

学校信息化管理系统通常包含哪些功能?
学校管理信息化是现代教育发展的必然趋势,随着信息技术的飞速发展,学校管理也逐渐地实现了信息化。信息化的学校管理已经成为教育现代化建设的重要内容,也是提高学校教育教学质量和保障学生安全的重要手段。 作为一款低代码开发平台…...
Java时间类(三) -- Calendar()(日历类)
java.util.Calendar类是一个抽象类,它提供了日期计算的相关功能、获取或设置各种日历字段的方法。 protected Calendar() 构造方法为protected修饰,无法直接创建该对象。1. Calendar()的常用方法: 方法名说明static Calendar getInstance()使用默认时区和区域获取日历vo…...
【五一创作】QML、Qt Quick /Qt中绘制圆形
目录标题 Qt Quick中绘制圆形扩展知识Canvas 模块介绍Shapes 模块介绍 Qt Widgets 中绘制圆形两种方式的比较 Qt Quick中绘制圆形 有多种方法可以在 Qt Quick 中绘制圆形。以下是一些主要方法: 使用 Canvas 元素 使用 Shapes 模块: a. 使用 PathArc 和…...

【软考数据库】第七章 关系数据库
目录 7.1 关系数据库概述 7.2 关系代数 7.3 元组演算与域演算 7.4 查询优化 7.5 关系数据库设计 7.6 模式分解 前言: 笔记来自《文老师软考数据库》教材精讲,精讲视频在b站,某宝都可以找到,个人感觉通俗易懂。 7.1 关系数据…...
《SpringBoot中间件设计与实战》第1章 什么是中间件
一、写在前面 在互联网应用初期,所有用于支撑系统建设的,框架结构、基础工具、业务逻辑、功能服务包括页面展示等,都是在一个系统中开发完成,最终也只是把系统和数据库部署在同一台服务器上。也就是大多数开发者入门所接触到的 “单体” 系统。 那为什么会有中间件这个玩…...

spring常用的事务传播行为
事务传播行为介绍 Spring中的7个事务传播行为: 事务行为 说明 PROPAGATION_REQUIRED 支持当前事务,假设当前没有事务。就新建一个事务 PROPAGATION_SUPPORTS 支持当前事务,假设当前没有事务,就以非事务方式运行 PROPAGATION_MANDATORY…...

【Python】什么是爬虫,爬虫实例
有s表示加密的访问方式 一、初识爬虫 什么是爬虫 网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性,根据用户需求定向抓取相关网页并分析已成为如今主流的爬取策略爬虫可以做什么 你可以…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...