STM32—W25Q64

news2024/11/26 9:47:26

1.W25Q64简介

  • W25Oxx系列是一种低成本、小型化、使用简单的非易失性存储器
    • 易失性存储器 般就是SRAM、DRAM等
    • 非易失性存储器 般就是E2PROM、Flash等
  • 常应用于数据存储、字库存储、固件程序存储等场景
  • 存储介质:Nor Flash(闪存)
  • 时钟频率:80MHz  /  160MHz(DualSPI)双重SPI   /   320MHz(Quad SPI)四重SPI
  • 存储容量(24位地址):
    • W25040:        4Mbit / 512KByte
      W25080:        8Mbit / 1MByte
      W25Q16:       16Mbit / 2MByte
      W25Q32:       32Mbit / 4MByte
      W25064:        64Mbit / 8MByte
      W250128:      128Mbit / 16MByte
      W250256:      256Mbit / 32MByte

2的24方=16777216  /   1024  = 16384KB  /1024  =16MB   所以24位地址的最大寻址空间是16MB W25Q40到Q128,使用3字节24位的地址都是足够的,所以W25Q256分为3字节地址模式和4字节地址模式,在3字节地址模式下,只能读写前16MB的数据,后面16MB,3个字节的地址够不着,要想读写到所有存储单元,可以进入4字节地址的模式

AT24C02它的容量,一般是KB级别的

2.硬件电路

除了SPI通信引脚,还有两个引脚,一个是WP写保护,另一个是HOLD,这两个引脚,如果不需要的话,也可以拉过来,充当数据传输引脚,加上MOSI和MISO,这就可以4个数据位同时收发了,这就是四重SPI,其实这就有点并行传输的意思了,串行是根据时钟,一位一位地发送,并行是一个时钟,8位同时发送,所以这个四重SPI模式,其实就是4位并行的模式

1号引脚这个CS左边画了个斜杠,代表是低电平有效,或者这边,CS上面画了个横线,也是低电平有效,CS对应之前我们讲SPl的名称就是SS,意思是SPI的片选引脚

3号,WP(Write Protect),它的意思是写保护,配合内部的寄存器配置,可以实现硬件的写保护,写保护低电平有效,WP接低电平,保护住,不让写

最后7号,HOLD数据保持,低电平有效,就是如果你在进行正常读写时,突然产生中断,然后想用SP|通信线去操控其他器件,这时如果把CS置回高电平,那时序就终止了,但如果你又不想终止总线,又想操作其他器件,这就可以HOLD引脚置低电平,这样芯片就HOLD住了,芯片释放总线,但是芯片时序也不会终止,它会记住当前的状态,当你操作完其他器件时,可以回过来,HOLD置回高电平,然后继续HOLD之前的时序,相当于SPI总线进了一次中断,并且在中断里,还可以用SPI午别的事情,这就是HOLD功能

这个DI、DO、WP和HOLD旁边都有括号,写了1O0、IO1、1O2、IO3,这个就对应我们刚才这里说的,双重SP|和四重SPI,如果是普通的SPI模式,那括号里的都不用看,如果是双重SPI那DI和DO就变成IO0和IO1,也就是数据同时收和同时发的2个数据位,同理四重。。

3.框图

首先,右上角这一大块,描述的是存储器的规划示意图,我们这个W25Q64,容量是8MB,如果不进行划分,而只按照一整块来使用的话,那这一整块的容量就太大了,不利于管理,而且后续,我们涉及到F当sH擦除,或者写入的时候,都会有个基本单元,我们得以这个基本单元为单位进行,所以,这里,这 整块大蛋糕,8MB的存储空间,就有必要进行一些合理的划分

那常见的划分方式就是一整块存储空间,先划分为若干的块Block,其中每一块再划分为若干的扇区Sector,对于每个扇区,内部又可以分成很多页Page

那我们看下W25064是怎么划分的呢,首先,这一整个矩形空问里,是所有的存储器存储器以字节为单位,每个字节都有唯一的地址,之前说了,W25Q64的地址宽度是24位,3个字节,所以可以看到,左下角,第一个字节,它的地址是00 00 00H,H代表16进制,之后的空间,地址依次自增直到最后一个字节,地址是7FFFFFh,那最后一个字节为啥是7F开头,不是FF开头呢,因为24位地址,最大寻址范围是16MB,我们这个芯片只有8MB,只用了一半

