STM32学习笔记,W25Q64简介(理论部分)

首先,用几张PPT介绍一下W25Q64芯片。之后再过一遍手册,把里面的细节问题给讲一下。再和上一节的SPI协议结合起来就可以写程序读写这个芯片。

上面不同芯片的操作方法是一样的,只是他们的存储容量不同。

这个存储容量在手机电脑领域非常小,但是在单片机领域是非常大了。

这个芯片VCC、GND接上电,剩下的全都可以接GPIO,基本不需要其他电路。

易失性和非易失性存储器的区别在于掉电数据丢不丢失。

字库存储可以应用到一些显示屏上,比如OLED显示屏或LCD液晶屏。如果想在屏幕上显示汉字,就得把汉字的点阵数据存储起来。当然简单的方法是把字库直接存储在STM32内部,这样适合少量汉字的情况,如果汉字非常多,再直接存储在STM32中,就不合适了。

所以可以用这个芯片存储汉字的点阵数据,在显示某个汉字之前,先读取芯片查询字库,再在显示屏上显示对应的点阵数据,这样就能让显示屏任意显示中文了。

像STM32的程序存储器、U盘、电脑的固态硬盘等,使用的都是FLASH闪存。闪存有Nor FLASH和Nand FLASH,使用优缺点各有不同,领域也不同。

这个芯片使用的是SPI通信,他的时钟线频率是80MHz,相比于STM32来讲是非常快的,所以在之后写程序时,翻转引脚就不用再加延时了。即使不延时,这个GPIO口的翻转频率也不可能达到80MHz(比如GPIO的输出频率是8MHz,SPI支持80MHz,即使GPIO最大频率输出,他的频率也在SPI可以接受的范围之内)。

图中160MHz(Dual SPI)是双重SPI,即使用MOSI和MISO两条线同时进行发送或接收,这样一次就可以传输2位数据,效率就等效于160MHz。

320MHz是四重SPI,下图的WP和HOLD有时不用可以拿过来进行数据传输。

其中W25Q40是4Mbit,也就是4M这么多的二进制位,当然容量,我们习惯以字节为单位,一个字节对应8个二进制位。

24位地址是3个字节,那24位地址究竟可以寻址多少字节呢?

2**24=16777216 Byte,16777216 Byte /1024 = 16384 KByte,16384 Kbyte / 1024 = 16Mbyte,也就是24位地址的寻址空间可以寻到16MB的地址。那图中的W25Q40-128都是足够的,但是W25Q256的32MB比较尴尬,不够,所以分3字节地址模式和4字节地址模式,3字节地址模式只能读取前16MB的数据,后面16MB的数据3个地址够不到。

左边这个图是小模块的原理图,右上角这个图是芯片的引脚定义,右下角这个图是每个引脚定义的功能了。

看右上角/CSCS左边有个“/”,代表低电平有效。或者左边图,CS上方画了个“—”也是低电平有效。

WP写保护,Write Protect,低电平,写保护,不让写,高电平,非写保护,可写,通过配置内部的寄存器进行写保护。

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

看左图,HOLD和WP接VCC电源正极,因为低电平有效,所以这两个都不用。需要用的话就接到STM32的GPIO。

框图,每个芯片都有,需要仔细分析。右上角是存储器的规划示意图,这个W25Q64,容量是8MB,如果不进行划分,按照一整块来使用的话,那这一整块的容量就太大了,不利于管理。而且后续涉及到FLASH擦除或者写入的时候,都会有个基本单元,我们得以这个基本单元为单位进行。所以这个8MB的存储空间,就有必要进行一些合理的划分。常见的划分就是一整块的存储空间,先划分为若干个块block,其中每一个块在划分成若干的扇区sector,对于每个扇区,内部又可以分成很多页page。

在这个矩形空间里,是所有的存储器,存储器以字节为单位,每个字节都有自己的地址。为什么最大是7FFFFFh,因为24位地址寻址是16MB,而这个芯片只是8MB,所以地址空间只用了一半。在这整个空间里,以64KB为基本单元将其划分成若干个块,从前往后依次是Block 0、Block 1…Block 128。8MB * 1024 = 8192 KB,8192 KB / 64KB = 128。在每一块,他地址的变化范围是最低位的两个字节,每个块的起始地址是xx0000,结束是xxFFFF,这是块内地址的变化规律。

之后再对每一块进行细致的划分,划分成多个扇区sector,以4KB进行切分,每一块里都有16个扇区(扇区0~扇区15)。每个扇区内的地址,xxx000~xxxFFF,这就是对每一块细分到每一个扇区的分配方式。

但是我们写入数据时,还有更细致的划分,就是页page。页是对整个存储空间进行划分的,当然可以看成在扇区里,再进行划分,都是一样的。一个页是256字节,一个扇区是4KB,以256个字节进行划分,4KB * 1024 / 256 = 16页。

页的划分规律,每一行就是一页。在一页中,页的变化范围是xxxx00到xxxxFF。一页内的地址变化,仅限于地址的最低一个字节。

