收藏 分享(赏)

Nor Flash数据存储规则与数据读写方法.doc

上传人:HR专家 文档编号:5154077 上传时间:2019-02-10 格式:DOC 页数:12 大小:290.50KB
下载 相关 举报
Nor Flash数据存储规则与数据读写方法.doc_第1页
第1页 / 共12页
Nor Flash数据存储规则与数据读写方法.doc_第2页
第2页 / 共12页
Nor Flash数据存储规则与数据读写方法.doc_第3页
第3页 / 共12页
Nor Flash数据存储规则与数据读写方法.doc_第4页
第4页 / 共12页
Nor Flash数据存储规则与数据读写方法.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、NOR FlashNOR FLASH 是 INTEL 在 1988 年推出的一款商业性闪存 芯片,它需要很长的时间进行抹写,大半生它能够提供完整的寻址与数据总线,并允许随机存取存储器上的任何区域,而且它可以忍受一万次到一百万次抹写循环,是早期的可移除式闪存储媒体的基础。 目录 NOR Flash 的访问方式 NOR Flash 的烧写方式 NOR Flash 的原理 NOR Flash 的访问方式 在 NOR FLASH 的读取数据的方式来看,它与 RAM 的方式是相近的,只要能够提供数据的地址,数据总线就能够正确的挥出数据。考虑到以上的种种原因,多数微处理器将 NOR FLASH 当做原地运

2、行(Execute in place,XIP)存储器使用,这其实以为着存储在 NOR FLASH 上的程序不需要复制到 RAM 就可以直接运行。由于 NOR FLASH 没有本地坏区管理,所以一旦存储区块发生毁损,软件或驱动程序必须接手这个问题,否则可能会导致设备发生异常。 在解锁、抹除或写入 NOR FLASH 区块时,特殊的指令会先写入已绘测的记忆区的第一页(Page) 。接着快闪记忆芯片会提供可用的指令清单给实体驱动程序,而这些指令是由一般性闪存接口(CommON FLASH memory Interface, CFI)所界定的。 与用于随机存取的 ROM 不同,NOR FLASH 也可

3、以用在存储设备上;不过与NAND FLASH 相比,NOR FLASH 的写入速度一般来说会慢很多。 NOR Flash 的烧写方式 相对于硬件工程师和嵌入式软件工程师一般在完成设计之后常常需要验证FLASH 是否在工作。在应用当中,也有很多时候需要对 FLASH 进行写操作。该文章简单介绍了基于 ARM 芯片的 NOR FLASH 烧写,并提供了 2 个具体的实例和源代码,希望对有需要的朋友有点帮助。在开始之前,先声明一下,这篇文章只是介绍了如何写 NOR FLASH 的烧写驱动,和 H-JTAG/H-FLASHER 没有直接的联系。在后面的介绍里,如无特别说明,处理器指的是 ARM 处理器

4、,FLASH 指的都是 NOR FLASH。另外,BYTE 指的是 8-BIT 的数据单元,HALF-WORD 代表的是 16-BIT的数据单元,而 WORD 则代表了 32-BIT 的数据单元。1。 NOR FLASH 的简单介绍NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失。NOR FLASH 支持Execute ON Chip,即程序可以直接在 FLASH 片内执行。这点和 NAND FLASH 不一样。因此,在嵌入是系统中,NOR FLASH 很适合作为启动程序的存储介质。NOR FLASH 的读取和 RAM 很类似,但不可以直接进行写操作。对 NOR FLASH 的写操

5、作需要遵循特定的命令序列,最终由芯片内部的控制单元完成写操作。从支持的最小访问单元来看,NOR FLASH 一般分为 8 位的和 16 位的(当然,也有很多 NOR FLASH芯片同时支持 8 位模式和是 16 位模式,具体的工作模式通过特定的管脚进行选择) 。 对 8 位的 NOR FLASH 芯片,或是工作在 8-BIT 模式的芯片来说,一个地址对应一个BYTE(8-BIT)的数据。例如一块 8-BIT 的 NOR FLASH,假设容量为 4 个 BYTE。那芯片应该有 8 个数据信号 D7-D0 和 2 个地址信号,A1-A0。地址 0x0 对应第 0 个 BYTE,地址 0x1 对应于