然后在这整个空间里,我们以64KB为一个基本单元,把它划分成若干的块Block,从前往后,依次是块0、块1、块2、等等等等,直分到最后一块,那整块蛋糕是8MB,以64KB为一块进行划分,最后分得的块数,就是8MB/64KB=128块,那块序号就是块0,一直到块127,然后观察一下块内地址值的变化规律,比如块0的起始地址是00 00 00,结束地址是00 FF FF,之后,块31,起始是1F0000,结东是1FFFFF,在每一块内,它的地址变化范围就是低位的2个字节,每个块的起始是xx 0000,结東是xx FF FF

之后看一下左边,这个示意图就是我们还要再对每一块进行更细的划分,分为多个扇区Sector,这里的虚线看到没,指向了右边的各个块,也就是告诉你,每一块里面都是这个样子的,那在每个块里它的起始地址是xx 00 00,结東地址是xx FF FF,在一块里,我们再以4KB为一个单元,进行切分,块是64KB,我4KB一切,切成16份,所以在每一块里,都可以分为扇区0,一直到扇区15,每个扇区内的地址范围是减xx 0x 00到xx xF FF,这就是对每一块,再细分为16个扇区的分配方式,当然,地址划分,到扇区就结束了

但是当我们在写入数据时,还会有个更细的划分,这就是页Page,当然你也可以把它看作,在扇区里,再进行划分,都是一样,那页的大小呢,是256个字节,一个扇区是4KB,以256个字节划分,4x1024/256=16页,页的地址规律,我们也看一下,在这里,每一行就是一页,左边这里指了个箭头,写的是页地址的开始,右边这里也指了个箭头,写的是页地址的结束,在一页中,地址变化范围xx xx 00到xx xx FF,页内的地址变化,仅限于地址的最低一个字节

左下角,这是SPI控制逻辑,也就是芯片内部进行地址锁存、数据读写等操作,都可以由控制逻辑来自动完成,这个不用我们操心,控制逻辑就是整个芯片的管理员,我们有什么事,只需要告诉这个管理员就行了,然后,控制逻辑左边,就是SPl的通信引脚,有WP、HOLD、CLK、DI和DO,这些引脚,就和我们的生控芯片相连,主控芯片通过SPI协议,把指令和数据发给控制逻辑,控制逻辑就会自动去操作内部电路来完成我们想要的功能,

然后继续看,控制逻辑上面有个状态寄存器Status Register,这个状态寄存器是比较重要的,比如芯片是否处于忙状态、是否写使能、是否写保护,都可以以在这个状态寄存器里体现

然后上面,是写控制逻辑Write Control Logic和外部的WP引I脚相连,显然,这个是配合WP引l脚实现硬件写保护的,接着继续,右边这里,是个高电屈生成器High Voltage Generators,这个是配合Flash进行编程的。因为Hash是掉电不丢失的,如何实现掉电不丢失呢,比如你点亮一个LED表示1,熄灭LD表示0,但如果整个系统电都没有,那1和0就无从说起了,所以要想掉电不丢失,就要在我们的存储器里,产生些刻胃铭心的变化,比如,一个LED,我给它加很高的电压,那LED就烧坏了,我们用烧坏的LED表示1,没烧坏的LED表示0,然后再断电,烧坏的LED还是烧坏的,有电没电,它都是坏的,这个烧没烧坏的状态,不受有电还是没电的影响,所以它就是掉电不丢失的

那对于我们的非易失性存储器来说,也是一样,我们要让它产生一个即使断电也不会消失的状态,般都需要一个比较高的电压去刺激它,所以这种掉电不丢失的存储器,一般都需要一个高压源,那这里,芯片内部集成了高电压发生器,所以就不需要我们再外接高电压了,比较方便