地址不需要记住,但需要记住的是,一整个存储空间划分为若干个块,对于每一块,又划分为若干扇区,然后对于整个空间,会划分为很多很多个页,每页256字节。

左下角是SPI控制逻辑,也就是芯片内部进行地址锁存、数据读写等操作,都可以由控制逻辑自动完成,不用我们操心。控制逻辑就是整个芯片的管理员,有什么事情告诉这个管理员即可。控制逻辑的左边就是SPI的通信引脚,这些引脚就和主控芯片相连。

主控芯片通过SPI协议,将指令和数据发送给控制逻辑,控制逻辑就会自动去操作内部电路,完成功能。

控制逻辑上面有个状态寄存器(比较重要),比如芯片是否处于忙状态,是否处于写使能、写保护等,都可以在这个状态寄存器里体现。上面还有个写控制逻辑,与WP引脚相连,是用来控制硬件写保护的。

高电压生成器,配合FLASH编程使用的,非易失性存储器因为需要掉电不丢失,需要有比较高的电压来刺激它。所以这种掉电不丢失的存储器,一般都需要一个高压源。

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

256字节的页缓存区,他其实是一个256字节的RAM存储器。数据读写就是通过这个RAM缓存区进行的。我们写入的数据会先放到缓存区里,等时序结束后,芯片再将缓存区里的数据复制到FLASH里,进行永久保存。

设置缓存区的原因:由于SPI写入的频率非常高,而FLASH写入需要掉电不丢失,所以这个过程比较缓慢,所以设计思路就是把数据先放到缓存区里,因为缓存区是RAM,所以它的速度非常快,可以跟的上SPI总线的速度。但是有个限制条件,由于缓存区只有256个字节,所以写入的时序有个限制的条件,就是写入的时序,连续写入的数据量,不能超过256字节。然后等写完了,芯片再把缓存区里的数据慢慢转移到FLASH存储器里,由于转移需要一定的时间,所以在时序结束后,芯片会进入一段忙的状态。

所以在这里就会有一条线通往状态寄存器,给状态寄存器的BUSY位置1,表示芯片正忙。在忙的时间,芯片就不会响应新的读写时序了

读取数据时,虽然图上画的应该也是通过缓冲区来读取,但是读取基本上只看一下电路状态即可,基本不花时间,所以读取的时间就比较少,速度非常快。

重点部分:一,FLASH主闪存部分,会划分成块、扇区、页;二,SPI控制逻辑,是SPI的管理员,执行指令,读写数据都靠它;三,状态寄存器,它和忙状态,写使能,写保护等功能有关;四,256字节的写缓存,它能对一次性写入的数据量产生限制。

FLASH操作的注意事项:

FLASH存储器要求这么多是因为FLASH是一种掉电不丢失的存储器,为了保证掉电不丢失这个特性,同时还要保证存储容量足够大,成本足够低,所以FLASH会在其他地方,比如操作的便捷性等做出妥协。FLASH的读写并不像RAM那样简单直接,RAM是指哪写哪,想写多少就写多少,并且RAM是可以覆盖写入的。

总之,FLASH的读写要求很多,其中写入的要求非常多,需要掌握。读取的比较少,因为读取只需要看一下电路状态即可,不对电路做出实质的改变,所以读取一般是比较快的,并且没有什么限制。

第一点,写入操作前,需要进行写使能,这是一种保护措施,就像手机操作前,需要先解锁才能使用。写使能的话,利用SPI发送一个写使能的指令就可以完成了;

第二点,每个数据位只能由1改写为0,不能由0改写为1;就是FLASH不像RAM那样有直接覆盖改写的能力。比如,在某个字节的存储单元里存储了0xAA这个数据,对应二进制位是10101010,那我再写一个0x55数据覆盖掉0xAA,0x55对应的是01010101,就不能直接覆盖,就会受到第二条的限制。所以最终数据就会变为0000000,导致出错。所以为了弥补这个缺陷,就有第三条规定,

第三点,写入数据前必须先擦除,擦除后,所有数据位变为1。擦除会有专门的擦除电路进行,只要给它发送擦除的指令即可,那通过擦除电路擦除之后,所有数据位都变成1;FLASH中数据位为1的数据,拥有单向改为0的数据,一旦改完之后就不能后悔,要想反悔,就只能擦除,统一改写成1,在进行操作。如果想不擦除直接操作,也可以执行,但是这样的存储的数据极有可能是错的。有时读取数据,发现读取的是FF,那就说明当前字节的数据可能是擦除之后还没有写入数据的空白空间。