6、第 1BYTE,地址 0x2 对应于第 2 个 BYTE,而地址 0x3 则对应于第 3 个 BYTE 对 16 位的 NOR FLASH 芯片,或是工作在 16-BIT 模式的芯片来说,一个地址对应于一个 HALF-WORD(16-BIT)的数据。例如,一块 16-BIT 的 NOR FLASH,假设其容量为 4 个 BYTE。那芯片应该有 16 个数据信号线 D15-D0 和 1 个地址信号 A0。地址 0x0 对应于芯片内部的第 0 个 HALF-WORD,地址 0x1 对应于芯片内部的第 1 个 HALF-WORD。 FLASH 一般都分为很多个 SECTOR,每个 SECTOR 包括

7、一定数量的存储单元。对有些大容量的 FLASH,还分为不同的 BANK,每个 BANK 包括一定数目的 SECTOR。FLASH 的擦除操作一般都是以 SECTOR,BANK 或是整片FLASH 为单位的。在对 FLASH 进行写操作的时候,每个 BIT 可以通过编程由 1 变为 0,但不可以有 0修改为 1。为了保证写操作的正确性,在执行写操作前,都要执行擦除操作。擦除操作会把 FLASH 的一个 SECTOR,一个 BANK 或是整片 FLASH 的值全修改为 0xFF。这样,写操作就可以正确完成了。2。 ARM 处理器的寻址ARM 可以说是目前最流行的 32 位嵌入式处理器。在这里只提一

8、下 ARM 处理器的寻址,为后面做个铺垫。从处理器的角度来看,系统中每个地址对应的是一个 BYTE 的数据单元。这和很多别的处理器都是一样的。3。 处理器和 NOR FLASH 的硬件连接从前面的介绍,我们知道从处理器的角度来看,每个地址对应的是一个 BYTE 的数据单元。而,NOR FLASH 的每个地址有可能对应的是一个 BYTE 的数据单元,也有可能对应的是一个 HALF-WORD 的数据单元。所以在硬件设计中,连接 ARM 处理器和 NOR FLASH 时,必须根据实际情况对地址信号做特别的处理。如果 ARM 处理器外部扩展的是 8-BIT 的 NOR FLASH, 数据线和地址线的连

9、接应该如图 1 所示。 从图中我们可以看到,处理器的数据信号 D0-D7 和 FLASH 的数据信号D0-D7 是一一对应连接的,处理器的地址信号 A0-An 和 NOR FLASH 的地址信号 A0-An 也是一一对应连接的。如果 ARM 处理器外部扩展的是 16-BIT 的 NOR FLASH, 数据线必须要错位连接。 图 2 给了一个 ARM 处理器和 16-BITNOR FLASH 的连接示意图。如图 2 所示,ARM处理器的数据信号 D0-D15 和 FLASH 的数据信号 D0-D15 是一一对应的。而 ARM 处理器的地址信号和 NOR FLASH 的地址信号是错位连接的,ARM

10、 的 A0 悬空,ARM 的 A1 连接 FLASH 的 A0,ARM 的 A2 连接 FLASH 的 A1,依次类推。需要错位连接的原因是:ARM 处理器的每个地址对应的是一个 BYTE 的数据单元,而 16-BIT 的 FLASH 的每个地址对应的是一个 HALF-WORD(16-BIT)的数据单元。为了保持匹配,所以必须错位连接。这样,从 ARM 处理器发送出来的地址信号的最低位 A0 对 16-BIT FLASH 来说就被屏蔽掉了。补充说明:1。 一般来说,ARM 处理器内部要设置相应的寄存器,告诉处理器外部扩展的FLASH 的位宽(8-BIT/16-BIT/32-BIT) 。这样,处

11、理器才知道在访问的时候如何从FLASH 正确的读取数据。2。 有些 ARM 处理器内部可以设置地址的错位。对于支持软件选择地址错位的处理器,在连接 16-BIT FLASH 的时候,硬件上可以不需要把地址线错位。读者设计的时候,请参考 MCU 的数据手册,以手册为准,以免造成不必要的麻烦。3。 如果处理器支持内部设置地址错位,在实际访问的时候,送出的地址实际上是在MCU 内部做了错位处理,其作用是等效于硬件连接上的错位的。上面的描述可能比较抽象,下面让我们来看 2 个 ARM 处理器访问 16-BIT FLASH的例子:例子 1:ARM 处理器需要从地址 0x0 读取一个 BYTE1 - AR