然后在下面,这里是页地址锁存/计数器(Page Address Latch / Counter),然后下面还有个字节地址锁存数器(Byte Address Latch / Counter),这两个地址锁存和计数器,就是用来指定地址的,我们通过SPI,总共发过来3个字节的地址,因为一页是256字节,所以一页内的字节地址,就取决于最低一个字节,而高位的2个字节,就对应的是页地址,所以在这里,我们发的3个字节地址,前两个字节,会进到这个页地址锁存计数器里,最后一个字节,会进到这个字节地址锁存计数器里,然后,页地址,通过这个写保护和行解码,来选择我要操作哪一页,字节地址,通过这个列解码和256字节页缓存,来进行指定字节的读写操作,那又因为我们这个地址锁存,都是有一个计数器的,所以这个地址指针,在读写之后,可以自动加1,这样就可以实现从指定地址开始,连续读写多个字节的目的了

那最后,右边这里,有个256字节的页缓存区,它其实是一个256字节的RAM存储器,然后,我们数据读写,就是通过这个RAM缓存区来进行的,我们写入数据,会先放到缓存区里,然后在时序结束后,芯片再将缓存区的数据复制到对应的Flash里,进行永久保存
为啥要弄一个缓存区呢?我们直接往Flash里写不好吗,那这是因为,我们的SPI写人的频率是非常高的,而Flash的写入,由于需要掉电不丢失,留下刻骨铭心的印象,它就比较慢,所以,这个芯片的设计思路就是你写入的数据,我先放在页缓存区里存着,因为缓存区是RAM,所以它的速度非常快,可以跟得上SPl总线的速度,但是这里有个小问题,就是这个缓存区只有256字节,所以写入的时序有个限制条件就是写入的一个时序,连续写入的数据量,不能超过256字节,然后等你写完了,我芯片再慢慢地把数据,从缓存区转移到Flash存储器里,那我数据从缓存区转到Flash里,需要一定的时间,所以在写入时序结束后,芯片会进入一段忙的状态,在这里,它就会有一条线通往状态寄存器,给状态寄存器的BUSY位置1,表示芯片当前正在搬砖呢,很忙,那在忙的时候,芯片就不会响应新的读写时序了,这就是写入的执行流程

然后我们读取数据呢,虽然这里画的应该也会通过缓存区来读取,但是由于读取,只是看一下电路的状态就行了,它某本不花时间,所以读取的限制就很少了,速度也非常快

4.Flash操作注意事项

写入操作时:

  • 写入操作前,必须先进行写使能
  • 每个数据位只能由1改写为0,不能由0改写为1
  • 写入数据前必须先擦除,擦除后,所有数据位变为1
  • 擦除必须按最小擦除单元进行
    • Flash的擦除,有最小擦除单元的限制,你不能指定某一个字节去擦除,要擦,就得一大片一起擦,在我们这个芯片里可以选择,整个芯片擦除,也可以选择,按块擦除,或者按扇区擦除然后再小,就没有了,所以最小的擦除单元,就是一个扇区4KB,就是4096个字节
    • 那你说,我只想擦除某一个字节怎么办呢,这没办法,你只能把那个字节所在扇区的4096个字节全都掉,如果存储了数据怎么办,这也没办法,要想不丢失数据,你只能先把4096个字节都读出来,再把4096个字节的扇区擦掉,改写完读出来的数据后再把4096个字节全都写回去
    • 实际情况下,我们还有别的方法可以优化一下这个流程,比如,上电后,我先把Flash的数据读出来,放到RAM里,当有数据变动时,我再统一把数据备份到Flash里,或者,我把使用频繁的扇区,放在RAM里,当使用频率降低时,我再把整个扇区备份到FLash里,或者,如果你数据量确实非常少,只想存几个字节的参数就行了,那直接一个字节占一个扇区,不就行了嘛,尽限奢之风
  • 连续写入多字节时,最多写入一页的数据256字节,超过页尾位置的数据,会回到页首覆盖写入
  • 写入操作结束后,芯片进入忙状态,不响应新的读写操作

读取操作时:

  • 直接调用读取时序,无需使能,无需额外操作,没有页的限制,
  • 读取操作结束后不会进入忙状态,但不能在忙状态时读取