第四点,擦除必须按最小擦除单元进行。比如想在00……地址下写入数据,需要先进行擦除,那就将00地址下的数据擦除,再在00地址下写入数据即可,但是这样是有问题的。FLASH擦除有最小擦除单元的限制,不能指定一个字节去擦除,必须一片的进行擦除,这个一片是多大呢,这个芯片的可以一整个芯片进行擦除,也可以一个块进行擦除,一个扇区进行擦除,不能再小了,所以这个芯片最小的擦除单元是一个扇区。一个扇区是4KB,所以一次擦除最小是4096个字节,如果想擦除一个字节,这没办法,只能一整个扇区擦除。如果想保留其他字节的数据,只能先将扇区内的数据读取出来,再把扇区擦除,改写完读出来的字节之后,再把4096个字节全都写入进行。当然还有别的方法可以优化这个流程,当FLASH上电之后,可以先将数据读取到RAM里,当有数据变动时,再统一把数据备份到FLASH里;或者把使用频繁的扇区备份到RAM里,当使用频率降低时,再把数据备份到FLASH扇区里;或者数据量非常少,只想存几个字节的参数,那就一个参数分配一个扇区。为了弥补擦除最小的单元的缺点,需要在程序逻辑上多下一些功夫。

第五点,连续写入多字节时,最多写入一页的数据,超过页尾位置的数据,会回到页首覆盖写入。一个写入时序最多只能写入一页数据,也就是256个字节,这是由于页缓冲区只有256个字节,FLASH写入太慢。另外,页缓冲区是和FLASH的页对应的,必须得从页起始位置开始写,才能写入256字节的数据,如果从中间开始写,那写到页尾时,就会跳回到页首,导致地址错乱。再写入数据时,一定要注意地址范围,不能跨越页的边沿。

第六点,写入操作结束后,芯片进入忙状态,不响应新的读写操作。在这个状态下,不要进行新的读写操作,否则芯片不会响应。要想知道芯片什么时间结束忙状态时,就可以使用读取状态寄存器的指令,查看BUSY位是否为1,BUSY为0时,芯片就不忙了,在进行操作。在芯片擦除指令之后,芯片也会进入忙状态,也是需要等待忙状态的结束,再进行操作。

读取操作时就没有那么多要求了。

状态寄存器总共有两个,1和2。其中比较重要的是状态寄存器1,状态寄存器1里有两个重要的标志位,第一位是提到的BUSY,大概意思是当页正在进行页编程,编程就是写入数据,然后块擦除、扇区擦除、整片擦除,或者写状态寄存器指令时,BUSY位置1,在这期间,设备将会忽略进一步的指令,当然除了读状态指令和擦除挂起指令。当擦除、编程、写状态寄存器指令结束后,BUSY清零来指示设备准备好了;第二位是写使能锁存位WEL,在执行完写使能指令后,WEL置1,代表芯片可以进入写入操作了。当设备写失能时,WEL位置0。那什么时间进入写失能呢?第一种是芯片上电之后,默认是写失能的状态;第二种是执行完这些指令之后进入写失能,包括写失能指令,WEL置0,其次,页编程、扇区擦除等等,这些写入操作之后,WEL置0。这表明,当我们写使能,再执行写入操作之后,不需要手动进行写失能,因为写入数据操作后,会顺便帮我们写失能。同时这也表明,我们进入任何写入操作前,都得进行写使能。一个写使能只能保证后面一条的写指令可以执行。

之后看手册的我就没怎么整理了,作者只是带着浏览了一下,没有很仔细的讲,有需要的话可以自己去视频里看。以下是原视频位置:

【STM32入门教程-2023版 细致讲解 中文字幕】https://www.bilibili.com/video/BV1th411z7sn?p=37&vd_source=d15e90bdb2b4bc34d823de1b81cbe53e

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用和引用的内容,可以总结出STM32h750 QSPI W25Q64驱动的一些关键信息。 首先,W25Q64是一种SPI NOR Flash芯片,它被连接到STM32h750的QSPI(Quad SPI)接口上。W25Q64的引脚连接为PB2、PB6、PF6、PF7、PF8和PF9。 在设置QSPI时,一些关键的配置参数需要注意。首先是时钟预分频器(clock prescaler),根据W25Q256的最高时钟频率为104MHz,因此需要将分频设置为2。其次是闪存大小(FLASH SIZE),W25Q64的大小为8MB,所以需要将设置为2的(22-1)次方。时钟模式(Clock Mode)应设置为Low,表示CLK空闲时为低电平。芯片选择(Chip Select)需要设置为High Time为5,以确保高电平持续时间大于50ns。 另外,为了保证正常的工作,所有的QSPI引脚都应该设置为very high,而NCS脚(PB6)必须设置为PULL-UP。关于为什么要设置为PULL-UP,具体原因在引用中没有提及。 最后,需要注意W25Q64与W25Q256之间的一些区别。首先是地址位数,W25Q64只支持24位地址,而W25Q256支持24位和32位地址。其次是读写状态寄存器的不同,W25Q64的读状态寄存器为05h和35h,而W25Q256的为05h、35h和15h。写状态寄存器也有所不同,W25Q64的为01h,而W25Q256的为01h、31h和11h。 综上所述,STM32h750的QSPI可以通过相应的配置来驱动W25Q64芯片。需要注意的是,具体的配置参数和引脚连接可能还取决于具体的硬件设计和应用需求。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [STM32H750 QSPI间接模式 W25Q64](https://blog.csdn.net/smallerlang/article/details/127921384)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [STM32H753 STM32H743 STM32H750 QSPI W25Q256 下载算法](https://blog.csdn.net/c101028/article/details/132073746)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值