侧边栏壁纸
博主头像
灰太猫

一个不从事IT职业的IT人

  • 累计撰写 33 篇文章
  • 累计收到 4 条评论

Flash相关

2024-1-9 / 3 评论 / 139 阅读
温馨提示:
本文最后更新于 2024-1-9,已超过半年没有更新,若内容或图片失效,请留言反馈。

nor flash 特点

NOR的特点是芯片内执行(XIP, eXecute In Place),这样应用程序可以直接在flash 闪存内运行,不必再把代码读到系统RAM中。
容量一般为几百k~几百Mbit,128M bit(16M Byte)价格才几块,很便宜。他的SPI读写速度比FRAM还要快,可达133M以上,而且不仅支持标准SPI,还支持双、四线的SPI,相当于又变相提高了SPI的数据吞吐速度。典型型号W25Q。

读操作:和EEPROM、FRAM一样,所以驱动程序很简单。这也就表明了,nor flash每一个字节都有唯一的地址,这一特性使得他支持XIP功能(eXecute In Place,程序就地执行),STM32的flash单片机就是这种。显然EEPROM和FRAM也具备XIP功能,只是同等容量下,nor价格更低,所以现在的单片机基本都选了nor flash来做存储。

写操作:有一个缺点和EEPROM一样,SPI的读写速度>存储烧写速度,所以,他里面也有一个高速RAM缓冲区,容量一般也是256字节,写操作的回环特性与EEPROM一模一样。数据从256字节缓存烧写进flash,耗时约为0.7~5ms之间。SPI发送完数据以后,必须切换任务、或线程、或状态机,来等待数据真正烧写完成,最终要通过查询状态寄存器的busy标志位来验证。

除了以上烧写延迟之外,他比eeprom还多了一个缺点:就是写入前,必须要通过SPI给芯片发命令,先擦除,擦完以后才能写入。这个缺点是由FLASH的特性决定得,flash在烧写时,二进制位只能由1变0,而不能由0变1,所以由0变1的过程,只能由擦除命令来做。

擦除方式有3种:按扇区擦sector、按块擦block、芯片全擦chip。

扇区大小一般为4KB,块一般为32K/64K,下图是经典型号W25Q的烧写时间和擦除时间表:

上表中的4种擦除方式,分别对应一个不同的SPI擦除命令。

nand flash

不支持就地执行,因为nand里面,没有字节地址,要想执行nand里存储的程序,必须把程序复制到RAM,RAM的每一个字节都有地址,然后CPU就可以从RAM中取指,执行代码了。

nand flash容量都很大,一般为128M~4G,它只有块地址,读写都必须按块进行。所以它适用于大容量存储。

寿命

norFlash:至少10万次

EEPROM 100万次
FRAM 写入寿命为10~100亿次以上,约等于无限寿命

评论一下?