我们来看下Hash操作的注意事项,这里列出了这么多Hash写入和读取的要求,那你可能会有些疑惑,不就是个存储器吗,我直接指定地址写或者指定地址读然后它直接给我把数据存在对应的存储单元里不就行了嘛,为啥还要搞这么多的注意事项呢,其实,这是因为Flash,作为一种掉电不丢失的存储器,为了保证掉电不丢失这个特性,同时还要保证存储容量足够大、成本足够低,所以,Flash存储器会在其他地方,比如操作的便捷性等做出一些要协和让步,Hash的写入和读取并不像RAM那样简单直接,RAM是指哪打哪,想在哪写就在哪写,想写多少就写多少,并且RAM是可以覆盖写入的,但是Flash并没有这个特性,总之,Hlash的读写有很多要求,其中写入的要求是非常多的,需要我们掌握

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2210520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyTorch中Tensor的存储结构

PyTorch中Tensor的存储结构 Tensor数据的类型 Tensor 中数据主要有下面两种类型: meta data:元数据,也就是描述数据特征的数据,例如 shape、dtype、device、stride等等raw data:数据本身,我们可以通过 t…

【漏洞复现】SpringBlade menu/list SQL注入漏洞

》》》产品描述《《《 致远互联智能协同是一个信息窗口与工作界面,进行所有信息的分类组合和聚合推送呈现。通过面向角色化、业务化、多终端的多维信息空间设计,为不同组织提供协同门户,打破组织内信息壁垒,构建统一协同沟通的平台。 》》》漏洞描述《《《 致远互联 FE协作办公…

【尚硅谷】FreeRTOS学笔记(更新中更新时间2024.10.12)

在网上看到的一段很形象的描述,放在这里给大家娱乐一下。 裸机开发:n个人拉屎,先进去一个拉完,下一个再来。看门狗:如果有人拉完屎还占着,茅坑刷视频,把他拖出去中断系统:n个人拉屎&…

Qt基础对话框QDialog

模态显示对话框 调用exec方法可以使得对话框模态显示,但是一个阻塞函数 [virtual slot] int QDialog::exec() 对话框的三个槽函数 accept [virtual slot] void QDialog::accept(); reject [virtual slot] void QDialog::reject() done [virtual slot] void QDia…

搭建mongodb单机部署-认证使用

搭建mongodb单机部署-认证使用 实现思路 先将配置文件配置好,使用不用认证的启动命令启动docker,然后创建账号并制定角色。在使用开启认证的命令重新启动容器就好。 这里我并没有说先停止容器,删掉容器重新创建容器。是因为我的启动命令中…

libaom 源码分析系列:noise_model.c 文件

libaom libaom 是 AOMedia(开放媒体联盟)开发的一个开源视频编解码器库,它是 AV1 视频压缩格式的参考实现,并被广泛用于多种生产系统中。libaom 支持多种功能,包括可扩展视频编码(SVC)、实时通信(RTC)优化等,并定期进行更新以提高压缩效率和编码速度 。 libaom 的一些…

豆包MarsCode体验有京东卡和现金

https://www.marscode.cn/events/s/iBpts1oT/ 先登录注册 然后到VSCODE里,在最左侧导航栏处看到EXTEBSIONS点一下(快捷键CtrlShiftX),然后搜索MarsCode,并安装插件。 安装后登录体验一次问答即可。然后回到活动页即…

电瓶车的无钥匙启动功能为用户带来了极大的便利

电瓶车智能钥匙一键启动系统是一种依赖智能钥匙和一键启动按钮的启动方式。 智能钥匙和一键启动系统的结合使用提高了车辆的安全性,防止了未经授权的启动。 携带智能钥匙进入车辆,按下一键启动按钮,车辆通过感应智能钥匙存在而启动。 一键…

数据结构-C语言顺序栈功能实现

栈 栈&#xff1a;类似于一个容器&#xff0c;如我们生活中的箱子&#xff0c;我们向箱子里放东西&#xff0c;那么最先放的东西是最后才能拿出来的 代码实现 #include <stdio.h> #include <stdlib.h>#define MAX_SIZE 100typedef struct {int* base; // 栈底指针…

