一:flash和eeprom的区别
二:Nand flash 和nor flash的区别
本段由 公众号 半导体行业观察(ID:icbank)原创
闪存将信息存储在由浮栅晶体管制成的存储单元中。这些技术的名称解释了存储器单元的组织方式。在NOR闪存中,每个存储器单元的一端连接到源极线,另一端直接连接到类似于NOR门的位线。在NAND闪存中,几个存储器单元(通常是8个单元)串联连接,类似于NAND门(参见图1)。
NOR Flash架构提供足够的地址线来映射整个存储器范围。这提供了随机访问和短读取时间的优势,这使其成为代码执行的理想选择。另一个优点是100%已知的零件寿命。缺点包括较大的单元尺寸导致每比特的较高成本和较慢的写入和擦除速度。相比之下,与NOR闪存相比,NAND闪存具有更小的单元尺寸和更高的写入和擦除速度。缺点包括较慢的读取速度和I / O映射类型或间接接口,这更复杂并且不允许随机访问。值得注意的是,NAND Flash中的代码执行是通过将内容映射到RAM来实现的,这与直接从NOR Flash执行代码不同。另一个主要缺点是存在坏块。NAND闪存通常在部件的整个生命周期内出现额外的位故障时具有98%的良好位,因此,器件内需要ECC功能。
存储容量
与NOR闪存相比,NAND闪存的密度要高得多,主要是因为其每比特成本较低。NAND闪存通常具有1Gb至16Gb的容量。NOR闪存的密度范围从64Mb到2Gb。由于NAND Flash具有更高的密度,因此主要用于数据存储应用。
擦除/读写
在NOR和NAND闪存中,存储器被组织成擦除块。该架构有助于在保持性能的同时保持较低的成本,例如,较小的块尺寸可以实现更快的擦除周期。然而,较小块的缺点是芯片面积和存储器成本增加。由于每比特成本较低,与NOR闪存相比,NAND闪存可以更经济高效地支持更小的擦除块。目前,NAND闪存的典型块大小为8KB至32KB,NOR Flash为64KB至256KB。
NAND闪存中的擦除操作非常简单,而在NOR闪存中,每个字节在擦除之前都需要写入“0”。这使得NOR闪存的擦除操作比NAND闪存慢得多。例如,NAND闪存S34ML04G2需要3.5ms才能擦除128KB块,而NOR闪存S70GL02GT则需要约520ms来擦除类似的128KB扇区。这相差近150倍。
如前所述,NOR闪存具有足够的地址和数据线来映射整个存储区域,类似于SRAM的工作方式。例如,具有16位数据总线的2Gbit(256MB)NOR闪存将具有27条地址线,可以对任何存储器位置进行随机读取访问。在NAND闪存中,使用多路复用地址和数据总线访问存储器。典型的NAND闪存使用8位或16位多路复用地址/数据总线以及其他信号,如芯片使能,写使能,读使能,地址锁存使能,命令锁存使能和就绪/忙碌。NAND Flash需要提供命令(读,写或擦除),然后是地址和数据。这些额外的操作使NAND闪存的随机读取速度慢得多。例如,NAND闪存S34ML04G2需要30μS,而NOR闪存S70GL02GT需要120nS。因此,NOR比NAND快250倍。
为了克服或减少较慢读取速度的限制,通常以NAND闪存中的页方式读取数据,每个页是擦除块的较小子部分。仅在每个读取周期开始时使用地址和命令周期顺序读取一页的内容。NAND闪存的顺序访问持续时间通常低于NOR闪存设备中的随机访问持续时间。利用NOR Flash的随机访问架构,需要在每个读取周期切换地址线,从而累积随机访问以进行顺序读取。随着要读取的数据块的大小增加,NOR闪存中的累积延迟变得大于NAND闪存。因此,NAND Flash顺序读取可以更快。但是,由于NAND Flash的初始读取访问持续时间要长得多,两者的性能差异只有在传输大数据块时才是明显的,通常大小要超过1 KB。
在两种Flash技术中,只有在块为空时才能将数据写入块。NOR Flash的慢速擦除操作使写操作更慢。在NAND Flash中,类似于读取,数据通常以页形式编写或编程(通常为2KB)。例如,单独使用NAND闪存S34ML04G2 写入页面需要300μS。
为了加快写入操作,现代NOR Flashes还采用类似于页面写入的缓冲区编程。例如,前文所述的NOR闪存S70GL02GT,支持缓冲器编程,这使其能够实现与单词相似写入超时多字节编程。例如,512字节数据的缓冲区编程可以实现1.14MBps的吞吐量。
能耗
NOR闪存在初始上电期间通常需要比NAND闪存更多的电流。但是,NOR Flash的待机电流远低于NAND Flash。两个闪存的瞬时有功功率相当。因此,有效功率由存储器活动的持续时间决定。NOR Flash在随机读取方面具有优势,而NAND Flash在擦除,写入和顺序读取操作中消耗的功率相对较低。
可靠性
保存数据的可靠性是任何存储设备的重要性能指标。闪存会遭遇称为位翻转的现象,其中一些位可以被反转。这种现象在NAND闪存中比在NOR闪存中更常见。出于产量考虑,NAND闪存随附着散布的坏块,随着擦除和编程周期在NAND闪存的整个生命周期中持续,更多的存储器单元变坏。因此,坏块处理是NAND闪存的强制性功能。另一方面,NOR闪存带有零坏块,在存储器的使用寿命期间具有非常低的坏块累积。因此,当涉及存储数据的可靠性时,NOR Flash具有优于NAND Flash的优势。
可靠性的另一个方面是数据保留,这方面,NOR Flash再次占据优势,例如,NOR Flash闪存S70GL02GT提供20年的数据保留,最高可达1K编程/擦除周期,NAND闪存S34ML04G2提供10年的典型数据保留。
编程和擦除周期的数量曾是一个需要考虑的重要特性。这是因为与NOR闪存相比,NAND闪存用于提供10倍更好的编程和擦除周期。随着技术进步,这已不再适用,因为这两种存储器在这方面的性能已经很接近。例如,S70GL02GT NOR和S34ML04G2 NAND都支持100,000个编程 - 擦除周期。但是,由于NAND闪存中使用的块尺寸较小,因此每次操作都会擦除较小的区域。与NOR Flash相比,其整体寿命更长。
三:norflash的具体操作
Flash 接口可管理 CPU 通过 AHB I-Code 和 D-Code 对 Flash 的访问。该接口可针对
Flash 执行擦除和编程操作,并实施读写保护机制。
Flash 接口通过指令预取和缓存机制加速代码执行。
这个接口就是norflash的控制器,flash接口通过 I-code总线访问,flash中的数据和数据缓冲池通过D-code总线访问。
● Flash 读操作
● Flash 编程/擦除操作
● 读/写保护
● I-Code 上的预取操作 (提高工作效率)
● I-Code 上的 64 个缓存( 128 位宽)
● D-Code 上的 8 个缓存( 128 位宽)(128 位宽数据读取)
● 字节、半字、字和双字数据写入
● 扇区擦除与全部擦除**
当然128位宽指的是,flash接口和flash之间的位宽 。32位的处理器每次最多读32位,但是处理器处理数据的速度远大于,flash读出数据的速度,所以读出以后可供CPU处理。
注意不同型号flash结构不尽相同。
主存储器块:分为 4 个 16 KB 扇区、 1 个 64 KB 扇区和 7 个 128 KB 扇区。存储代码的地方。
系统存储器:系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),当使用ISP方式加载程序时,就是由这个程序执行。这个区域由芯片厂写入BootLoader,然后锁死,用户是无法改变这个区域的。
OTP(一次性可编程):可以用来存储一些用户数据(一次性的,写完一次,永远不可以擦除),OTP 区域还有 16 个额外字节,用于锁定对应的 OTP 数据块。
选项字节 : 选项字节用于存储芯片使用者对芯片的配置信息。
目前,所有的STM32101xx、STM32102xx、STM32103xx、STM32105xx、STM32107xx产品,选项字节都是16字节。但是这16字节,每两个字节组成一个正反对,即,字节1是字节0的反码,字节3是字节2的反码,...,字节15是字节14的反码,所以,芯片使用者只要设置8个字节就行了,另外8个字节系统自动填充为反码。因此,有时候,也说STM32的选项字节是8个字节,但是占了16字节的空间。选项字节的8字节正码概述如下:
RDP 字节0。读保护字节,存储对主存储块的读保护设置。
USER 字节2。用户字节,配置看门狗、停机、待机。
Data0 字节4。数据字节0,由芯片使用者自由使用。
Data1 字节6。数据字节1,由芯片使用者自由使用。
WRP0 字节8。写保护字节0,存储对主存储块的写保护设置。
WRP1 字节10。写保护字节1,存储对主存储块的写保护设置。
WRP2 字节12。写保护字节2,存储对主存储块的写保护设置。
WRP3 字节14。写保护字节3,存储对主存储块的写保护设置。
为了准确读取 Flash 数据,必须根据 CPU 时钟 (HCLK) 频率和器件电源电压在 Flash 存取控
制寄存器 (FLASH_ACR) 中正确地编程等待周期数 (LATENCY)。
当电源电压低于 2.1 V 时,必须关闭预取缓冲器。下图所示为 Flash 等待周期与 CPU 时钟频率之间的对应关系
复位后, CPU 时钟频率为 16 MHz, FLASH_ACR 寄存器中的等待周期 (WS) 为 0。
强烈建议通过以下软件序列来根据 CPU 频率调整在访问 Flash 时所需的等待周期数。
需要提高 CPU 频率时的操作步骤
- 将新的等待周期数编程到 FLASH_ACR 寄存器中的 LATENCY 位
- 通过读取 FLASH_ACR 寄存器,检查新的等待周期是否设置成功
- 通过改写 RCC_CFGR 寄存器中的 SW 位来修改 CPU 时钟源
- 如有需要,可通过改写 RCC_CFGR 中的 HPRE 位来修改 CPU 时钟预分频器
- 通过读取 RCC_CFGR 寄存器中相应的时钟源状态( SWS 位)和/或 AHB 预分频值
(HPRE 位),检查新的 CPU 时钟源和/或新的 CPU 时钟预分频值是否设置成功**
需要降低 CPU 频率时的操作步骤
- 通过改写 RCC_CFGR 寄存器中的 SW 位来修改 CPU 时钟源
- 如有需要,可通过改写 RCC_CFGR 中的 HPRE 位来修改 CPU 时钟预分频器
- 通过读取 RCC_CFGR 寄存器中相应的时钟源状态( SWS 位)和/或 AHB 预分频值
( HPRE 位),检查新的 CPU 时钟源和/或新的 CPU 时钟预分频值是否设置成功- 将新的等待周期数编程到 FLASH_ACR 中的 LATENCY 位
- 通过读取 FLASH_ACR 寄存器,检查新的等待周期是否设置成功
注意: CPU 时钟配置或等待周期 (WS) 配置的更改不会立即生效。为了确保当前的 CPU 时钟频率
即为所配置的频率,用户可检查 AHB 预分频系数和时钟源状态值。为了确保所编程的 WS
数生效,可读取 FLASH_ACR 寄存器的内容来确认。
自适应存储加速器(就是为了体现CM4的高速特点,克服高速的处理器在运行中需要经常等待 FLASH 读取的情况。)
指令预取。(指令缓存寄存器)
数据管理
执行任何 Flash 编程操作(擦除或编程)时, CPU 时钟频率 (HCLK) 不能低于 1 MHz。如果在 Flash 操作期间发生器件复位,无法保证 Flash 中的内容。在对 STM32F4xx 的 Flash 执行写入或擦除操作期间,任何读取 Flash 的尝试都会导致总线阻塞。只有在完成编程操作后,才能正确处理读操作。这意味着,写/擦除操作进行期间不能从 Flash 中执行代码或数据获取操作。
当 FLASH_SR 寄存器中的 BSY 位为 1 时,将不能在写模式下访问 FLASH_CR 寄存器。
BSY 位为 1 时,对该寄存器的任何写操作尝试都会导致 AHB 总线阻塞,直到 BSY 位清零
FPEC(FLASH Program/Erase controller 闪存编程/擦除控制器),STM32通过FPEC来擦除和编程FLASH。FPEC使用7个寄存器来操作闪存:
FPEC键寄存器(FLASH_KEYR) 写入键值解锁。
选项字节键寄存器(FLASH_OPTKEYR) 写入键值解锁选项字节操作。
闪存控制寄存器(FLASH_CR) 选择并启动闪存操作。
闪存状态寄存器(FLASH_SR) 查询闪存操作状态。
闪存地址寄存器(FLASH_AR) 存储闪存操作地址。
选项字节寄存器(FLASH_OBR) 选项字节中主要数据的映象。
写保护寄存器(FLASH_WRPR) 选项字节中写保护字节的映象
在FLASH_CR中,有一个LOCK位,该位为1时,不能写FLASH_CR寄存器,从而也就不能擦除和编程FLASH,这称为闪存锁。 当LOCK位为1时,闪存锁有效,只有向FLASH_KEYR依次写入KEY1、KEY2后,LOCK位才会被硬件清零,从而解除闪存锁。当LOCK位为1时,对FLASH_KEYR的任何错误写操作(第一次不是KEY1,或第二次不是KEY2),都将会导致闪存锁的彻底锁死,一旦闪存锁彻底死,在下一次复位前,都无法解锁,只有复位后,闪存锁才恢复为一般锁住状态。 复位后,LOCK位默认为1,闪存锁有效,此时,可以进行解锁。解锁后,可进行FLASH的擦除编程工作。任何时候,都可以通过对LOCK位置1来软件加锁,软件加锁与复位加锁是一样的,都可以解锁。
为了增强安全性,进行某项操作时,须要向某个位置写入特定的数值,来验证是否为安全的操作,这些数值称为键值。STM32的主FLASH共有三个键值:
RDPRT键 = 0x000000A5 用于解除读保护
KEY1 = 0x45670123 用于解除闪存锁
KEY2 = 0xCDEF89AB 用于解除闪存锁
通过 FLASH_CR 寄存器中的 PSIZE 字段配置并行位数。并行位数表示每次对 Flash 进行写操作时将编程的字节数。 PSIZE 受限于电源电压以及是否使用外部 VPP 电源。因此,在进行任何编程/擦除操作前,必须在 FLASH_CR 寄存器中对其进行正确配置。
Flash 擦除操作只能针对扇区或整个 Flash( 批量擦除)执行。擦除时间取决于 PSIZE 编程值。有关擦除时间的详细信息,请参见器件数据手册的电气特性部分。
注意: 如果在编程并行位数/电压范围设置不一致的情况下启动任何编程或擦除操作,可能会导致出现意外结果。即使后续的读操作指示逻辑值已有效写入存储器中,也无法确定写入操作确实成功。
要使用 VPP(外部电压),必须在 VPP 引脚施加一个外部高压电源( 8 V 到 9 V 之间)。该外部电源必须在直流电耗超过 10 mA 时也能维持该电压范围。建议仅在工厂生产线上进行初始编程时使用VPP。 VPP 电源的供电时间不得超过一小时,否则 Flash 可能会损坏。
color=
Flash 擦除操作可针对扇区或整个 Flash(批量擦除)执行。执行批量擦除时,不会影响OTP 扇区或配置扇区。
扇区擦除的具体步骤如下:
扇区擦除
- 检查 FLASH_SR 寄存器中的 BSY 位,以确认当前未执行任何 Flash 操作
- 在 FLASH_CR 寄存器中,将 SER (激活扇区擦除)位置 1,并从主存储块的 12 个 (STM32F405xx/07xx
和 STM32F415xx/17xx) 或 24 个 (STM32F42xxx 和 STM32F43xxx) 扇区中选择要擦除
的扇区 (SNB)- 将 FLASH_CR 寄存器中的 STRT 位置 1
- 等待 BSY 位清零
- 查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
要执行批量擦除,建议采用以下步骤:**
1.检查 FLASH_SR 寄存器中的 BSY 位,以确认当前未执行任何 Flash 操作
2 将 FLASH_CR 寄存器中的 MER(激活批量擦除 ) 位置 1(STM32F405xx/07xx 和 STM32F415xx/17xx
器件)
3.将 FLASH_CR 寄存器中的 MER 和 MER1 位置 1( STM32F42xxx 和 STM32F43xxx
器件)
4;将 FLASH_CR 寄存器中的 STRT 位置 1
5.等待 BSY 位清零
6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
注意: 如果 FLASH_CR 寄存器中的 MERx 位和 SER 位均置为 1,则无法执行扇区擦除和批量擦除
Flash 编程顺序如下:
- 检查 FLASH_SR 中的 BSY 位,以确认当前未执行任何主要 Flash 操作。
- 将 FLASH_CR 寄存器中的 PG 位置 1。
- 针对所需存储器地址(主存储器块或 OTP 区域内)执行数据写入操作:
— 并行位数为 x8 时按字节写入
— 并行位数为 x16 时按半字写入
— 并行位数为 x32 时按字写入
— 并行位数为 x64 时按双字写入- 等待 BSY 位清零。
- 查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功
不允许针对 Flash 执行跨越 128 位行界限的数据编程操作。如果出现这种情况,写操作将不会执行,并且 FLASH_SR 寄存器中的编程对齐错误标志位 (PGAERR) 将置 1。
写访问宽度(字节、半字、字或双字)必须与所选并行位数类型( x8、 x16、 x32 或 x64)相符。否则,写操作将不会执行,并且 FLASH_SR 寄存器中的编程并行位数错误标志位(PGPERR) 将置 1。
如果未遵循标准的编程顺序(例如,在 PG 位未置 1 时尝试向 Flash 地址写入数据),则操作将中止并且 FLASH_SR 寄存器中的编程顺序错误标志位 (PGSERR) 将置 1。
如果将 FLASH_CR 寄存器中的操作结束中断使能位 (EOPIE) 置 1,则在擦除或编程操作结束时,即 FLASH_SR 寄存器中的繁忙位 (BSY) 清零(操作正确或非正确完成)时,将产生中断。此时, FLASH_SR 寄存器中的操作结束 (EOP) 位置 1。如果在请求编程、擦除或读操作期间出现错误,则 FLASH_SR 寄存器中的以下错误标志位之一将置 1:
● PGAERR、 PGPERR、 PGSERR(编程错误标志)
● WRPERR(保护错误标志)
这种情况下, FLASH_SR 寄存器中的操作错误位 (OPERR) 置 1,并且如果 FLASH_SR 寄存器中的错误中断使能位 (ERRIE) 置 1,则将产生一个中断。
注意: 如果检测到多个连续错误(例如,在对 Flash 进行 DMA 传输期间),则直到连续写操作请求结束,这些错误标志才会清零。
F1 和 F4 选项字节的操作相差较大,去看对应的数据手册。
STM32 的 Flash information block 部分,包含有特殊的选项字节,可以用于系统配置等信息, 其中还有两个有效字节(实际四个字节,两个是校验字节)的用户自定义数据字节。
要针对此扇区执行任何操作, Flash 选项控制寄存器 (FLASH_OPTCR) 中的选项锁定位(OPTLOCK) 必须清零。为了能够将该位清零,用户需要顺序执行以下步骤,锁定状态下Flash 选项控制寄存器 不能操作:
要修改用户选项值,请顺序执行以下步骤:
- 检查 FLASH_SR 寄存器中的 BSY 位,以确认当前未执行任何 Flash 操作
- 在 FLASH_OPTCR 寄存器中写入所需的选项值。
- 将 FLASH_OPTCR 寄存器中的选项启动位 (OPTSTRT) 置 1。
- 等待 BSY 位清零。
- 查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
硬件会自动先擦除用户配置扇区,然后以 FLASH_OPTCR 寄存器中包含的值对所有选项字
节进行编程。
通过往选项字节的RDP写入对应值可对flash进行读保护。
1、将 0xAA 写入读保护选项字节 (RDP) 时,读保护级别即设为 0。
2、将任意值(分别用于设置级别 0 和级别 2 的0xAA 和 0xCC 除外)写入 RDP 选项字节时,即激活读保护级别 1。这是擦除选项字节后的默认读保护级别。
3、将 0xCC 写入 RDP 选项字节时,可激活读保护级别 2。
激活级别 2 后,将永久性禁止 JTAG 端口(相当于 JTAG 熔断)。
STM32主存储块可以分域进行写保护。如果试图对写保护的域进行擦除或编程操作,在闪存状态寄存器(FLASH_SR)中会返回一个写保护错误标志。STM32主存储块每个域4KB,WRP0-WRP3选项字节中的每一位对应一个域,位为0时,写保护有效。对于超过128KB的产品,WRP3.15保护了域31及之后的所有域。显然,擦除选项字节将导致解除主存储块的写保护。