OωO
取消
    1. 头像
      灰太猫
      地板
      铁电与闪存比较
      1. 读写速度: 铁电存储器通常具有更快的读写速度,允许更快地访问和写入数据,而闪存的速度则相对较慢。
      2. 擦写寿命: 闪存的擦写寿命一般比较长,但随着多次擦写,会出现擦写次数限制导致性能下降的情况。相比之下,铁电存储器的擦写寿命通常更高,具有更好的耐久性。
      3. 功耗: 铁电存储器的功耗相对较低,对电源的需求较小。而闪存在读写操作时通常需要较高的功耗。
      4. 数据保持能力: 铁电存储器在断电情况下能够长时间保持数据,而闪存在长时间断电后可能会出现数据丢失或损坏的情况。
      回复
    1. 头像
      灰太猫
      板凳
      FRAM
      FRAM的容量和EEPROM差不多,价格比EEPROM稍贵一点点。但是写入寿命为10~100亿次以上,约等于无限寿命,且写入操作无延迟,不需要等芯片内部烧写。换句话说,它的存储速度>=SPI的速度,SPI把数据发完,他就存好了,这一特性就决定了,芯片内部不需要缓存,也就不存在跨页写入障碍了。SPI读写速度一般可达20M~40M,比EEPROM快。

      有趣的是,FRAM的功能可以完全向下兼容EEPROM,所以FRAM可以直接使用eeprom的驱动程序,而不用做任何改动。但是这么做的话,相当于浪费了FRAM的性能,因为FRAM的写入无需等待。因此,FRAM的驱动会变得非常简单。新手就可以轻松搞定。

      读写操作都可直接指定字节起始地址+字节数。起始地址和字节数,都没有限制,只要不超过芯片的容量即可。
      ————————————————
      参考:
      原文链接:https://blog.csdn.net/qq_31073871/article/details/131580590
      作者CSDN博主「暴躁的野生猿」
      回复
    1. 头像
      灰太猫
      沙发
      eeprom容量一般为1k~2M比特,根据容量和品牌不同,价格为几毛~几十,擦写寿命一百万次左右,写入前芯片会自动执行擦除。SPI速度一般为1~20M。

      读操作:指定起始地址、字节数,就可以连续读出。起始地址任意,不要求必须从页首开始, 字节数也任意,芯片会自动跨页(page)。读操作的驱动程序是很简单的。

      写操作:指定起始地址、字节数,就可以连续写入。起始地址任意(页内的任意地址都可以,不要求必须从页首开始),但是,字节数受限。只能在页内写入。页的大小一般有64字节、128字节、256字节等,取决于具体型号。以一页为256字节为例,那么第0~255字节为第0页,256~511为第1页。如果你指定起始地址为0,要写入257字节,也即出现了跨页操作,那么EEPROM把第0页写满之后,写指针不会跳到第257字节处(也即不会跳到第1页的第0字节处),而是会发生回环,跳回本页的第0字节处,会导致之前写入的数据被覆盖。如果你指定起始地址为500,想写入13个字节,那么当写入到第511地址后,剩余的2个字节会被写入到第256/257地址处,发生了回环,那么此时要想避免发生跨页回环,那么写入字节数必须<=11,等这一页烧写完成不再busy之后,再指定下一页起始地址去写剩余的2个字节。

      除了以上缺点以外,第2个缺点就是,每次写入数据后,都需要等几个毫秒(取决于具体型号,一般1~10ms之间),EEPROM才能把数据真正存储完成(这一过程被称为“烧写”或者“编程”)。

      根据以上信息就可以知道,EEPROM的大批量写入的驱动程序,是比较麻烦的,必须要根据起始地址和字节数,来判定是否会发生跨页,以及会跨多少页。标准步骤为:
      (1)根据起始地址和字节数来判定是否会跨页。
      (2)如果不跨页,则直接写,流程结束。
      (3)如果会跨页,则由页尾地址 - 起始地址,得到本批次要写入的字节数,把本页写满。
      (4)起始地址更新为下一页的页首,重新计算剩余未写入的字节数,返回步骤(1)。

      另外,每次写入前,要判定上次写入是否已完成,这一点可通过读状态寄存器的busy位来获得。

      为什么EEPROM的写入操作这么复杂?因为EEPROM的写入速度很慢,所以他里面带有一个高速缓存RAM,这个缓存的大小就是page的大小(也即256字节),借助这个缓存,我们就可以通过20M的SPI把数据快速发给EEPROM,然后单片机就可以切换线程,或者切换状态机,让CPU去干别的事情,而不是把CPU都浪费在数据发送和等待上。这个缓存的存在,也就决定了EEPROM无法跨页写入,因为这个缓存全部被用在写当前PAGE上了。但是这个缓存是利大于弊的,如果没有这个缓存,那我们每发一个字节都要等待或切换线程或切换状态机,效率太低。为了解决EEPROM这个麻烦的写入问题,FRAM应运而生。
      ————————————————
      参考:
      原文链接:https://blog.csdn.net/qq_31073871/article/details/131580590
      作者CSDN博主「暴躁的野生猿」
      回复