12、M 处理器在地址线 An-A0 上送出信号 0x0;2 16-BIT FLASH 在自己的地址信号 An-A0 上看到的地址是 0x0,然后将地址0x0 对应的 16-BIT 数据单元输出到 D15-D0 上;3 ARM 处理器知道访问的是 16-BIT 的 FLASH,从 D7-D0 上读取所需要的一个BYTE 的数据 ;例子 2:ARM 处理器需要从地址 0x1 读取一个 BYTE1 - ARM 处理器在地址线 An-A0 上送出信号 0x1;2 16-BIT FLASH 在自己的地址信号 An-A0 上看到的地址依然是 0x0, 然后将地址 0x0 对应的 16-BIT 数据单元输出到

13、D15-D0 上;3 ARM 处理器知道访问的是 16-BIT 的 FLASH,从 D15-D8 上读取所需要的一个BYTE 的数据;4。 从软件角度来看 ARM 处理器和 NOR FLASH 的连接在上一个小节里,我们简单了解了 ARM 处理器和 FLASH 的硬件连接。在这个小节里面,我们从软件的角度来理解 ARM 处理器和 FLASH 的连接。对于 8-BIT 的 FLASH的连接,很好理解,因为 ARM 处理器和 8-BIT FLASH 的每个地址对应的都是一个 BYTE 的数据单元。所以地址连接毫无疑问是一一对应的。如果 ARM 处理器连接的是 16-BIT 的处理器,因为 ARM

14、处理器的每个地址对应的是一个 BYTE 的数据单元,而 16-BIT FLASH 的每个地址对应的是一个 HALF-WORD 的 16-BIT 的数据单元。所以,也毫无疑问,ARM 处理器访问 16-BIT 处理器的时候,地址肯定是要错开一位的。在写FLASH 驱动的时候,我们不需要知道地址错位是由硬件实现的,还是是通过设置 ARM 处理器内部的寄存器来实现的,只需要记住 2 点:1 ARM 处理器访问 8-BIT FLASH 的时候,地址是一一对应的 ;2 ARM 处理器访问 16-BIT FLASH 的时候,地址肯定是错位的。这一点对理解后面的例子会很有帮助。5。 8-BIT FLASH

15、烧写驱动实例 - HY29F040HY29F040 是现代公司的一款 8-BIT 的 NOR FLASH。在这个小节里,我们以这个芯片为例子,介绍如何对 8-BIT NOR FLASH 进行操作。HY29F040 的容量为 512K-BYTE,总共包括 8 个 SECTOR,每个 SECTOR 的容量是 64K-BYTE。该芯片支持 SECTOR 擦除,整片擦除和以 BYTE 为基本单位的写操作。HY29F040 的命令定义如表-1 所示。下面,我们来看看如何实现基本的擦除和编程操作。在本节后面的描述中,我们使用了下面的 2 个定义:U32 sysbase; /该变量用来表示 FLASH 的起

16、始地址#define SysADDR8(sysbase, offset) (volatile U8*)(sysbase)+(offset)/用来方便对指定的 FALSH 地址进行操作先解释一下 SysAddr8 的定义。这个宏定义了一个 BYTE(8-BIT)指针,其地址为(sysbase + offset)。假设 FLASH 的起始地址为 0x10000000,如果要将 0xAB 写到FLASH 的第一个 BYTE 中去,可以用下面的代码:*SysAddr8(0x10000000, 0x1) = 0xAB;注意:在本节后面的描述中,SYSBASE 代表的是 FLASH 的起始地址,而 Sys

17、Addr8 中的OFFSET 则代表了相对于 FLASH 起始地址的 BYTE 偏移量。OFFSET 也是 8-BIT FLASH 在自己的地址信号 An-A0 上看到的地址。整片擦除操作整片擦除操作共需要 6 个周期的总线写操作1 将 0xAA 写到 FLASH 地址 0x55552 将 0x55 写到 FLASH 地址 0x2AAA3 将 0x80 写到 FLASH 地址 0x55554 将 0xAA 写到 FLASH 地址 0x55555 将 0x55 写到 FLASH 地址 0x2AAA6 将 0x10 写到 FLASH 地址 0x5555对应的代码:*SysAddr8(sysbase

18、, 0x5555) = 0xAA; /将值 0xAA 写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55; /将值 0x55 写到 FLASH 地址 0x2AAA*SysAddr8(sysbase, 0x5555) = 0x80; /将值 0x80 写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x5555) = 0xAA; /将值 0xAA 写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55; /将值 0x55 写到 FLASH 地址 0x2AAA*SysAdd