【亲测可行】ubuntu根目录空间不够,将其它盘挂载到/opt

文章目录 &#x1f315;缘起&#x1f315;从其它盘压缩出一个未分配的空间&#x1f319;从windows系统中压缩出个未分配的空间&#x1f319;从linux系统中压缩出个未分配的空间 &#x1f315;右键点击未分配的盘新建分区&#x1f315;查看分区&#x1f315;先将新分区挂载到/mn…

VMware vCenter Server 6.7U3v 发布下载 - ESXi 集中管理软件

VMware vCenter Server 6.7U3v 发布下载 - ESXi 集中管理软件 集中式控制 vSphere 环境 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vcenter-6-7/ 查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org VMware vCenter Server 是…

爬虫post收尾以及cookie加代理

爬虫post收尾以及cookie加代理 目录 1.post请求收尾 2.cookie加代理 post收尾 post请求传参有两种格式&#xff0c;载荷中有请求载荷和表单参数&#xff0c;我们需要做不同的处理。 1.表单数据&#xff1a;data字典传参 content-type: application/x-www-form-urlencoded; …

【STM32单片机_(HAL库)】6-2【串口通信UART、USART】串口通信框图

USB转TTL 串口通信协议 USART框图 UART&#xff1a;通用异步收发器&#xff1b;USART&#xff1a;通用同步异步收发器 STM32F103C8T6支持三个串口通信

yolo参数调节

1-weight 不同版本的神经网络 可以在这下载复制 2 source图片路径或者文件夹路径 3 img size 尺寸&#xff08;尽量与神经网络模型匹配&#xff09; 4 4 -conf-thres 简单理解就是模型识别成功概率超过这一标准才会显示 5 iou多区域重合 &#xff08;重合比例&#xff09;…

HTML入门教程一口气讲完!(下)\^o^/

HTML 表单 HTML 表单和输入 HTML 表单用于收集不同类型的用户输入。 在线实例 创建文本字段 (Text field) 本例演示如何在 HTML 页面创建文本域。用户可以在文本域中写入文本。 创建密码字段 本例演示如何创建 HTML 的密码域。 &#xff08;在本页底端可以找到更多实例。&a…

MySQL基础教程(二):检索数据和排序检索数据

本篇文章主要介绍通过 MySQL 中的 SELECT, DISTINCT, ORDER BY, LIMIT语句完成最基本的数据检索和对检索到的数据进行排序。最基本的数据检索是指我们通过 SELECT 语句查询表中的某些列或者行。对检索到的数据进行排序是指对数据以某种规则显示&#xff0c;例如按照某个字段升序…

QD1-P20 CSS 简单了解

本节学习&#xff1a;简单了解CSS&#xff0c;什么是什么CSS&#xff0c;如何在HTML中使用CSS&#xff1f; ‍ 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p20 CSS是什么&#xff1f; CSS&#xff08;层叠样式表&#xff0c;Cascading Style Sheets&#xff09;是一种样…

【Java面试——基础知识——Day2】

1.面向对象基础 1.1 面向对象和面向过程的区别 面向过程编程&#xff08;POP&#xff09;&#xff1a;面向过程把解决问题的过程拆成一个个方法&#xff0c;通过一个个方法的执行解决问题。面向对象编程&#xff08;OOP&#xff09;&#xff1a;面向对象会先抽象出对象&#…

Jetbrains Fleet1.41 发布:新特性杀疯了

决定我们自身的不是过去的经历 而是我们自己赋予经历的意义 因为过去的经历 是否影响他 如何影响他 完全由他自己决定 有时候 克服恐惧最好的办法 就是把恐惧说出来 前几日 jetbrains fleet1.41 正式发布了,这次的发布可谓是真的诚意满满,包含了多个开发者非常喜欢的小…

Bootstrap 4 多媒体对象

Bootstrap 4 多媒体对象 引言 Bootstrap 4 是目前最受欢迎的前端框架之一,它提供了一套丰富的工具和组件,帮助开发者快速构建响应式和移动设备优先的网页。在本文中,我们将重点探讨 Bootstrap 4 中的多媒体对象(Media Object)组件,这是一种用于构建复杂和灵活布局的强大…