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

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_ADDR0
读写测试划定大小TEST_SIZE4*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

读写流程分析

  1. 定义一个比较标志(CMP_Flag)并初始化为1,用于比较目标地址和待读取地址数据是否一致。
  2. 定义一个要写入的字符串 Tx_Buffer,并通过 sizeof(Tx_Buffer)/sizeof(Tx_Buffer[0]) 获取其长度 BufferSize
  3. 调用 sf_EraseSector 函数对存储器中的指定扇区进行擦除。
  4. 调用sf_WriteBuffer函数将Tx_Buffer写入存储器的指定地址。
  5. 调用 sf_ReadBuffer 函数从存储器的指定地址读取数据到 Rx_Buffer
  6. 使用 for 循环比较 Tx_BufferRx_Buffer 中的数据是否一致,如果存在不一致的情况,则将 CMP_Flag 置为0。
  7. 最后根据 CMP_Flag 的值输出测试结果,如果一致则输出 “恭喜,Falsh芯片读写不定长数据测试成功!” 否则输出“What?Falsh芯片读写不定长数据测试失败!”。

函数分析

sf_EraseSector(0x00000000);  /*可以不写,因为后面的sf_WriteBuffer自动写前擦除*/
  • 扇区擦写函数,可以一次性擦除4K字节的空间,地址为扇区的起始地址,一般设置为4的倍数,如0x0000擦除扇区1 0x2000擦除扇区2。

在这里插入图片描述

擦除一个扇区,256个字节

sf_WriteBuffer(Tx_Buffer,0x02,BufferSize);
  • 连续向空间中的某个地址写入一系列数据的函数,这个函数自带擦写功能即在写之前便会自己进行擦写。

在这里插入图片描述

按位置连续写入

在这里插入图片描述

写入的11个字节数据放大图
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开始的,因此可以看到仅仅第一字节的数据改变

读写流程分析

  1. 定义一个测试用的字节数 n,用于指定待写入的数据。
  2. 定义一个长度为 5 的 WriteData 数组,并将其第 n 个元素赋值为 12,13,14,15,16。
  3. 调用 sf_EraseSector 函数对存储器中的指定扇区进行擦除。
  4. 调用sf_WriteBuffer函数将 WriteData[n] 写入存储器的指定地址。
  5. 调用 sf_ReadBuffer 函数从存储器的指定地址读取数据到ReadData
  6. 比较 ReadDataWriteData[n]是否相等,如果相等则输出“恭喜,Falsh芯片单个数字读写测试成功!”,否则输出“What?Falsh芯片单个数字读写测试失败!”。

相关文章:

STM32-HAL-SPI-W25Q128FV简单读写测试(2)

文章目录 一、Flash的基本读写操作1.1 向芯片中的某个地址&#xff08;addr:0x02&#xff09;连续写入不定长的数据并读取代码示例读写流程分析函数分析 1.2 向芯片中的某个地址&#xff08;addr:0x00&#xff09;写入一个数值代码示例&#xff1a;读写流程分析 具体的配置接上…...

网易一面:如何设计线程池?请手写一个简单线程池?

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

网络安全之密码学

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

第14章 项目采购管理

文章目录 采购管理包括如下几个过程14.2 编制采购计划 462编制采购计划的输出1&#xff09;采购管理计划2&#xff09;采购工作说明书3&#xff09;采购文件 14.2.3 工作说明书&#xff08;SOW&#xff09; 14.3 实施采购 47414.3.2 实施采购的方法和技术 476&#xff08;1&…...

Vite+Vue下的多页面入口配置

我发现多页面入口配置在网上的资料比较乱&#xff0c;今天正好结合我们的开源API分析工具项目&#xff08;APIcat&#xff09;更新情况总结一下。 更新vite.config.js 主要配置的更新是在vite.config.js里面要增加build里的rollupOptions&#xff0c;因为vite底层使用了rollu…...

ChatGPT背后的打工人:你不干,有的是AI干

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

【Access】Access:SQL 语句汇总

目录 一、SQL 的功能 二、考试重点 三、关系的定义 &#xff08;1&#xff09;新建关系 &#xff08;2&#xff09;删除关系 四、SQL 的「数据查询」功能 &#xff08;1&#xff09;基本结构 ① 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 论文题目&#xff1a;Self-Support Few-Shot Semantic Segmentation 中…...

Friendlycore增加inodes数量

背景&#xff1a;为Nanopim1安装了core系统&#xff0c;tf卡大小64G&#xff0c;安装后正常扩展到了整个tf卡&#xff0c;但是在安装hass的docker显示磁盘空间不够&#xff0c;最终发现是inode被用完了。其inode只有960K&#xff0c;但是16G卡树莓派系统的inodes都是其两倍。 一…...

Latex 定理和证明类环境(amsthm)和(ntheorm)的区别

最近在写毕业论文&#xff0c;出现了一些定理和证明的环境的问题&#xff0c;问题出现在对两个包的理解程度不够的问题上&#xff1a; \RequirePackage{ntheorem} 1、\newtheorem*{proof}{\hspace{2em}证:} 这个是让证明失去计数原则&#xff0c;该命令不能用于 amsthm 2…...

Yolov8改进---注意力全家桶,小目标涨点

💡💡💡💡💡💡💡💡💡💡注意力全家桶💡💡💡💡💡💡💡💡💡💡💡 基于Yolov8的注意力机制研究,提升小目标、遮挡物、难样本等检测性能...

[Linux]网络连接、资源共享

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

来上海一个月的记录、思考和感悟

作者 | gongyouliu 编辑 | gongyouliu 从4月3号早上来上海&#xff0c;到今天差不多整整一个月了&#xff0c;也是自己正式从杭州离职创业&#xff08;我更愿意称之为自由职业者&#xff0c;毕竟我没有招聘全职员工&#xff0c;有两个朋友业余时间在帮我&#xff09;的第一个月…...

学校信息化管理系统通常包含哪些功能?

学校管理信息化是现代教育发展的必然趋势&#xff0c;随着信息技术的飞速发展&#xff0c;学校管理也逐渐地实现了信息化。信息化的学校管理已经成为教育现代化建设的重要内容&#xff0c;也是提高学校教育教学质量和保障学生安全的重要手段。 作为一款低代码开发平台&#xf…...

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 中绘制圆形。以下是一些主要方法&#xff1a; 使用 Canvas 元素 使用 Shapes 模块&#xff1a; a. 使用 PathArc 和…...

【软考数据库】第七章 关系数据库

目录 7.1 关系数据库概述 7.2 关系代数 7.3 元组演算与域演算 7.4 查询优化 7.5 关系数据库设计 7.6 模式分解 前言&#xff1a; 笔记来自《文老师软考数据库》教材精讲&#xff0c;精讲视频在b站&#xff0c;某宝都可以找到&#xff0c;个人感觉通俗易懂。 7.1 关系数据…...

《SpringBoot中间件设计与实战》第1章 什么是中间件

一、写在前面 在互联网应用初期,所有用于支撑系统建设的,框架结构、基础工具、业务逻辑、功能服务包括页面展示等,都是在一个系统中开发完成,最终也只是把系统和数据库部署在同一台服务器上。也就是大多数开发者入门所接触到的 “单体” 系统。 那为什么会有中间件这个玩…...

spring常用的事务传播行为

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

【Python】什么是爬虫,爬虫实例

有s表示加密的访问方式 一、初识爬虫 什么是爬虫 网络爬虫&#xff0c;是一种按照一定规则&#xff0c;自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性&#xff0c;根据用户需求定向抓取相关网页并分析已成为如今主流的爬取策略爬虫可以做什么 你可以…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...