《Nor_Flash数据存储规则与数据读写方法》由会员分享,可在线阅读,更多相关《Nor_Flash数据存储规则与数据读写方法(12页珍藏版)》请在金锄头文库上搜索。
1、NOR FlashNOR FLASH 是 INTEL 在 1988 年推出的一款商业性闪存芯片,它需要很长的时间 进行抹写,大半生它能够提供完整的寻址与数据总线,并允许随机存取存储器上的任何区 域,而且它可以忍受一万次到一百万次抹写循环,是早期的可移除式闪存储媒体的基础。 目录目录NOR Flash 的访问方式 NOR Flash 的烧写方式 NOR Flash 的原理 NOR Flash 的访问方式的访问方式 在 NOR FLASH 的读取数据的方式来看,它与 RAM 的方式是相近的,只要能够提供数据的地址,数据总线就能够正确的挥出数据。考虑到以上的种种原因,多数微处理器将 NOR FLAS
2、H 当做原地运行(Execute in place,XIP)存储器使用,这其实以为着存储在 NOR FLASH 上的程序不需要复制到 RAM 就可以直接运行。由于 NOR FLASH 没有本地坏区管理,所以一旦存储区块发生毁损,软件或驱动程序必须接手这个问题,否则可能会导致设备发生异常。 在解锁、抹除或写入 NOR FLASH 区块时,特殊的指令会先写入已绘测的记忆区的第一页(Page)。接着快闪记忆芯片会提供可用的指令清单给实体驱动程序,而这些指令是由一般性闪存接口(CommON FLASH memory Interface, CFI)所界定的。 与用于随机存取的 ROM 不同,NOR FL
3、ASH 也可以用在存储设备上;不过与NAND FLASH 相比,NOR FLASH 的写入速度一般来说会慢很多。 NOR Flash 的烧写方式的烧写方式 相对于硬件工程师和嵌入式软件工程师一般在完成设计之后常常需要验证FLASH 是否在工作。在应用当中,也有很多时候需要对 FLASH 进行写操作。该文章简单介绍了基于 ARM 芯片的 NOR FLASH 烧写,并提供了 2 个具体的实例和源代码,希望对有需要的朋友有点帮助。在开始之前,先声明一下,这篇文章只是介绍了如何写 NOR FLASH 的烧写驱动,和 H-JTAG/H-FLASHER 没有直接的联系。在后面的介绍里,如无特别说明,处理器
4、指的是 ARM 处理器,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 很类似,但不可以直接进行写操作。对 NO
5、R FLASH 的写操作需要遵循特定的命令序列,最终由芯片内部的控制单元完成写操作。从支持的最小访问单元来看,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
6、,地址 0x1 对应于第 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,每
7、个 SECTOR 包括一定数量的存储单元。对有些大容量的 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 的地址信
10、号是错位连接的,ARM 的 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
11、-BIT) 。这样,处理器才知道在访问的时候如何从FLASH 正确的读取数据。2。 有些 ARM 处理器内部可以设置地址的错位。对于支持软件选择地址错位的处理器,在连接 16-BIT FLASH 的时候,硬件上可以不需要把地址线错位。读者设计的时候,请参考 MCU 的数据手册,以手册为准,以免造成不必要的麻烦。3。 如果处理器支持内部设置地址错位,在实际访问的时候,送出的地址实际上是在MCU 内部做了错位处理,其作用是等效于硬件连接上的错位的。上面的描述可能比较抽象,下面让我们来看 2 个 ARM 处理器访问 16-BIT FLASH的例子:例子 1:ARM 处理器需要从地址 0x0 读取一个
12、 BYTE1 - ARM 处理器在地址线 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-BI
13、T 数据单元输出到 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 的处
14、理器,因为 ARM 处理器的每个地址对应的是一个 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-B
15、IT FLASH 烧写驱动实例 - HY29F040HY29F040 是现代公司的一款 8-BIT 的 NOR FLASH。在这个小节里,我们以这个芯片为例子,介绍如何对 8-BIT NOR FLASH 进行操作。HY29F040 的容量为 512K-BYTE,总共包括 8 个 SECTOR,每个 SECTOR 的容量是 64K-BYTE。该芯片支持 SECTOR 擦除,整片擦除和以 BYTE 为基本单位的写操作。HY29F040 的命令定义如表-1 所示。下面,我们来看看如何实现基本的擦除和编程操作。在本节后面的描述中,我们使用了下面的 2 个定义:U32 sysbase; /该变量用来表示
16、 FLASH 的起始地址#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 的起始地址,而 SysAddr8 中的OFFSET 则代表了相对于 FLASH 起始地址的 BYTE 偏移量。OFFSET 也是 8-BIT FLASH 在自己的地址信号 An-A0 上看到的地址。整片擦除操作整片擦除操作共需要 6 个周期的总线写操作1 将 0xAA 写到 FLASH 地址 0x55552