浅谈NorFlash的原理及其应用
nor flash读工作原理
nor flash读工作原理Nor Flash是一种非易失性存储器,其读取工作原理是指在读取数据时的操作过程和原理。
下面将介绍Nor Flash读取工作原理。
Nor Flash的读取操作主要分为地址寻址和数据读取两个步骤。
首先,在进行读取操作之前,需要通过地址线将要读取的数据的地址发送给Nor Flash。
Nor Flash的存储单元被划分为多个块,每个块又由多个扇区组成。
通过地址寻址,可以确定要读取的数据所在的扇区和块的位置。
在确定了要读取的数据所在的扇区和块的位置后,Nor Flash会通过内部的控制电路将存储单元中的数据读取出来。
Nor Flash的存储单元由一系列的存储单元组成,每个存储单元可以存储一个二进制位的数据。
在读取操作时,Nor Flash会根据地址线指定的位置,将对应存储单元中的数据读取出来。
Nor Flash的读取操作是通过电压的变化来实现的。
具体来说,当读取操作开始时,Nor Flash会将电压控制线设置为读取模式,并将控制电路连接到对应的存储单元。
然后,Nor Flash会将一个特定的电压施加到被选中的存储单元上。
根据存储单元中存储的数据是0还是1,Nor Flash会通过读取电路将对应的电压信号转换为数字信号。
最后,Nor Flash会将转换后的数字信号传递给外部的读取电路。
Nor Flash的读取速度相对较慢,主要受到两个因素的影响。
首先,Nor Flash的存储单元是通过悬空栅效应实现的,这种结构相对复杂,导致了读取速度较慢。
其次,Nor Flash的读取操作需要通过多个步骤完成,包括地址寻址、电压施加和电压转换等。
这些步骤的完成需要一定的时间,进而影响了读取速度。
为了提高Nor Flash的读取速度,可以采取一些优化措施。
例如,可以通过增加读取电路的并行性来提高读取速度。
同时,还可以通过优化控制电路和读取电路的设计,减少读取操作的步骤和延迟,从而提高读取速度。
总结起来,Nor Flash的读取工作原理是通过地址寻址和数据读取两个步骤完成的。
NANDFlash原理和使用
NANDFlash原理和使用一、NAND Flash的原理NAND Flash基于浮栅效应晶体管(Floating Gate Field Effect Transistor)的工作原理进行存储数据。
每个存储单元包含一个浮动栅和一个控制栅,通过对控制栅施加电压,可以改变浮动栅中电子的分布状态。
当浮动栅的电荷状态表示0时,电子充分存储在浮动栅中;而当浮动栅的电荷状态表示1时,几乎没有电子存储在浮动栅中。
数据的写入和擦除是NAND Flash的两个重要操作。
写入数据时,首先需要根据所需的数据位序列确定相应的单元位置,然后通过施加一定的电压对浮动栅进行充、放电,以改变电子的位状态。
擦除数据时,需要对整个块进行一次性的擦除操作,将所有存储单元的电子位状态恢复为0。
同时,为了提高存储密度和读写性能,NAND Flash还使用了一些技术,如多层单元(Multi-Level Cell,MLC)和三层单元(Triple-Level Cell,TLC)来实现在每个存储单元中存储多位数据。
二、NAND Flash的使用1. 存储器层面:NAND Flash因其非易失性和快速读写性能被广泛应用于存储器中,取代了传统的硬盘驱动器。
固态硬盘(SSD)是其中的典型应用,它不仅在电脑中使用,也可以用于服务器、云存储等领域。
2. 智能手机和平板电脑:NAND Flash被广泛应用于智能手机和平板电脑中的存储器,用于存储操作系统、应用程序和用户数据。
由于NAND Flash具有快速的读写速度和较小的体积,可实现轻薄设计,因此非常适合移动设备。
3. 数字相机和摄像机:NAND Flash也用作数码相机和摄像机中的存储媒介,用于保存拍摄的照片和视频。
相比于传统的存储卡,NAND Flash 存储器具有更高的读写速度和更大的容量,可以满足高清拍摄的需求。
4. 汽车电子:随着汽车电子的普及,NAND Flash也开始在汽车的娱乐系统、导航系统和车载电子控制单元中得到应用。
norflash读写原理
norflash读写原理
NorFlash是一种基于NOR门的闪存存储器,常用于嵌入式系统和移
动设备中。
NorFlash读写原理详细如下:
1. NorFlash的存储单元是基于NOR门的,NOR门是一种由两个并
联的晶体管构成的门电路。
这意味着每个存储单元都需要两个晶体管
来读取或写入数据。
2. 由于它使用的是NOR门,Norflash的读操作是直接的。
读操作的
时候,将地址放置于地址总线上,然后该地址将直接映射到存储器单元。
当地址被选中时,数据被从存储单元读取到存储器的输出引脚。
读操作不会影响存储器单元的数据。
3. NorFlash的写操作比读操作复杂。
它需要进行多个步骤,例如擦除,编程和校验。
擦除操作将存储器中的数据全部清除为1。
编程操作将操作码和数据写入存储器中的指定地址。
校验操作用于验证编程操作是
否成功。
4. NorFlash的写操作需要一个称为“写使能控制器”的特殊控制器。
写使能控制器向存储器发出一个信号,告诉存储器将数据写入指定的
地址。
写使能控制器还确保编程操作在操作码和数据被成功编程之后,
存储器单元返回正确的状态值。
总之,NorFlash的读写原理是基于NOR门,并且需要进行多个步骤来完成写操作。
了解NorFlash的读写原理可以帮助我们更好地理解如何在嵌入式系统或移动设备中储存和读取数据。
关于NOR Flash擦写和原理分析
关于NOR Flash擦写和原理分析NOR Flash NOR Flash是现在市场上两种主要的非易失闪存技术之一。
Intel 于1988年首先开发出NOR Flash 技术,彻底改变了原先由EPROM(Erasable Programmable Read-Only-Memory电可编程序只读存储器)和EEPROM(电可擦只读存储器Electrically Erasable Programmable Read - Only Memory)一统天下的局面。
紧接着,1989年,东芝公司发表了NAND Flash 结构,强调降低每比特的成本,有更高的性能,并且像磁盘一样可以通过接口轻松升级。
NOR Flash 的特点是芯片内执行(XIP ,eXecute In Place),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中。
NOR 的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响到它的性能。
NAND的结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。
应用NAND的困难在于Flash的管理需要特殊的系统接口。
性能比较 flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。
任何flash 器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。
NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。
由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。
执行擦除时块尺寸的不同进一步拉大了NOR和NAND之间的性能差距,统计表明,对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行。
norflash原理
norflash原理NorFlash,全称为“非易失性闪存”(Non-volatile Flash Memory),是一种基于闪存技术的非易失性存储设备。
它是存储芯片中的一种存储单元,主要用于嵌入式系统和智能手机等设备中,用于存储和读取数据。
NorFlash可以保持数据的稳定存储状态,并且读写速度较快,寿命较长,是目前使用最广泛的一种闪存技术之一NorFlash的工作原理主要包括存储单元、地址索引和控制电路。
存储单元是NorFlash的核心,由一系列的存储晶体管组成。
每个存储晶体管可以存储一个比特的数据。
每个存储单元都能够通过一个唯一的地址进行寻址,通过读取和写入操作来访问数据。
NorFlash中的数据是按字节顺序存储的,每个字节都有一个相应的地址。
这些地址存储在芯片内部的索引寄存器中。
当读取数据时,控制电路根据给定的地址,找到相应的索引,然后将存储单元对应位置的数据读取出来。
同样,当写入数据时,控制电路也会根据地址找到相应的索引,然后将数据写入到存储单元对应的位置上。
NorFlash主要的特点有以下几点:1. 非易失性:NorFlash可以在没有电源的情况下保持数据的稳定存储状态。
这使得它可以作为主存储器之外的一个辅助存储器,用来存储即使在断电后也需要保留的重要数据,比如操作系统、BIOS等。
2. 读写速度较快:NorFlash的读取速度通常比其他存储器技术更快。
这使得它在需要频繁读取数据的应用中表现出色,比如系统启动时的固件加载等。
3. 高可靠性:NorFlash拥有较长的寿命,可以进行大量的擦写操作而不会影响数据的稳定性。
这使得它适用于需要频繁更新数据的应用场景,比如智能手机上的应用程序。
4. 低功耗:NorFlash的工作电压较低,功耗较小。
这使得它在移动设备中的应用更具吸引力,因为它可以延长电池的使用寿命。
5. 密集度高:NorFlash具有较高的存储密度,可以在相对较小的物理空间中存储大量的数据。
谈谈NORFlash
谈谈NORFlash背景NOR Flash在1988年首先由Intel开发出来,经过这么多年的发展,广泛应用于各种计算机、嵌入式产品中。
NOR和NAND是目前市场上两种主要的非易失性存储器。
NOR的特点是芯片内执行(XIP,eXecute In Place),所以程序可以直接在NOR中执行,无需先把代码读到系统RAM中去。
NOR的读取效率很高,并且由于他的XIP特性,所以常用与存储嵌入式产品的Bootloader等启动代码,但是NOR的写入和擦除速度很低。
结构和原理NOR和NAND都是使用包含源极、漏极和栅极的三端器件作为存储单元的,这种三端器件和场效应管的工作原理相似,利用电压控制源极和漏极之间的通断,栅极的电流消耗极小,不同的是场效应管为单栅极结构,而Flash为双栅极结构,在栅极和硅衬底之间还有一个浮置栅极。
浮置栅极由氮化物夹在两层二氧化硅材料之间构成,中间的氮化物是可以存储电荷的电荷势阱。
上下两层的氧化物的厚度大于50埃,可避免发生击穿。
向电荷势阱注入电荷的过程就是向存储单元写入数据的过程,写入数据的技术有两种:热电子注入和F-N隧道效应,前者是通过源极给浮栅充电(NOR使用这种方式给浮栅充电),后者是通过硅基层给浮栅充电(NAND使用这种方式给浮栅充电)。
值得注意的是,在写入新数据之前,必须先将原有的数据擦除,也就是先要将浮栅的电荷泄放,两种Flash都是通过F-N隧道效应放电。
向浮栅中注入电荷表示写入了数据“0”,没有注入电荷表示数据“1”,所以擦除Flash的数据是写数据“1”。
对于浮栅中有电荷的单元来说,由于浮栅的感应作用,在源极和漏极之间将形成带正电的空间电荷区,这时无论控制极上有没有施加偏置电压,晶体管都将处于导通状态。
而对于浮栅中没有电荷的晶体管来说,只有当控制极上施加有适当的偏置电压,在硅基层上感应出电荷,源极和漏极才能导通,也就是说在没有给控制极施加偏置电压时,晶体管是截止的。
nor flash program原理
nor flash program原理NORFlash芯片是一种非易失性存储器,它可以在电源正常的情况下保持数据,并且在掉电后数据也不会丢失。
NORFlash广泛应用于嵌入式系统中,用于存储操作系统、应用程序和配置信息等重要数据。
本文将介绍NORFlash的编程原理。
一、NORFlash存储单元NORFlash芯片的存储单元通常采用浮栅晶体管结构,其基本单元包括一个浮栅晶体管和一个电荷存储单元。
浮栅晶体管将电荷存储在存储单元中,从而控制数据的写入和擦除操作。
NORFlash芯片的存储单元具有较高的数据密度和较低的功耗,但擦除操作需要消耗较多的时间和能量。
二、NORFlash编程原理NORFlash的编程通常采用Flash编程标准协议,如IAP(In-ApplicationProgramming)协议或SFDP(Single-ByteFlashDataProtocol)。
在进行编程时,需要通过专门的编程设备(如编程器或主机控制器)将数据写入NORFlash芯片中。
NORFlash编程原理如下:1.初始化阶段:首先需要与NORFlash芯片建立通信连接,并进行初始化设置。
2.写入数据阶段:将需要写入的数据通过编程设备传输到NORFlash芯片中。
由于NORFlash芯片具有较高的读取速度和较低的功耗,因此适合进行数据写入操作。
3.擦除操作阶段:在进行数据写入之前,需要先对存储单元进行擦除操作。
擦除操作通常采用全块擦除方式,即将整个芯片或部分芯片进行擦除。
4.校验阶段:在完成数据写入和擦除操作后,需要进行校验和验证,以确保数据正确性。
NORFlash编程过程涉及到许多细节和注意事项,例如选择合适的编程协议、设置适当的擦除块大小、避免损坏芯片等。
在进行编程时,需要根据具体情况选择合适的工具和方法,并确保数据的准确性和完整性。
三、NORFlash编程步骤以下是一般的NORFlash编程步骤:1.连接NORFlash芯片与编程设备,并进行初始化设置。
nor flash工作原理
nor flash工作原理Nor Flash,即非易失性闪存,是一种常见的存储器设备,被广泛应用于数字产品和嵌入式系统中。
它的工作原理是通过电子擦除和编程的方式实现数据的存储和读取。
本文将深入探讨Nor Flash的工作原理及其应用。
一、Nor Flash的组成和结构Nor Flash由多个存储单元组成,每个存储单元由一个浮栅晶体管和一个选择晶体管组成。
浮栅晶体管用于存储数据,而选择晶体管则用于控制数据的读取和写入操作。
这些存储单元按照阵列的方式排列在晶片上,形成一个存储矩阵。
二、Nor Flash的工作原理1. 读取操作:当需要读取数据时,首先通过地址线选中特定的存储单元。
然后,选择晶体管将存储单元的电荷传递到位线上,并经过放大器放大,最终形成可读取的电压信号。
2. 编程操作:Nor Flash的编程操作是通过电子注入和散射实现的。
通过地址线选中特定的存储单元,并施加编程电压,即高电压。
这个高电压会使得浮栅晶体管中的电子被注入到栅极上,改变晶体管的导电特性,从而改变存储单元的电荷状态。
3. 擦除操作:Nor Flash的擦除操作是通过电子隧道效应实现的。
当需要擦除数据时,首先通过地址线选中特定的存储块,一个存储块通常由多个存储单元组成。
然后,施加一个较高的擦除电压,即高电压。
这个高电压会使得存储单元中的电荷通过隧道效应流出,从而擦除数据。
三、Nor Flash的应用领域1. 嵌入式系统:Nor Flash广泛应用于嵌入式系统中,如智能手机、平板电脑、车载导航、物联网设备等。
由于Nor Flash具有快速读取速度和较长的数据存储寿命,能够满足嵌入式系统对数据存储和快速读取的需求。
2. 数字产品:Nor Flash也被广泛应用于数字产品中,如数码相机、MP3播放器、游戏机等。
Nor Flash的可靠性和稳定性使得这些数字产品能够稳定地存储和读取大量的数据。
3. 软件存储:Nor Flash还常用于存储系统软件,如操作系统和引导程序。
SPI NOR FLASH存储器的原理与常见问题分析
SPI NOR FLASH存储器的原理与常见问题分析1.前言FLASH闪存,一般简称为“FLASH”,它属于内存器件的一种,是一种非易失性(Non-Volatile)内存。
FLASH因其特殊的浮栅结构得以在掉电后长久地保存数据,这使得Flash成为各类便携型数字设备的存储介质。
本文主要介绍了SPI NOR FLASH存储器的基本原理以及常见的问题,可以帮助读者进一步了解和应对产品中的FLASH相关问题。
2.SPI NOR FLASH存储器的原理介绍1.FLASH的基础介绍FLASH是使用浮栅场效应管(Floating Gate FET)作为基本存储单元来存储数据的,图一(a)的模型中可以看出,与普通的MOSFET相比,区别仅在于浮栅,FLASH就是利用浮栅中是否存储电荷来表征数字0和1的。
对NPN的场效应管来说,在栅极和源极之间加一个VTH电压后,MOS管就可以导通,但如果在图示的浮栅中增加了一些电子,这些电子抵消了VTH的部分电压,原先的VTH可能就无法使MOS管导通,通过判断MOS管是否导通可以判断浮栅当中有无电子,即可以对应状态0和1。
图一、FLASH基础单元原理而FLASH就是由如上的存储单元组成,通常的FLASH可以按单元结构分为NOR和NAND FLASH,其主要区别在于单独存储单元的排列上,如图二所示,NOR FLASH的每个CELL之间是并联的关系,其中漏极一同连接到位线(Bit line)上,栅极接到字线(Word line)上,而NAND FLASH的每个CELL之间是串联的关系,其中源极和漏极CELL之间互连,栅极接到字线上。
这部分是FLASH存储单元的结构区分。
图二、FLASH单元结构区分如果要对FLASH内部的数据进行操作,还需要控制器去控制擦除、编程、读取的电压,根据控制器与外部通信的总线,可以分为Parallel(CFI)和SPI两种类型。
并口的FLASH数据位宽大,可以满足大量数据快速读取的需求,但管脚多也反映着其占用面积大;SPI FLASH使用SPI总线通信,只需要4根线即可通信,较为便捷,适用于一些小型化的设备中。
NOR FLASH:大容量存储芯片的原理及应用解析
NOR FLASH:大容量存储芯片的原理及应用解析
VDRF256M16 是珠海欧比特公司自主研发的一种高速、大容量的NOR FLASH,可利用其对大容量数据进行高速缓存。
文中介绍了该芯片的结构和原理,并同时给出了一个系统中大容量、高速数据传输要求的设计方案。
1 引言
NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失。
NOR FLASH 支持Execute On Chip,即程序可以直接在FLASH 片内执行。
这点
和NAND FLASH 不一样。
因此,在嵌入是系统中,NOR FLAS H 很适合作
为启动程序的存储介质。
NOR FLAS H 的读取和RAM 很类似,但不可以直
接进行写操作。
对NOR FLAS H 的写操作需要遵循特定的命令序列,最终由芯片内部的控制单元完成写操作。
所以,NOR FLASH 一般是作为用于程序的存储与运行的工具。
NOR 的特点是芯片内执行(XIP,Execute In Place),这样应用程序可以直
接在FLASH 闪存内运行,不必再把代码读到系统RAM 中。
NOR FLASH 的
传输效率很高,在1~4MB 的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。
Nor Flash
NOR Flash简介NOR FLASH是INTEL在1988年推出的一款商业性闪存芯片,它需要很长的时间进行抹写,大半生它能够提供完整的寻址与数据总线,并允许随机存取存储器上的任何区域,而且它可以忍受一万次到一百万次抹写循环,是早期的可移除式闪存储媒体的基础.NOR Flash的原理从物理层面解释,NOR闸闪存的每个存储单元类似一个标准MOSFET,除了晶体管有两个而不是一个闸极.在顶部的是控制闸(CONTROL Gate,CG),它的徐阿奴阿布是土匪以氧化物层与周遭绝缘的浮闸(Floathing Gate,FG).由于这个FG在电气程度上是出于绝缘层独立的,所以湖边人员的毒啊班组会被困在里面,在一般的条件下,电荷经过很长时间都不会产生逃逸的情况.将FG放在CG与MOSFET通道之间.当FG 抓到电荷时,它部分屏蔽掉来自CG的电场,并改变这个单元的阀电压(VT).在读出期间.利用向CG的电压,MOSFET通道会变的导电或保持绝缘.这视乎该单元的VT而定(而该单元的VT受到FG上的电荷控制).这股电流流过MOSFET通道,并以二进制码的方式读出、再现存储的数据.在每单元存储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单元的动作却可以单一字节的方式进行.虽然抹写都需要高电压才能进行,不过实际上现今所有闪存芯片是借由芯片内的电荷帮浦产生足够的电压,所以只需要一个单一的电压供应即可.NOR Flash的访问方式在NOR FLASH的读取数据的方式来看,它与RAM的方式是相近的,只要能够提供数据的地址,数据总线就能够正确的挥出数据.考虑到以上的种种原因,多数微处理器将NOR FLASH当做原地运行(Execute in place,XIP)存储器使用,这其实以为着存储在NOR FLASH上的程序不需要复制到RAM就可以直接运行.由于NOR FLASH没有本地坏区管理,所以一旦存储区块发生毁损,软件或驱动程序必须接手这个问题,否则可能会导致设备发生异常. 在解锁、抹除或写入NOR FLASH区块时,特殊的指令会先写入已绘测的记忆区的第一页(Page).接着快闪记忆芯片会提供可用的指令清单给实体驱动程序,而这些指令是由一般性闪存接口(Common FLASH memory Interface, CFI)所界定的. 与用于随机存取的ROM不同,NOR FLASH也可以用在存储设备上;不过与NAND FLASH相比,NOR FLASH的写入速度一般来说会慢很多.NOR Flash 和NAND Flash由1988年INTEL公司首先开发出NOR FLASH技术,彻底颠覆了原先EPROM和EEPROM一统天下的局面;紧接1989年东芝公司发表了NAND FLASH结构,强调以成本为主,降低每bit的成本,具有更高的性能,并且能像硬盘一样可以通过接口轻松升级.NOR FLASH和NAND FLASH是目前市面上两种主要的非易失闪存技术.NOR FLASH的特点是芯片内执行(XIP ,eXecute In Place),这样应用程序可以直接在FLASH闪存内运行,不必再把代码读到系统RAM中.NOR 的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响到它的性能.NAND的结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快.应用NAND的困难在于FLASH的管理和需要特殊的系统接口.通常NOR的速度比NAND稍快一些,而NAND的写入速度比NOR快很多,在设计中应该考虑这些情况.NOR Flash与NAND Flash的比较虽然NOR和NAND两种技术在现在的市场上都占有主流的地位,而且经过十几年的历史,但是现在仍然有相当多的硬件工程师分布清楚NOR和NAND闪存.相"FLASH存储器"经常可以与相"NOR存储器"互换使用.许多业内人士也搞不清楚NAND闪存技术相对于NOR技术的优越之处,因为大多数情况下闪存只是用来存储少量的代码,这时NOR闪存更适合一些.而NAND则是高数据存储密度的理想解决方案.NOR的特点是芯片内执行(XIP, eXecute In Place),这样应用程序可以直接在FLASH闪存内运行,不必再把代码读到系统RAM中.NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能.NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快.应用NAND的困难在于FLASH的管理和需要特殊的系统接口.性能比较FLASH闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程.任何FLASH器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除.NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0.由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms.执行擦除时块尺寸的不同进一步拉大了NOR和NADN之间的性能差距,统计表明,对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行.这样,当选择存储解决方案时,设计师必须权衡以下的各项因素.l NOR的读速度比NAND稍快一些.2 NAND的写入速度比NOR快很多.3 NAND的4ms擦除速度远比NOR的5s快.4 大多数写入操作需要先进行擦除操作.5 NAND的擦除单元更小,相应的擦除电路更少.接口差别NOR FLASH带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节.NAND器件使用复杂的I/O口来串行地存取数据,各个产品或厂商的方法可能各不相同.8个引脚用来传送控制、地址和数据信息.NAND读和写操作采用512字节的块,这一点有点像硬盘管理此类操作,很自然地,基于NAND的存储器就可以取代硬盘或其他块设备.容量和成本NAND FLASH的单元尺寸几乎是NOR器件的一半,由于生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格.NOR FLASH占据了容量为1~16MB闪存市场的大部分,而NAND FLASH只是用在8~128MB的产品当中,这也说明NOR主要应用在代码存储介质中,NAND适合于数据存储,NAND在Compact FLASH、Secure Digital、PC Cards和MMC存储卡市场上所占份额最大.可靠性和耐用性采用flahs介质时一个需要重点考虑的问题是可靠性.对于需要扩展MTBF的系统来说,FLASH是非常合适的存储方案.可以从寿命(耐用性)、位交换和坏块处理三个方面来比较NOR和NAND的可靠性.寿命(耐用性)在NAND闪存中每个块的最大擦写次数是一百万次,而NOR的擦写次数是十万次.NAND存储器除了具有10比1的块擦除周期优势,典型的NAND块尺寸要比NOR器件小8倍,每个NAND存储器块在给定的时间内的删除次数要少一些.NOR Flash的烧写方式相对于硬件工程师和嵌入式软件工程师一般在完成设计之后常常需要验证FLASH是否在工作.在应用当中,也有很多时候需要对FLASH进行写操作.该文章简单介绍了基于ARM芯片的NOR FLASH烧写,并提供了2个具体的实例和源代码,希望对有需要的朋友有点帮助.在开始之前,先声明一下,这篇文章只是介绍了如何写 NOR FLASH的烧写驱动,和H-JTAG/H-FLASH ER没有直接的联系.在后面的介绍里,如无特别说明,处理器指的是 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很类似,但不可以直接进行写操作.对NOR 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,地址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,每个SECTOR包括一定数量的存储单元.对有些大容量的FLASH,还分为不同的BANK,每个BANK包括一定数目的SECTOR.FLASH的擦除操作一般都是以SECTOR,BANK或是整片FLASH为单位的.在对FLASH进行写操作的时候,每个BIT可以通过编程由1变为0,但不可以有0修改为1.为了保证写操作的正确性,在执行写操作前,都要执行擦除操作.擦除操作会把FLASH的一个SECTOR,一个BANK或是整片FLASH的值全修改为0xFF.这样,写操作就可以正确完成了.2. ARM 处理器的寻址ARM 可以说是目前最流行的32位嵌入式处理器.在这里只提一下 ARM 处理器的寻址,为后面做个铺垫.从处理器的角度来看,系统中每个地址对应的是一个BYTE的数据单元.这和很多别的处理器都是一样的.3. 处理器和 NOR FLASH的硬件连接从前面的介绍,我们知道从处理器的角度来看,每个地址对应的是一个 BYTE 的数据单元.而,NOR FLASH的每个地址有可能对应的是一个BYTE的数据单元,也有可能对应的是一个HALF-WORD的数据单元.所以在硬件设计中,连接ARM处理器和 NOR FLASH时,必须根据实际情况对地址信号做特别的处理.如果ARM处理器外部扩展的是8-BIT的NOR FLASH, 数据线和地址线的连接应该如图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的 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) .这样,处理器才知道在访问的时候如何从FLASH正确的读取数据.2. 有些ARM处理器内部可以设置地址的错位.对于支持软件选择地址错位的处理器,在连接16-BIT FLASH的时候,硬件上可以不需要把地址线错位.读者设计的时候,请参考MCU的数据手册,以手册为准,以免造成不必要的麻烦.3. 如果处理器支持内部设置地址错位,在实际访问的时候,送出的地址实际上是在MCU内部做了错位处理,其作用是等效于硬件连接上的错位的.上面的描述可能比较抽象,下面让我们来看2个 ARM处理器访问16-BIT FLASH的例子:例子 1:ARM处理器需要从地址 0x0 读取一个 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-BIT 数据单元输出到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 处理器的每个地址对应的是一个 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烧写驱动实例 - 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的起始地址#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 –将 0x55 写到FLASH地址 0x2AAA3 –将 0x80 写到FLASH地址 0x55554 –将 0xAA写到FLASH地址 0x55555 –将 0x55 写到FLASH地址 0x2AAA6 –将 0x10 写到FLASH地址 0x5555对应的代码:*SysAddr8(sysbase, 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*SysAddr8(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; //将值 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) = 0x30; //将值 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 写到FLASH地址 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的操作理解起来要晦涩很多.我尽力描述得清楚些.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; //该变量用来表示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的指针,其最终地址为(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个HALF-WORD 中去,可以用下面的代码:*SysAddr16(0x10000000, 0x0) = 0xABCD;*SysAddr16(0x10000000, 0x1) = 0xABCD;接下来,我们分别从ARM处理器的角度和FLASH的角度来具体分析一下.从 ARM 的角度来看:假设FLASH的起始地址为 0x10000000,因为 ARM 处理器知道FLASH的地址空间为 0x10000000 ~ (0x10000000 +FLASH容量– 1),所以在对这个地址空间进行访问的时候,会设置好FLASH的片选信号,并将低位的地址输出到地址信号上.以*SysAddr16(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 FLASH的地址信号的连接是错开一位的, 所以, 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起始地址,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上看到的地址.整片擦除操作整片擦除操作共需要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) = 0x00AA; //将值 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) = 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写到FLASH 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; //将值 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 是从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来看SECTOR-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-WORD 编程操作写一个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, 0x2AAA) = 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表示的是相对于FLASH起始地址的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(sysbase, 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 版源代码下载如果用户有需要,可以去下载在前面讨论的 2 个实例的 ADS 版的完整源代码和FLASH数据手册.提供给用户的程序都是在实际使用过程中经过测试的.源代码只供用户参考,并不一定能直接使用在用户的开发板上.用户需要根据自己实际使用的芯片进行相应的修改.源代码下载链接:/forum/forumdisplay.php?fid=38. 结束语这篇文章简单介绍了如何对NOR FLASH进行操作, 但没有包括状态查询, 保护等其他操作. 对于更复杂的多片FLASH并联的情况也没有讨论.有需要的朋友可以自己去研究.Nor Flash 在实际应用中的读取方式本实验是基于TQ2440的实验平台,采用S3C2440(ARM9)的CPU,以ADS/MDK的开发环境,使用的是AM29LV160DB的NOR FLASH,进行开发学习的一个NOR FLASH的编写和读取.(1) Nor FLASH工作模式Nor FLASH上电后处于数据读取状态(Reading Array Data).此状态可以进行正常的读.这和读取SDRAM/SRAM/ROM一样.(要是不一样的话,芯片上电后如何从Nor FLASH中读取启动代码.~)一般再对FLASH进行操作前都要读取芯片信息比如设备ID号.这样做的主要目的是为了判断自己写的程序是否支持该设备. Nor FLASH支持2种方式获取ID号.一种是编程器所用的方法需要高电压(11.5V-12.5V).另一种方法就是所谓的in-system方法,就是在系统中通过Nor FLASH的命令寄存器来完成.本文中只对in-system方法进行说明.此时需要切换到自动选择(Autoselect Command),这要通过发送命令来完成.命令类型见下图.注意:进入自动选择(Autoselect Command)模式后需要发送复位命令才能回到数据读取状态(Reading Array Data).在完成信息获取后一般就要擦除数据. Nor FLASH支持扇区擦(Sector Erase)除和整片擦除(Chip Erase).这2种模式都有对应的命令序列.在完成擦除命令后会自动返回到数据读取(Reading Array Data)状态.在返回前可查询编程的状态.完成擦除后就需要对芯片进行写入操作也就是编程.这就需要进入编程(Program)状态.在完成编程命令后会自动返回到数据读取(Reading Array Data)状态.在返回前可查询编程的状态.注意:编程前一定要先擦除.因为编程只能将'1'改写为'0',通过擦写可以将数据全部擦写为'1'.以上是主要的操作其他操作还有写保护等,请参考芯片数据手册.。
NOR Flash读写原理及驱动
NOR Flash擦写和原理分析1. NOR FLASH 的简单介绍NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行(这意味着存储在NOR FLASH上的程序不需要复制到RAM就可以直接运行).这点和NAND FLASH不一样.因此,在嵌入式系统中,NOR FLASH很适合作为启动程序的存储介质.NOR FLASH的读取和RAM很类似(只要能够提供数据的地址,数据总线就能够正确的给出数据),但不可以直接进行写操作.对NOR 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,地址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-WORDFLASH一般都分为很多个SECTOR,每个SECTOR包括一定数量的存储单元.对有些大容量的FLASH,还分为不同的BANK,每个BANK包括一定数目的SECTOR.FLASH的擦除操作一般都是以SECTOR,BANK 或是整片FLASH为单位的.在对FLASH进行写操作的时候,每个BIT可以通过编程由1变为0,但不可以有0修改为1.为了保证写操作的正确性,在执行写操作前,都要执行擦除操作.擦除操作会把FLASH的一个SECTOR,一个BANK或是整片FLASH的值全修改为0xFF.这样,写操作就可以正确完成了.由于NOR FLASH没有本地坏区管理,所以一旦存储区块发生毁损,软件或驱动程序必须接手这个问题,否则可能会导致设备发生异常. 在解锁、抹除或写入NOR FLASH区块时,特殊的指令会先写入已绘测的记忆区的第一页(Page).接着快闪记忆芯片会提供可用的指令清单给实体驱动程序,而这些指令是由一般性闪存接口(CommON FLASH memory Interface, CFI)所界定的. 与用于随机存取的ROM不同,NOR FLASH 也可以用在存储设备上;不过与NAND FLASH相比,NOR FLASH的写入速度一般来说会慢很多.2. NOR Flash的烧写方式以下内容,如无特别说明,处理器指的是ARM 处理器,FLASH 指的都是NOR FLASH.另外,BYTE指的是8-BIT的数据单元,HALF-WORD代表的是16-BIT的数据单元,而WORD 则代表了32-BIT的数据单元.2.1 处理器寻址ARM 可以说是目前最流行的32位嵌进式处理器.在这里只提一下ARM处理器的寻址,为后面做个展垫.从处理器的角度来看,系统中每个地址对应的是一个BYTE的数据单元.这和很多别的处理器都是一样的. 2.2 处理器和NOR FLASH的硬件连接从前面的先容,我们知道从处理器的角度来看,每个地址对应的是一个BYTE 的数据单元.而,NOR FLASH 的每个地址有可能对应的是一个BYTE的数据单元,也有可能对应的是一个HALF-WORD的数据单元.所以在硬件设计中,连接ARM处理器和NOR FLASH时,必须根据实际情况对地址信号做特别的处理.假如ARM处理器外部扩展的是8-BIT的NOR FLASH, 数据线和地址线的连接应该如图1所示. 从图中我们可以看到,处理器的数据信号D0-D7和FLASH的数据信号D0-D7是逐一对应连接的,处理器的地址信号A0-An和NOR FLASH的地址信号A0-An 也是逐一对应连接的.假如ARM处理器外部扩展的是16-BIT的NOR FLASH, 地址线必须要错位连接. 图2给了一个ARM处理器和16-BIT NOR FLASH的连接示意图.如图2所示,ARM处理器的数据信号D0-D15和FLASH 的数据信号D0-D15是逐一对应的.而ARM处理器的地址信号和NOR FLASH 的地址信号是错位连接的,ARM的A0悬空,ARM 的A1 连接FLASH 的A0,ARM 的A2连接FLASH的A1,依次类推.需要错位连接的原因是:ARM处理器的每个地址对应的是一个BYTE 的数据单元,而16-BIT 的FLASH 的每个地址对应的是一个HALF-WORD(16-BIT)的数据单元.为了保持匹配,所以必须错位连接.这样,从ARM处理器发送出来的地址信号的最低位A0对16-BIT FLASH来说就被屏蔽掉了.补充说明:∙一般来说,ARM处理器内部要设置相应的寄存器,告诉处理器外部扩展的FLASH的位宽(8-BIT/16-BIT/32-BIT) .这样,处理器才知道在访问的时候如何从FLASH正确的读取数据;∙有些ARM处理器内部可以设置地址的错位.对于支持软件选择地址错位的处理器,在连接16-BIT FLASH 的时候,硬件上可以不需要把地址线错位.读者设计的时候,请参考MCU的数据手册,以手册为准,以免造成不必要的麻烦;∙假如处理器支持内部设置地址错位,在实际访问的时候,送出的地址实际上是在MCU内部做了错位处理,其作用是等效于硬件连接上的错位的.上面的描述可能比较抽象,下面让我们来看2个ARM处理器访问16-BIT FLASH的例子:例子1:ARM处理器需要从地址0x0读取一个BYTEa.ARM处理器在地址线An-A0上送出信号0x0;b.16-BIT FLASH在自己的地址信号An-A0上看到的地址是0x0,然后将地址0x0对应的16-BIT数据单元输出到D15-D0上;c.ARM处理器知道访问的是16-BIT的FLASH,从D7-D0上读取所需要的一个BYTE的数据.例子2:ARM处理器需要从地址0x1读取一个BYTEa.ARM处理器在地址线An-A0上送出信号0x1;b.16-BIT FLASH在自己的地址信号An-A0上看到的地址依然是0x0, 然后将地址0x0对应的16-BIT数据单元输出到D15-D0上;c.ARM处理器知道访问的是16-BIT的FLASH,从D15-D8 上读取所需要的一个BYTE 的数据.2.3 从软件角度来看ARM 处理器和NOR FLASH 的连接从软件的角度来理解ARM处理器和FLASH的连接.对于8-BIT的FLASH的连接,很好理解,由于ARM处理器和8-BIT FLASH的每个地址对应的都是一个BYTE 的数据单元.所以地址连接毫无疑问是逐一对应的.假如ARM 处理器连接的是16-BIT 的处理器,由于ARM 处理器的每个地址对应的是一个BYTE的数据单元,而16-BIT FLASH 的每个地址对应的是一个HALF-WORD 的16-BIT的数据单元.所以,也毫无疑问,ARM处理器访问16-BIT处理器的时候,地址肯定是要错开一位的.在写FLASH驱动的时候,我们不需要知道地址错位是由硬件实现的,还是是通过设置ARM处理器内部的寄存器来实现的,只需要记住2点:a.ARM处理器访问8-BIT FLASH的时候,地址是逐一对应的;b.ARM处理器访问16-BIT FLASH的时候,地址肯定是错位的.2.4 8-BIT 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; //该变量用来表示 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上看到的地址.a. 整片擦除操作整片擦除操纵共需要6个周期的总线写操作:i.将0xAA写到FLASH 地址0x5555;ii.将0x55 写到FLASH 地址0x2AAA;iii.将0x80 写到FLASH 地址0x5555;iv.将0xAA写到FLASH 地址0x5555;v.将0x55 写到FLASH 地址0x2AAA;vi.将0x10 写到FLASH 地址0x5555.对应的代码:*SysAddr8(sysbase, 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*SysAddr8(sysbase, 0x5555) = 0x10; //将值 0x10 写到 FLASH 地址 0x5555b. SECTOR擦除操作SECTOR的擦除操纵共需要6个周期的总线写操作:i.将0xAA写到FLASH 地址0x5555;ii.将0x55 写到FLASH 地址0x2AAA;iii.将0x80 写到FLASH 地址0x5555;iv.将0xAA写到FLASH 地址0x5555;v.将0x55 写到FLASH 地址0x2AAA;vi.将0x30 写到要擦除的SECTOR 对应的地址.对应的代码:*SysAddr8(sysbase, 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*SysAddr8(sysbase, addr) = 0x30; //将值 0x30 写到要擦除的 SECTOR 对应的地址c. BYTE擦除操作写一个BYTE 的数据到FLASH中往,需要4个周期的总线写操作:i.将0xAA写到FLASH 地址0x5555;ii.将0x55 写到FLASH 地址0x2AAA;iii.将0xA0 写到FLASH 地址0x5555;iv.将编程数据(BYTE)写到对应的编程地址上.对应的代码:*SysAddr8(sysbase, 0x5555) = 0xAA; //将值 0xAA写到 FLASH 地址 0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55; //将值 0x55 写到 FLASH 地址 0x2AAA*SysAddr8(sysbase, 0x5555) = 0xA0; //将值 0xA0 写到 FLASH 地址 0x5555*SysAddr8(sysbase, addr) = data; //将一个 BYTE的数据写到期看的地址2.5 16-BIT FLASH 烧写驱动实例- SST39VF160SST39VF160是SST公司的一款16-BIT的NOR FLASH. 在这个小节里, 我们以SST39VF160为例子, 讲述如何对16-BIT NOR FLASH进行操作.对8-BIT FLASH的操作很好理解,但对16-BIT FLASH 的操作理解起来要晦涩很多.我尽力描述得清楚些.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; //该变量用来表示 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的指针,其终极地址为(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个HALF-WORD 中往,可以用下面的代码:*SysAddr16(0x10000000, 0x0) = 0xABCD;*SysAddr16(0x10000000, 0x1) = 0xABCD;接下来,我们分别从ARM处理器的角度和FLASH的角度来具体分析一下.从ARM 的角度来看:假设FLASH 的起始地址为0x10000000,由于ARM 处理器知道FLASH 的地址空间为0x10000000 ~ (0x10000000 +FLASH容量–1),所以在对这个地址空间进行访问的时候,会设置好FLASH的片选信号,并将低位的地址输出到地址信号上.以*SysAddr16(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 FLASH的地址信号的连接是错开一位的, 所以, 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 起始地址,offset 则代表了FLASH 的第几个HALF-WORD(HALF-WORD 偏移量或偏移地址)注意:a.在本节后面的描述中,SysAddr16中的SYSBASE代表的是FLASH的起始地址,而SysAddr16中的OFFSET则代表了相对于FLASH起始地址的HALF-WORD 偏移量或偏移地址.OFFSET 的值也是16-BIT FLASH在自己的地址信号An-A0上看到的值;b.在SST39VF160的命令定义中,所有的地址都是针对FLASH的HALF-WORD地址,指的是在FLASH自己的地址信号An-A0上看到的地址.整片擦除操作整片擦除操纵共需要6个周期的总线写操作:a.将0x00AA写到FLASH HALF-WORD 地址0x5555;b.将0x0055 写到FLASH HALF-WORD地址0x2AAA;c.将0x0080 写到FLASH HALF-WORD地址0x5555;d.将0x00AA写到FLASH HALF-WORD 地址0x5555;e.将0x0055 写到FLASH HALF-WORD地址0x2AAA;f.将0x0010 写到FLASH HALF-WORD地址0x5555.对应的代码:*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值 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) = 0x0055; //将值 0x0055 写到 FLASH HALF-WORD地址0x2AAA*SysAddr16(sysbase, 0x5555) = 0x0010; //将值 0x0010 写到 FLASH HALF-WORD地址0x5555SECTOR擦除操作SECTOR的擦除操纵共需要6个周期的总线写操作:a.将0x00AA写到FLASH HALF-WORD 地址0x5555;b.将0x0055 写到FLASH HALF-WORD地址0x2AAA;c.将0x0080 写到FLASH HALF-WORD地址0x5555;d.将0x00AA写到FLASH HALF-WORD 地址0x5555;e.将0x0055 写到FLASH HALF-WORD地址0x2AAA;f.将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; //将值 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 是从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来看SECTOR-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-WORD 编程操作写一个HALF-WORD的数据到FLASH中往,需要4个周期的总线写操作:a.将0x00AA写到FLASH HALF-WORD 地址0x5555;b.将0x0055 写到FLASH HALF-WORD地址0x2AAA;c.将0x00A0 写到FLASH HALF-WORD 地址0x5555;d.将编程数据(HALF-WORD)写到对应的HALF-WORD地址.对应的代码:*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值 0x00AA 写到 FLASH 地址 0x5555 *SysAddr16(sysbase, 0x2AAA) = 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表示的是相对于FLASH起始地址的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(sysbase, 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;2.6 结束语以上简单介绍了NOR FLASH原理,以及如何对NOR FLASH进行操作, 但没有包括状态查询, 保护等其他操纵. 对于更复杂的多片FLASH并联的情况也没有讨论,如有需要者,可自行分析.。
NORFlash的原理与操作
NORFlash的原理与操作1、了解nor flash存储芯⽚的概念和特性2、掌握使⽤s3c2440芯⽚对外挂的nor flash进⾏读写擦除操作1、NOR Flash的简单介绍NOR Flash最早是由Intel公司于1988年开发出的,是现在市场上两种主要的⾮易失性存储器之⼀,它的出现彻底改变了存储器市场上由EPROM(Erasable Programmable Read-Only-Memory电可编程序只读存储器)和EEPROM(电可擦只读存储器Electrically Erasable Programmable Read - Only Memory)⼀统天下的局⾯。
NOR Flash最⼤特点是⽀持XIP(Execute On Chip),既程序可以直接在NOR flash 的⽚内执⾏,在NOR Flash中的代码运⾏时不需要重定位复制到RAM内。
NOR Flash的地址线和数据线分开,数据的读取和RAM很类似,只要能够提供数据地址,数据总线就能正确给出数据。
不过不能直接对它进⾏写操作,执⾏写操作之前需要先发送固定的命令序列,然后发送写操作的地址和数据。
NOR Flash存储器的最⼩访问单元⼀般分为8位和16位的,也有⼀些NOR Flash器件同时⽀持8位和16位模式,这种Flash的位宽可以在设计硬件时选择,当芯⽚的BYTE#引脚接为⾼电平,芯⽚⼯作在位宽16位模式,BYTE#引脚设为低电平时,芯⽚⼯作在位宽8位模式。
NOR Flash⼀般有多个扇区,扇区是NOR Flash擦除的最⼩单位,Nor Flash中每个扇区的⼤⼩也不是固定的,扇区的排放⼀般分为两种模式Top Boot part 和Bottom Boot part 。
这两种形式的区别是⼩块的扇区在NOR Flash芯⽚中放置的位置不同,Bottom Boot类型的NOR Flash⼩块地址位于芯⽚0地址,⽽Top Boot part类型的NOR Flash⼩块地址位于芯⽚的⾼地址上。
norflash原理
norflash原理Norflash是一种非易失性存储器器件,其名称源于其逻辑结构,每个存储单元都连接到输出端,输出端是 NOR 电路。
Norflash广泛应用于移动设备、数字相机、嵌入式系统、网络设备和智能控制等应用领域,具有高速读取、写入保护和长寿命等特点。
Norflash的工作原理是通过 MOS 电路进行数据的存储和读取。
它是一种电子存储器,可以将存储单元的信息以电场的方式存储下来,因为这种存储方式不需要维持持续的电流输入,所以它也是非易失性的,可以长时间保存数据。
Norflash存储单元可以通过电路的地址线和选择线进行寻址,通过输入读取/写入信号来读取或写入数据。
Norflash存储器的工作过程中,需要将输入数据编码放入逻辑单元内,其内部电路自动选择所需的存储位置,将数据存储在该位置。
在读取数据时,存储单元读取器通过地址信号访问存储器,并将数据从存储器加载到输出缓存区。
输出缓存区的数据随后通过输出端口提供给系统。
Norflash的存储单元是由一对 P 型和 N 型 MOS 电晶体组成的,它们组成了一个双稳态电路。
每当输入脉冲高电平时,电容器会被充电,并激活 N 型 MOS 电晶体,将电荷存储在存储单元中。
电荷储存在介质中,它们可以长时间保持在 P 型和 N 型 MOS 电晶体之间,即使在不供电的情况下也可以保持。
当输入脉冲低电平时,这些电荷会被释放,存储单元将被清空,保留的数据将消失。
Norflash具有一些独特的特点,如速度快,适用于大容量存储,存储周期长。
但是,Norflash存储器成本高,存储密度较低,并且不适用于低功耗应用。
此外,Norflash存储器的Erase操作比较慢,这在某些应用中可能是不太适合的。
总之,Norflash通过 MOS 电路实现了数据的存储和读取,是一种高效、可靠的存储器,被广泛应用于各种设备和应用领域。
随着技术的进步和需求的变化,Norflash存储器的设计和实现也在不断优化和更新。
nor flash和nand flash的原理
nor flash和nand flash的原理
Nor Flash和Nand Flash是两种不同的闪存存储器技术,具有
不同的工作原理。
1. Nor Flash原理:
Nor Flash是一种非易失性存储器技术,采用了行列式的存储
结构。
它由一组相互连接的存储单元组成,每个存储单元可以存储一个位信息(0或1)。
每个存储单元有自己的地址,通
过提供正确的地址和时钟信号,可以从Nor Flash中读取数据。
Nor Flash的读取操作是以字节为单位进行的,因此可以快速
地访问任何存储位置。
另外,Nor Flash还支持随机访问,即
可以直接按地址读取任何存储单元的数据。
2. Nand Flash原理:
Nand Flash也是一种非易失性存储器技术,采用了串行式的存
储结构。
它由一组相互连接的存储单元组成,每个存储单元可以存储多个位信息。
Nand Flash的读取操作是以块为单位进行的,需要按照顺序从存储块的开头读取数据。
Nand Flash没有
提供直接随机访问的功能,需要通过读取整块数据,并在内部进行解码和处理才能获取所需的数据。
Nor Flash和Nand Flash在存储密度、读写速度、擦除操作等
方面有着不同的优势和局限性。
Nor Flash适用于在系统中需
要频繁读取数据的应用场景,如代码执行、系统启动等;而Nand Flash适用于需要较大存储容量和较低成本的应用场景,
如音视频存储、移动设备存储等。
nor flash读工作原理
nor flash读工作原理Nor flash是一种非常常见的闪存类型,它的读工作原理是怎样的呢?首先,我们需要了解一下nor flash的基本结构。
Nor flash的基本结构包括了地址线、数据线、控制线和芯片内部的存储单元。
其中,地址线用于指定要读取的存储单元,数据线用于传输读取到的数据,控制线则用于控制芯片的读取操作。
在nor flash的读取操作中,首先需要将要读取的地址发送到芯片内部。
这个过程需要通过地址线来完成。
一旦芯片接收到了地址信号,它就会根据地址信号来确定要读取的存储单元,并将其内部的存储数据通过数据线发送到外部。
在这个过程中,控制线也发挥了非常重要的作用。
控制线可以控制芯片的读取操作是否完成,从而确保读取到正确的数据。
如果控制线没有正确地控制读操作的完成,那么可能会导致读取到错误的数据,从而影响系统的正常运行。
需要注意的是,nor flash的读取速度通常比较慢,这可能会影响到系统的性能。
为了解决这个问题,有时候我们需要使用一些特殊的技术来提高nor flash的读取速度,比如使用缓存技术来缓存读取的数据,或者使用预读技术来在读取操作之前就预先读取一些数据,从而加速读取操作。
除了读取操作之外,nor flash还有许多其他的操作模式,比如擦除操作、编程操作等等。
这些操作都需要通过不同的控制信号来完成,从而实现对芯片内部存储单元的修改和擦除。
nor flash的读取工作原理是非常简单的,只需要通过地址线和数据线来进行数据传输,同时通过控制线来控制读取操作的完成即可。
但是,在实际应用中,我们还需要考虑到其他因素,比如读取速度、操作模式等等,从而确保nor flash的正常运行。
norflash原理
norflash原理NorFlash又称为归档式闪存,是一种非易失性存储器,常用于嵌入式应用中作为程序和数据的存储介质。
NorFlash的工作原理是通过电子存储单元中的栅电荷来存储数据。
下面将对NorFlash的原理进行详细介绍。
NorFlash的结构由一个晶片分为多行多列的数组组成,每行每列交叉形成一个存储单元。
存储单元由一个MOSFET晶体管和浮动栅结构组成。
MOSFET的源极连接到接地,漏极连到位于晶片边缘的源排极。
在存储单元的栅极上有存储栅电荷,用来表示存储值0或1NorFlash的读取过程类似于传统的ROM芯片,通过将输入地址信号和控制信号,送到适当的线路和逻辑电路中,从而确定读取的存储单元位置和读取值。
当读取一个特定的存储单元时,地址线上的信号被转换成列选择信号CS(Chip Select),将该存储单元与输出数据线连接。
同时,通过控制信号,将对应的行电路选中并放电,以确保选中行上的浮动栅电荷被感应出来,并预充值输出线,以保持电压的稳定。
这样就可通过读取输出线上的电压电平,获得存储单元的存储值。
NorFlash的写入操作较为复杂。
首先,需要将存储单元选中,并添加合适的控制信号。
然后,通过电源电压的施加,使得三极区域发生击穿,并形成电流通道。
之后,通过施加负电压的电流通道,驱使浮动门上的电子通过隧道注入到晶体管栅介质中,从而改变存储单元的电荷状态。
最后,通过施加正电压,将电流通道断开,以停止写入操作。
NorFlash的特点是存取速度快、写入、擦除次数多以及可靠性高。
它的存储单元通过浮动栅电荷来实现存储定值,所以能够长期保存数据。
此外,NorFlash还具有无需搬迁数据就能进行擦除、编程的特性,使得它非常适用于嵌入式应用中对存储器速度、体积和功耗有特殊需求的不同场景。
尤其是在那些需要频繁运行程序和访问大量数据的应用中,如智能手机、数码相机、汽车导航系统等。
NorFlash的缺点是在制造工艺上难度较大,容易发生闪存缺陷。
什么是nor flash方式打开电源 浅谈nor flash原理及应用
什么是nor flash方式打开电源浅谈nor flash原理及应用本文主要是关于nor flash的相关介绍,并着重对nor flash打开电源方式及原理应用进行了详尽的阐述。
nor flashnor flash是现在市场上两种主要的非易失闪存技术之一。
Intel于1988年首先开发出NOR Flash 技术,彻底改变了原先由EPROM(Erasable Programmable Read-Only-Memory 电可编程序只读存储器)和EEPROM(电可擦只读存储器Electrically Erasable Programmable Read - Only Memory)一统天下的局面。
紧接着,1989年,东芝公司发表了NAND Flash 结构,强调降低每比特的成本,有更高的性能,并且像磁盘一样可以通过接口轻松升级。
NOR Flash 的特点是芯片内执行(XIP ,eXecute In Place),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中。
NOR 的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响到它的性能。
NAND的结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。
应用NAND 的困难在于Flash的管理需要特殊的系统接口。
通常读取NOR的速度比NAND稍快一些,而NAND的写入速度比NOR快很多,在设计中应该考虑这些情况。
flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。
任何flash 器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。
NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。
由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。
如何自动识别是NOR flash 浅谈NOR flash工作原理
如何自动识别是NOR flash 浅谈NOR flash工作原理本文主要是关于NOR flash的相关介绍,并着重对NOR flash的识别及其工作原理进行了详尽的阐述。
NOR flash工作原理Nor Flash 具有像内存一样的接口,它可以像内存一样读,却不可以像内存一样写,Nor Flash 的写、擦除都需要发出特定的命令。
谈到Nor Flash 通常就会涉及到CFI ([Common Flash Interface)接口,一般Nor Flash 都支持发命令来读取厂家ID 和设备ID 等基本信息,但并不是所有的NorFlash 都支持发命令来获取和芯片本身容量大小、扇区数、擦除块大小等信息。
为了让将来的Nor Flash 兼容性更好,引进了CFI 接口,将芯片有关的信息都写入芯片内部,通过CFI 命令就可以获取这些信息。
Linux 内核中对各种型号的Nor Flash 都有很好的支持,但是其组织复杂,不利于分析。
这里选用u-boot 里面的Nor Flash 代码来分析。
代码位于:u-boot-2010.06/board/samsung/smdk2410/flash.c 。
通常内核里面要识别一个Nor Flash 有两种方法:一种是jedec 探测,就是在内核里面事先定义一个数组,该数组里面放有不同厂家各个芯片的一些参数,探测的时候将flash 的ID 和数组里面的ID 一一比较,如果发现相同的,就使用该数组的参数。
另一种是cfi 探测,就是直接发各种命令来读取芯片的信息,比如ID、容量等。
jedec 探测的优点就是简单,缺点是如果内核要支持的flash 种类很多,这个数组就会很庞大。
/samsung/smdk2410/flash.c 文件采用的是第一种方法,但是还是有些区别的,内核里面用jedec 探测一个芯片时,是先通过发命令来获取flash 的ID,然后和数组比较,但是flash.c 中连ID 都是自己通过宏配置的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浅谈NorFlash的原理及其应用
NOR Flash NOR Flash是现在市场上两种主要的非易失闪存技术之一。
Intel 于1988年首先开发出NOR Flash 技术,彻底改变了原先由EPROM(Erasable Programmable Read-Only-Memory电可编程序只读存储器)和EEPROM(电可擦只读存储器Electrically Erasable Programmable Read - Only Memory)一统天下的局面。
紧接着,1989年,东芝公司发表了NAND Flash 结构,强调降低每比特的成本,有更高的性能,并且像磁盘一样可以通过接口轻松升级。
NOR Flash 的特点是芯片内执行(XIP ,eXecute In Place),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中。
NOR 的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响到它的性能。
NAND的结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。
应用NAND的困难在于Flash的管理需要特殊的系统接口。
性能比较 flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。
任何flash 器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。
NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。
由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。
执行擦除时块尺寸的不同进一步拉大了NOR和NAND之间的性能差距,统计表明,对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行。
这样,当选择存储解决方案时,设计师必须权衡以下的各项因素。
l 、NOR的读速度比NAND稍快一些。
2、NAND的写入速度比NOR快很多。
3 、NAND的4ms擦除速度远比NOR的5s快。
4 、大多数写入操作需要先进行擦除操作。
5 、NAND的擦除单元更小,相应的擦除电路更少。
此外,NAND 的实际应用方式要比NOR复杂的多。
NOR可以直接使用,并可在上面直接运行代码;而NAND需要I/O接口,因此使用时需要驱动程序。
不过当今流行的操作系统对NAND结构的Flash都有支持。
此外,Linux内核也提供了对NAND结构的Flash的支持。
详解 NOR。