网站需要租服务器吗/seo兼职接单平台
文章目录
- 一、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表示加密的访问方式 一、初识爬虫 什么是爬虫 网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性,根据用户需求定向抓取相关网页并分析已成为如今主流的爬取策略爬虫可以做什么 你可以…...

JavaScript学习笔记(三)
文章目录 第7章:迭代器与生成器1. 迭代器模式2. 生成器 第8章:对象、类与面向对象编程1. 理解对象2. 创建对象3. 继承:依靠原型链实现4. 类class 第10章:函数1. 函数定义的方式有:函数声明、函数表达式、箭头函数&…...

文鼎创智能物联云原生容器化平台实践
作者:sekfung,深圳市文鼎创数据科技有限公司研发工程师,负责公司物联网终端平台的开发,稳定性建设,容器化上云工作,擅长使用 GO、Java 开发分布式系统,持续关注分布式,云原生等前沿技…...

深入了解SpringMVC框架,探究其优缺点、作用以及使用方法
一、什么是Spring MVC SpringMVC是一种基于Java的Web框架,与Spring框架紧密结合,用于开发具备WebApp特性的Java应用程序。Spring MVC是Spring Framework的一部分,因此它具有与Spring框架相同的特性和理念。 二、SpringMVC的优缺点 1. 优点…...

Git教程(一)
1、Git概述 1.1 、Git历史 同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)…...

数据结构篇三:双向循环链表
文章目录 前言双向链表的结构功能的解析及实现1. 双向链表的创建2. 创建头节点(初始化)3. 创建新结点4. 尾插5. 尾删6. 头插7. 头删8. 查找9. 在pos位置前插入10. 删除pos位置的结点11. 销毁 代码实现1.ListNode.h2. ListNode.c3. test.c 总结 前言 前面…...

day10 TCP是如何实现可靠传输的
TCP最主要的特点 1、TCP是面向连接的运输层协议。( 每一条TCP连接只能有两个端点(endpoint),每一条TCP连接只能是点对点的(一对一)) 2、TCP提供可靠交付的服务。 3、TCP提供全双工通信。 4…...

Python | 人脸识别系统 — 背景模糊
本博客为人脸识别系统的背景模糊代码解释 人脸识别系统博客汇总:人脸识别系统-博客索引 项目GitHub地址:Su-Face-Recognition: A face recognition for user logining 注意:阅读本博客前请先参考以下博客 工具安装、环境配置:人脸…...

YOLOv5+单目测量物体尺寸(python)
YOLOv5单目测量尺寸(python) 1. 相关配置2. 测距原理3. 相机标定3.1:标定方法1(针对图片)3.2:标定方法2(针对视频) 4. 相机测距4.1 测距添加4.2 细节修改(可忽略…...

C++异常
C异常 提到异常,大家一定不陌生,在学习new关键字的时候就提到了开空间失败会导致抛异常。其实异常在我们生活中的使用是很多的,有些时候程序发生错误以后我们并不希望程序就直接退出,针对不同的情况,我们更希望有不同的…...

Java中的字符串是如何处理的?
Java中的字符串是通过字符串对象来处理的。字符串是一个类,可以创建一个字符串对象,并在该对象上调用一系列方法来操作该字符串。 Java中的字符串是不可变的,这意味着一旦创建了一个字符串对象,就无法修改它的值。任何对字符串对…...