19、r8(sysbase, 0x5555) = 0x10; /将值 0x10 写到 FLASH 地址 0x5555SECTOR 擦除操作SECTOR 的擦除操作共需要 6 个周期的总线写操作1 将 0xAA 写到 FLASH 地址 0x55552 将 0x55 写到 FLASH 地址 0x2AAA3 将 0x80 写到 FLASH 地址 0x55554 将 0xAA 写到 FLASH 地址 0x55555 将 0x55 写到 FLASH 地址 0x2AAA6 将 0x30 写到要擦除的 SECTOR 对应的地址对应的代码:*SysAddr8(sysbase, 0x5555) = 0xAA; /将值

20、 0xAA 写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55; /将值 0x55 写到 FLASH 地址 0x2AAA*SysAddr8(sysbase, 0x5555) = 0x80; /将值 0x80 写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x5555) = 0xAA; /将值 0xAA 写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55; /将值 0x55 写到 FLASH 地址 0x2AAA*SysAddr8(sysbase, addr) = 0

21、x30; /将值 0x30 写到要擦除的 SECTOR 对应的地址BYTE 编程操作写一个 BYTE 的数据到 FLASH 中去,需要 4 个周期的总线写操作1 将 0xAA 写到 FLASH 地址 0x55552 将 0x55 写到 FLASH 地址 0x2AAA3 将 0xA0 写到 FLASH 地址 0x55554 将编程数据(BYTE)写到对应的编程地址上去对应的代码:*SysAddr8(sysbase, 0x5555) = 0xAA; /将值 0xAA 写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55; /将值 0x55 写到 F

22、LASH 地址 0x2AAA*SysAddr8(sysbase, 0x5555) = 0xA0; /将值 0xA0 写到 FLASH 地址 0x5555*SysAddr8(sysbase, addr) = data; /将一个 BYTE 的数据写到期望的地址6。 16-BIT FLASH 烧写驱动实例 - SST39VF160SST39VF160 是 SST 公司的一款 16-BIT 的 NOR FLASH。 在这个小节里, 我们以 SST39VF160 为例子, 介绍如何对 16-BIT NOR FLASH 进行操作。对 8-BIT FLASH 的操作很好理解,但对 16-BIT FLASH

23、 的操作理解起来要晦涩很多。我尽力描述得清楚些。SST39VF160 的容量为 2M-BYTE , 总共包括 512 个 SECTOR, 每个 SECTOR 的容量是 4K-BYTE。 该芯片支持 SECTOR 擦除,整片擦除和以 HALF-WORD 为基本单位的写操作。SST39VF160 的命令定义如表-2 所示。在表 2 中,因为所有命令都是从 FLASH 的角度来定义的。 所以, 所有的地址都是 HALF-WORD 地址, 指的是16-BIT FLASH 在自己的地址信号 An-A0 上看到的地址。在本节后面的描述中,我们使用了下面的 2 个定义:U32 sysbase; /该变量用来

24、表示 FLASH 的起始地址#define SysAddr16(sysbase, offset) (volatile U16*)(sysbase)+(offset)/用来方便对指定的 FALSH 地址进行操作SysAddr16(sysbase, offset)首先定义了一个 16-BIT HALF-WORD 的指针,指针的地址为 sysbase,然后根据 offset 做个偏移操作。 因为 HALF-WORD 指针的地址是 2 个 BYTE 对齐的, 所以每个偏移操作会使得地址加 2。 最终, SysAddr16 (sysbase, offset)相当于定义了一个 HALF-WORD 的指针,

25、其最终地址为(sysbase + 2offset) 。在使用 SysAddr16 的时候,将 sysbase 设置成 FLASH 的起始地址,offset 则可以理解为相对于 FLASH 起始地址的 HALF-WORD 偏移量或是偏移地址。假设 FLASH 的起始地址为 0x10000000,SysAddr16(0x10000000, 0)指向 16-BIT FLASH 的第 0 个 HALF-WORD, SysAddr16(0x10000000, 1 指向 16-BIT FLASH 的第 1 个 HALF-WORD。依次类推。如果要将 0xABCD 分别写到 FLASH 的第0 个和第 1

26、个 HALF-WORD 中去,可以用下面的代码:*SysAddr16(0x10000000, 0x0) = 0xABCD;*SysAddr16(0x10000000, 0x1) = 0xABCD;接下来,我们分别从 ARM 处理器的角度和 FLASH 的角度来具体分析一下。从 ARM 的角度来看:假设 FLASH 的起始地址为 0x10000000,因为 ARM 处理器知道 FLASH 的地址空间为 0x10000000 (0x10000000 +FLASH 容量 1),所以在对这个地址空间进行访问的时候,会设置好 FLASH 的片选信号,并将低位的地址输出到 地址信号上。以*SysAddr1

27、6(0x10000000, 0x1) = 0xABCD 为例。从 ARM 处理器的角度来看,该操作是把 0xABCD 写到地址 0x10000002 上去。所以 ARM 处理器最终会在它的地址信号 An-A0 输出地址 0x2,同时会在 D15-D0 上输出 0xABCD。从 FLASH 的角度来看:还是以 *SysAddr16(0x10000000, 0x1) = 0xABCD 为例,FLASH 看到的地址是多少呢?接着分析。 ARM 处理器在执行操作的时候,会设置好相应的 FLASH 片选使能信号,并在 ARM 的地址信号 An-A0 上输出 0x2。因为 ARM 和 16-BIT FLA

28、SH 的地址信号的连接是错开一位的, 所以, FLASH 最终在自己的地址 An-A0 上看到的信号是0x1, 相当于将 ARM处理器输出的地址往右做了一个移位操作,刚好对应的是 FLASH 的第 1 个 HALF-WORD。同时, FLASH 会在自己的 D15-D0 上看到数据 0xABCD。通过上面的分析,我们知道 SysAddr16 中指定的 offset 的值就是 16-BIT FLASH 在自己的地址 An-A0 上看到的值。所以,我们可以很方便的通过 SysAddr16(sysbase, offset) 对 FLASH 进行操作,其中 sysbase 代表 FLASH 起始地址,

29、offset 则代表了 FLASH 的第几个 HALF-WORD(HALF-WORD 偏移量或偏移地址) 。注意:1。 在本节后面的描述中,SysAddr16 中的 SYSBASE 代表的是 FLASH 的起始地址,而 SysAddr16 中的 OFFSET 则代表了相对于 FLASH 起始地址的 HALF-WORD 偏移量或偏移地址。OFFSET 的值也是 16-BIT FLASH 在自己的地址信号 An-A0 上看到的值。2。在 SST39VF160 的命令定义中,所有的地址都是针对 FLASH 的 HALF-WORD地址,指的是在 FLASH 自己的地址信号 An-A0 上看到的地址。整

30、片擦除操作整片擦除操作共需要 6 个周期的总线写操作1 将 0x00AA 写到 FLASH HALF-WORD 地址 0x55552 将 0x0055 写到 FLASH HALF-WORD 地址 0x2AAA3 将 0x0080 写到 FLASH HALF-WORD 地址 0x55554 将 0x00AA 写到 FLASH HALF-WORD 地址 0x55555 将 0x0055 写到 FLASH HALF-WORD 地址 0x2AAA6 将 0x0010 写到 FLASH HALF-WORD 地址 0x5555对应的代码:*SysAddr16(sysbase, 0x5555) = 0x00

31、AA; /将值 0x00AA 写到 FLASH HALF-WORD 地址 0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055; /将值 0x0055 写到 FLASH HALF-WORD 地址 0x2AAA*SysAddr16(sysbase, 0x5555) = 0x0080; /将值 0x0080 写到 FLASH HALF-WORD 地址 0x5555*SysAddr16(sysbase, 0x5555) = 0x00AA; /将值 0x00AA 写到 FLASH HALF-WORD 地址 0x5555*SysAddr16(sysbase, 0x2AAA

32、) = 0x0055; /将值 0x0055 写到 FLASH HALF-WORD 地址 0x2AAA*SysAddr16(sysbase, 0x5555) = 0x0010; /将值 0x0010 写到 FLASH HALF-WORD 地址 0x5555SECTOR 擦除操作SECTOR 的擦除操作共需要 6 个周期的总线写操作1 将 0x00AA 写到 FLASH HALF-WORD 地址 0x55552 将 0x0055 写到 FLASH HALF-WORD 地址 0x2AAA3 将 0x0080 写到 FLASH HALF-WORD 地址 0x55554 将 0x00AA 写到 FLA

33、SH HALF-WORD 地址 0x55555 将 0x0055 写到 FLASH HALF-WORD 地址 0x2AAA6 将 0x0030 写到要擦除的 SECTOR 对应的 HALF-WORD 地址对应的代码:*SysAddr16(sysbase, 0x5555) = 0x00AA; /将值 0x00AA 写到 FLASH HALF-WORD 地址 0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055; /将值 0x0055 写到 FLASH HALF-WORD 地址 0x2AAA*SysAddr16(sysbase, 0x5555) = 0x0080;

34、/将值 0x0080 写到 FLASH HALF-WORD 地址 0x5555*SysAddr16(sysbase, 0x5555) = 0x00AA; /将值 0x00AA 写到 FLASH HALF-WORD 地址 0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055; /将值 0x0055 写到 FLASH HALF-WORD 地址 0x2AAA*SysAddr16(sysbase, addr 1) = 0x0030; /将值 0x0030 写到要擦除的 SECTOR 对应的HALF-WORD 地址注意:上面的代码中第 6 个操作周期中的 ADDR 是从

35、ARM 处理器的角度来看的 BYTE 地址,因为在擦除的时候,用户希望指定的是从 ARM 的角度看到的地址,这样更方便和更直观。而在 SysAddr16 的宏定义中,OFFSET 表示的是相对于 FLASH 起始地址的 HALF-WORD 偏移量,或是 FLASH 在自己的地址信号 An-A0 上看到的地址。所以需要执行一个右移操作,把 ADDR 转换成 HALF-WORD 地址。举例说明,SST39VF160 每个 SECTOR 的大小是 4K-BYTE。从 ARM 处器的角度和用户的角度来看,SECTOR-0 相对于 FLASH 起始地址的 BYTE 地址是 0x0;从FLASH 来看 S

36、ECTOR-0 的 HALF-WORD 地址是 0x0。从 ARM 处理器的角度和用户的角度来看, FLASH SECTOR-1 相对于 FLASH 起始地址的 BYTE 地址 0x1000; 从FLASH 来看, SECTOR-1 的 HALF-WORD 地址应该是 (0x1000 1) = 0x800。如果要擦除 SECTOR-0,上面代码的第 6 条指令应该是 :*SysAddr16(sysbase, 0x0 1) = 0x0030;如果要擦除 SECTOR-1,上面代码的第 6 条指令应该是 :*SysAddr16(sysbase, 0x1000 1) = 0x0030;HALF-WO

37、RD 编程操作写一个 HALF-WORD 的数据到 FLASH 中去,需要 4 个周期的总线写操作1 将 0x00AA 写到 FLASH HALF-WORD 地址 0x55552 将 0x0055 写到 FLASH HALF-WORD 地址 0x2AAA3 将 0x00A0 写到 FLASH HALF-WORD 地址 0x55554 将编程数据(HALF-WORD)写到对应的 HALF-WORD 地址对应的代码:*SysAddr16(sysbase, 0x5555) = 0x00AA; /将值 0x00AA 写到 FLASH 地址 0x5555*SysAddr16(sysbase, 0x2AA

38、A) = 0x0055; /将值 0x0055 写到 FLASH 地址 0x2AAA*SysAddr16(sysbase, 0x5555) = 0x00A0; /将值 0x00A0 写到 FLASH 地址 0x5555*SysAddr16(sysbase, addr 1) = data; /将数据写到对应的 HALF-WORD 地址注意:上面的代码中第 4 个操作周期中的 ADDR 是从 ARM 处理器的角度来看的 BYTE 地址,因为在执行写操作的时候,用户希望指定的是从 ARM 的角度看到的地址,这样会更方便和更直观。而在 SysAddr16 的宏定义中,OFFSET 表示的是相对于 FL

39、ASH 起始地址的 HALF-WORD 偏移量。 所以需要执行一个右移操作, 把它转换成 HALF-WORD地址。举例说明,如果要数据 0x0123 写到地址 0x0 去,对应的是 FLASH 的第 0 个 HAFL-WORD,对应的 HALF-WORD 地址应该是 0x0,上面代码的第 4 条指令应该是:*SysAddr16(sysbase, 0x0 1) = 0x0123;如果要数据 0x4567 写到地址 0x2 去, 对应的是 FLASH 的第 1 个 HALF-WORD, 对应的 HALF-WORD 地址应该是 0x1, 上面代码的第 4 条指令应该是:*SysAddr16(sysb

40、ase, 0x2 1) = 0x4567;如果要数据 0x89AB 写到地址 0x4 去, 对应的是 FLASH 的第 2 个 HALF-WORD, 对应的 HALF-WORD 地址应该是 0x2,上面代码的第 4 条指令应该是:*SysAddr16(sysbase, 0x4 1) = 0x89AB;如果要数据 0xCDEF 写到地址 0x6 去,对应的是 FLASH 的第 3 个 HALF-WORD,对应的 HALF-WORD 地址应该是 0x3,上面代码的第 4 条指令应该是:*SysAddr16(sysbase, 0x6 1) = 0xCDEF;7。 ADS 版源代码下载如果用户有需要,

41、可以去下载在前面讨论的 2 个实例的 ADS 版的完整源代码和 FLASH 数据手册。提供给用户的程序都是在实际使用过程中经过测试的。源代码只供用户参考,并不一定能直接使用在用户的开发板上。用户需要根据自己实际使用的芯片进行相应的修改。8。 结束语这篇文章简单介绍了如何对 NOR FLASH 进行操作, 但没有包括状态查询, 保护等其他操作。 对于更复杂的多片 FLASH 并联的情况也没有讨论。有需要的朋友可以自己去研究。NOR Flash 的原理 从物理层面解释,NOR 闸闪存的每个存储单元类似一个标准 MOSFET ,除了晶体管有两个而不是一个闸极。在顶部的是控制闸(CONTROL Gat

42、e,CG),它的徐阿奴阿布是土匪以氧化物层与周遭绝缘的浮闸(Floathing Gate,FG)。由于这个 FG 在电气程度上是出于绝缘层独立的,所以湖边人员的毒啊班组会被困在里面,在一般的条件下,电荷经过很长时间都不会产生逃逸的情况。将 FG 放在 CG 与 MOSFET 通道之间。当 FG抓到电荷时,它部分屏蔽掉来自 CG 的电场,并改变这个单元的阀电压 (VT)。在读出期间。利用向 CG 的电压,MOSFET 通道会变的导电或保持绝缘。这视乎该单元的 VT 而定(而该单元的 VT 受到 FG 上的电荷控制) 。这股电流流过 MOSFET 通道,并以二进制码的方式读出、再现存储的数据。在每

43、单元存储 1 位以上的数据的 MLC 设备中,为了能够更精确的测定 FG 中的电荷位准,则是以感应电流的量(而非单纯的有或无)达成的。逻辑上,单层 NOR FLASH 单元在默认状态代表二进制码中的“1“值,因为在以特定的电压值控制闸极时,电流会流经通道。经由以下流程,NOR FLASH 单元可以被设置为二进制码中的“0“ 值。1。 对 CG 施加高电压(通常大于 5V)。2。 现在通道是开的,所以电子可以从源极流入汲极(想像它是 NMOS 晶体管)。3。 源-汲电流够高了,足以导致某些高能电子越过绝缘层,并进入绝缘层上的 FG,这种过程称为热电子注入。由于汲极与 CG 间有一个大的、相反的极性电压,借由量子穿隧效应可以将电子拉出FG,所以能够地用这个特性抹除 NOR FLASH 单元( 将其重设为“1“状态)。现代的 NOR FLASH 芯片被分为若干抹除片段(常称为区扇(Blocks or sectors),抹除操作只能以这些区块为基础进行;所有区块内的记忆单元都会被一起抹除。不过一般而言,写入 NOR FLASH 单元的动作却可以单一字节的方式进行。虽然抹写都需要高电压才能进行,不过实际上现今所有闪存芯片是借由芯片内的电荷帮浦产生足够的电压,所以只需要一个单一的电压供应即可。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > Flash/Flex

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报