首页 第2章-flash存储器模块

第2章-flash存储器模块

举报
开通vip

第2章-flash存储器模块 华清远见——嵌入式培训专家 http://www.farsight.com.cn 《ARM嵌入式系统开发典型模块》 “黑色经典”系列之《ARM嵌入式系统开发典型模块》 第 2章 Flash存储器模块 华清远见——嵌入式培训专家 http://www.farsight.com.cn 《ARM嵌入式系统开发典型模块》 2.1 Flash模块...

第2章-flash存储器模块
华清远见——嵌入式培训专家 http://www.farsight.com.cn 《ARM嵌入式系统开发典型模块》 “黑色经典”系列之《ARM嵌入式系统开发典型模块》 第 2章 Flash存储器模块 华清远见——嵌入式培训专家 http://www.farsight.com.cn 《ARM嵌入式系统开发典型模块》 2.1 Flash模块功能简介 Flash 存储器是一种可在系统(In-System)进行电擦写,掉电后信息不丢失的存储器。 它具有低功耗、大容量、擦写速度快、可整片或分扇区在系统编程(烧写)、擦除等特点,在 体积、抗震性方面都有很大的优势,并且可由内部嵌入的算法完成对芯片的操作,因而在各 种嵌入式系统中得到了广泛的应用。作为一种非易失性存储器,Flash在系统中通常用于存放 程序代码、常量表以及一些在系统掉电后需要保存的用户数据等。常用的 Flash为 8位或 16 位的数据宽度,编程电压为单 3.3V。主要的生产厂商为 ATMEL、AMD、HYUNDAI等,他 们生产的同型器件一般具有相同的电气特性和封装形式,可通用。Flash闪存是非易失存储器, 可以对存储器单元块进行擦写和再编程。任何 Flash 器件进行写入操作前必须先执行擦除。 NAND 器件执行擦除操作十分简单,而 NOR 则要求在进行擦除前,先将目标块内所有的位 都写为 0。擦除 NOR器件时是以 64~128KB的块进行的,执行一个写入/擦除操作的时间为 1~5s;擦除 NAND器件是以 8~32KB的块进行的,执行相同的操作最多只需要 4ms。执行 擦除时,块尺寸的不同进一步拉大了 NOR和 NAND之间的性能差距。统计表明,对于给定 的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于 NOR 的单元中进行。 因此,当选择存储解决方案时, 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 者必须权衡以下的各项因素。 Flash的一般结构如图 2.1所示。 图 2.1 Flash的结构图 《ARM嵌入式系统开发典型模块》—第 2章、Flash存储器模块 《ARM嵌入式系统开发典型模块》 2.2 Flash器件的分类 Flash按结构可分为 NOR和 NAND两大类。Intel于 1988年首先开发出 NOR Flash技术, 彻底改变了原先由 EPROM和 EEPROM一统天下的局面。紧接着,1989年,东芝公司发表 了 NAND Flash结构,强调降低每比特的成本、更高的性能,并且像磁盘一样可以通过接口 轻松升级。但是经过了十多年之后,仍然有相当多的硬件工程师分不清 NOR和 NAND闪存。 NOR的特点是芯片内执行(XIP,eXecute In Place),这样应用程序可以直接在 Flash闪存内 运行,不必再把代码读到系统 RAM中。NOR的传输效率很高,在 1~4MB的小容量时具有 很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。NAND结构能提供极高 的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用 NAND的困难在于 Flash的管理和需要特殊的接口。NOR的 NAND的差别主要有以下方面。 (1)性能差别 Flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何 Flash 器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前 必须先执行擦除。NAND 器件执行擦除操作是十分简单的,而 NOR 则要求在进行擦除前先 要将目标块内所有的位都写为 0。由于擦除 NOR器件时是以 64~128KB的块进行的,执行 一个写入/擦除操作的时间为 5s,与此相反,擦除 NAND器件是以 8~32KB的块进行的,执 行相同的操作最多只需要 4ms。 执行擦除时块尺寸的不同进一步拉大了 NOR和 NAND之间的性能差距,统计表明,对 于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于 NOR的单元中 进行。这样,当选择存储解决方案时,设计师必须权衡以下的各项因素。 l NOR的读速度比 NAND稍快一些。 l NAND的写入速度比 NOR快很多。 l NAND的 4ms擦除速度远比 NOR的 5s快。 l 大多数写入操作需要先进行擦除操作。 l NAND的擦除单元更小,相应的擦除电路就更少。 (2)接口差别 NOR Flash带有 SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每 一个字节。 NAND器件使用复杂的 I/O口来串行地存取数据,各个产品或厂商的方法可能各不相同。 8个引脚用来传送控制、地址和数据信息。 NAND读和写操作采用 512字节的块,这一点有点像硬盘管理此类操作,很自然地,基 于 NAND的存储器就可以取代硬盘或其他块设备。 (3)容量和成本 NAND Flash的单元尺寸几乎是 NOR器件的一半,由于生产过程更为简单,NAND结构 可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格。 华清远见——嵌入式培训专家 http://www.farsight.com.cn 《ARM嵌入式系统开发典型模块》 NOR Flash 占据了容量为 1~16MB 闪存市场的大部分,而 NAND Flash 只是用在 8~ 128MB的产品当中,这也说明 NOR主要应用在代码存储介质中,NAND适合于数据存储。 (4)易用性 可以非常直接地使用基于 NOR 的闪存,可以像其他存储器那样连接,并可以在上面直 接运行代码。 由于需要 I/O接口,NAND要复杂得多。各种 NAND器件的存取方法因厂家而异。 在使用 NAND 器件时,必须先写入驱动程序,才能继续执行其他操作。向 NAND 器件 写入信息需要相当的技巧,因为设计师绝不能向坏块写入,这就意味着在 NAND器件上自始 至终都必须进行虚拟映射。 (5)耐用性 在 NAND 闪存中每个块的最大擦写次数是 100万次,而 NOR 的擦写次数是 10万次。 NAND存储器除了具有 10∶1的块擦除周期优势外,典型的 NAND块尺寸要比 NOR器件小 8倍,每个 NAND存储器块在给定的时间内的删除次数也要少一些。 (6)位交换 所有 Flash器件都受位交换现象的困扰。在某些情况下(很少见,NAND 发生的次数要 比 NOR多)一个比特位会发生反转或被报告反转了。 一位的变化可能不很明显,但是如果发生在一个关键文件上,这个小小的故障却可能导 致系统停机。如果只是报告有问题,多读几次就可能解决了。 当然,如果这个位真的改变了,就必须采用错误探测/错误更正(EDC/ECC)算法。位 反转的问题更多见于 NAND闪存,NAND的供应商建议使用 NAND闪存的时候,同时使用 EDC/ECC算法。 这个问题对于用 NAND存储多媒体信息时倒不是致命的。当然,如果用本地存储设备来 存储操作系统、配置文件或其他敏感信息时,必须使用 EDC/ECC系统以确保可靠性。 (7)坏块处理 NAND器件中的坏块是随机分布的。 NAND器件需要对介质进行初始化扫描以发现坏块,并将坏块标记为不可用。在已制成 的器件中,如果通过可靠的方法不能进行这项处理,将导致高故障率。 (8)软件支持 当讨论软件支持的时候,应该区别基本的读/写/擦操作和高一级的用于磁盘仿真和闪存 管理算法的软件,包括性能优化。 在 NOR器件上运行代码不需要任何的软件支持,在 NAND器件上进行同样操作时,通 常需要驱动程序,也就是内存技术驱动程序(MTD),NAND和 NOR器件在进行写入和擦除 操作时都需要MTD。 使用 NOR器件时所需要的MTD要相对少一些,许多厂商都提供用于 NOR器件的更高 级软件,这其中包括 M-System的 TrueFfs驱动,该驱动被Wind River System、Microsoft、 QNX Software System、Symbian和 Intel等厂商所采用。 驱动还用于对 DiskOnChip产品进行仿真和 NAND闪存的管理,包括纠错、坏块处理和 《ARM嵌入式系统开发典型模块》—第 2章、Flash存储器模块 《ARM嵌入式系统开发典型模块》 损耗平衡。 2.3 Flash存储器的硬件设计 2.3.1 常见 Flash存储器简介 下面介绍 2种目前市场常见的 Flash器件,即 HY29LV160和 SST39LF160。 HY29LV160的工作电压为2.7~3.6V,单片存储容量为2M字节,采用 48脚 TSOP封 装,如图 2.2所示。16位数据宽度,可以以8位(字节模式)或 16位(字模式)数据宽度的 方式工作。 图 2.2 HY29LV160引脚图 华清远见——嵌入式培训专家 http://www.farsight.com.cn 《ARM嵌入式系统开发典型模块》 HY29LV160仅需 3V电压即可完成在线系统的编程与擦除操作,通过对其内部的命令寄 存器写入 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 的命令序列,可对 Flash完成编程(烧写)、整片擦除、按扇区擦除以及其他操 作。HV29LV160的引脚功能描述如表 2.1所示。 表 2.1 HY29LV160引角功能描述 引脚 类型 描述 RESET# I 硬件复位,低电平有效,对 HY29LV160进行硬件复位 RY/BY# O 就绪/忙状态指示。用于指示写或擦除操作是否完成。当 HY29LV160正在 进行编程或擦除操作时,该引脚为低电平,操作完成时为高电平,此时可 读取内部的数据 A[19:0] I 地址总线。在字节模式下,DQ[15]/A[-1]用作 21位字节地址的最低位 DQ[15]/A[-1] SQ[14:0] I/O 三态 数据总线。在读写操作时提供 8位或 16位的数据宽度。在字节模式下, SQ[15]/A[-1]用作 21位字节地址的最低位,而 DQ[14:8]处于高阻状态 OE# I 输出使能,低电平有效。在读操作时有效,写操作时无效 WE# I 写使能,低电平有效。在对 HY29LV160进行编辑和擦除操作时,控制相 应的写命令 CE# I 片选信号,低电平有效。在对 HY29LV160进行读写操作时,该引脚必须 为低电平,当为高电平时,芯片处于高阻旁路状态 BYTE# I 模式选择。低电平为字节模式,高电平为字模式 VCC 3.3V电源 VSS 接地 关于 SST39LF160 的特点及引脚图在本 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 第一章已经介绍过,这里将介绍 SST39LF160 的各种操作。 1.器件操作 SST39LF160 的存储器操作由命令来启动,命令通过标准微处理器写时序写入器件,将 WE#拉低、CE#保持低电平来写入命令地址。总线上的地址在WE#或 CE#的下降沿(无论哪 一个后产生下降沿)被锁存。数据总线上的数据在WE#或 CE#的上升沿(无论哪一个先产生 上升沿)被锁存。SST39LF160 还包含一种自动低功耗模式,它可在有效读操作将数据读出 后使器件进入一个接近等待模式的状态,这样 IDD 有效读电流从 15mA降低到 4 A。自动 低功耗模式可将典型的 IDD有效读电流降低到读周期内的 1mA/MHz。只要启动另一次读周 期的地址或控制信号发生变化,器件就退出自动低功耗模式,不占用访问时间。注意当 CE# 保持低电平而使器件上电后器件就不能进入自动低功耗模式,直到出现第一个地址跳变或 《ARM嵌入式系统开发典型模块》—第 2章、Flash存储器模块 《ARM嵌入式系统开发典型模块》 CE#变为高电平。 SST39LF160 的读操作由 CE#和 OE#控制,只有两者都为低电平时系统才能从器件的输 出管脚获得数据,CE#是器件片选信号,当 CE#为高电平时器件未被选中工作,只消耗等待 电流。OE#是输出控制信号,用来控制输出管脚数据的输出。当 CE#或 OE#为高电平时数据 总线呈现高阻态。SST39LF160的读周期时序图如图 2.3所示。 图 2.3 SST39LF160读周期时序图 2.字编程操作 SST39LF160 以字形式进行编程,编程前包含字的扇区必须完全擦除。编程操作分为 3 步。第一步,执行 3字节装载时序,用于软件数据保护。第二步,装载字地址和字数据。在 字编程操作中地址在 CE#或 WE#的上升沿(不论哪一个后产生下降沿)锁存,数据在 CE# 或WE#的上升沿(不论哪一个先产生上升沿)锁存。第三步,执行内部编程操作该操作。在 第 4个WE#或 CE#的上升沿出现(不论哪一个先产生上升沿)之后启动编程操作。一旦启动 将在 20 s内完成。 3.扇区/块擦除操作 作扇区操作通过在最新一个总线周期内执行一个 6字节的命令时序(扇区擦除命令 30H 和扇区地址 SA)来启动。块擦除操作通过在最新一个总线周期内执行一个 6 字节的命令时 序(块擦除命令 50H和块地址 BA)来启动。扇区或块地址在第 6个WE#脉冲的下降沿锁存。 命令(30H 或 50H)在第 6个 WE#脉冲的上升沿锁存。内部擦除操作在第 6个 WE#脉冲后 开始执行擦除操作,是否结束由数据查询位或触发位决定。 4.芯片擦除操作 SST39LF160包含芯片擦除功能,允许用户擦除整个存储器阵列,使其变为“1”状态。 这在需要快速擦除整个器件时很有用。 芯片擦除操作通过在最新一个总线周期内执行一个 6 华清远见——嵌入式培训专家 http://www.farsight.com.cn 《ARM嵌入式系统开发典型模块》 字节的命令(5555H地址处的芯片擦除命令 10H)时序来启动。在第 6个WE#或 CE#的上升 沿(无论哪一个先出现上升沿)开始执行擦除操作。擦除过程中只有触发位或数据查询位的 读操作有效。 5.写操作状态检测 SST39LF160 提供 2 种检测写(编程或擦除)周期结束的软件方法,以便优化系统的写 周期。软件检测包括 2个状态位:数据查询位 DQ7和触发位 DQ6。写结束检测模式在WE# 的上升沿后使能,WE#的上升沿用来启动内部的编程或擦除操作。 非易失性写操作的结束与系统不同步,因此数据查询位或触发位的读取可能与写周期结 束同时发生。 如果这样系统就可能得到一个错误的结果(有效数据与 DQ7或 DQ6发生冲突)。 为了防止错误的情况,当一个错误结果出现时软件程序应当包含一个两次读被访问地址单元 的循环,如果两次读取的值均有效,则器件已经完成了写周期,否则拒绝接受数据。 当SST39LF160正在执行内部编程操作时,任何读DQ7的动作都将得到真实数据的补码, 一旦编程操作结束,DQ7 为真实的数据,即使在内部写操作结束后紧接着出现在 DQ7 上的 数据可能有效,其余的数据输出管脚上的数据也无效。只有在 1 s的时间间隔后执行了连续 读周期所得的整个数据总线上的数据才有效。在内部擦除操作过程中读出的 DQ7值为‘0’, 一旦内部擦除操作完成 DQ7的值为‘1’。 编程操作的第 4 个 WE#或 CE#脉冲的上升沿出现后数据查询位有效。对于扇区/块擦除 或芯片擦除,数据查询位在第 6个WE#或 CE#脉冲的上升沿出现后有效。 6.软件数据保护 SST39LF160为数据变化操作,即编程和擦除操作提供了符合 JEDEC标准的数据保护机 制。编程操作要求包含一个 3字节的时序。这个 3字节装载时序用来启动编程操作。为防止 意外写(例如系统上电或下电过程中出现的写操作)提供最佳保护。擦除操作要求包含一个 6字节的时序,器件出厂时,软件数据保护特性就永久使能。 7.通用 Flash接口 SST39LF160还包含 CFI信息,用来描述器件特性。为了进入 CFI查询模式,系统必须 执行装载 3字节的时序(类似于软件 ID入口命令),该命令的最后一个周期将 98H(CFI查 询命令)装入地址 5555H。一旦器件进入 CFI查询模式,系统就会读出 CFI数据(地址信息 表参见 SST39LF160技术手册)。系统必须通过写入 CFI退出命令,从 CFI查询命令的执行过 程中退出,返回到读模式。 表 2.2 SST39LF160编程擦写周期时序参数 符号 参数 最小 最大 单位 TBP 字编程时间 20 ms TAS 地址建立时间 0 ns 《ARM嵌入式系统开发典型模块》—第 2章、Flash存储器模块 《ARM嵌入式系统开发典型模块》 TAH 地址保持时间 30 ns TCS WE#和 CE#建立时间 0 ns TCH WE#和 CE#保持时间 0 ns TOES OE#高建立时间 0 ns TOEH OE#高电平保持时间 10 ns TCP CE#脉冲宽度 40 ns TWP WE#脉冲宽度 40 ns TWPH1 WE#脉宽高电平 30 ns TCPH1 CE#脉宽高电平 30 ns TDS 数据建立时间 30 ns 续表 符号 参数 最小 最大 单位 TDH1 数据保持时间 0 ns TIDAL 软件 ID访问和退出时间 150 150 ns TSE 扇区擦除 25 25 ms TBE 块擦除 25 25 ms TSCE 芯片擦除 100 ms 2.3.2 Flash存储器接口电路 我们以 S3C4510B和 HY29LV160芯片为例说明 Flash存储器与 ARM芯片的接口电路。 图 2.4为选用一片 Flash存储器芯片 HY29LV160构建 16位的 Flash存储器系统,其存储容量 为 2MB。HY29LV160仅需要 3V电压即可完成在系统的编程与擦除操作,通过对其内部的命 令寄存器写入标准的命令序列,可对 Flash进行编程(烧写)、整片擦除、按扇区擦除以及其 他操作。Flash存储器在系统中通常用于存放程序代码,系统上电复位后从此获取指令并开始 执行。因此,应将存有程序代码的 Flash存储器配置到 ROM/SRAM/FLASH BANK0中。 华清远见——嵌入式培训专家 http://www.farsight.com.cn 《ARM嵌入式系统开发典型模块》 图 2.4 S3C4510B的一片 Flash扩展电路 S3C4510B与 HY29LV160的接口线 数据线: S3C4510B的低 16位数据总线[XDATAI5~XDATA0]与HY29LV160的[DQ15~ DQ0]相连。 地址线:S3C4510B的[ADDR19~ADDR0]与 HY29LV160的[A19~A0]相连。S3C4510B 的 nRCS<0>接至 HY29LV160的片选端 CE#。 控制线:HY29LV160的 RESET#接系统复位信号。BYTE#上拉,使 HY29LV160工作在 字模式;RY/BY#指示 HY29LV160编程或擦除操作的工作状态,其工作状态也可通过查询片 内的相关寄存器来判断,因此可将该引脚悬空;读写线 OE#和WE#分别与 S3C4510B的 nOE, nWBE<0>相连。还应注意的一点是,此时应将 S3C4510B的 BOSIZE[l: 0]置为‘10’,选择 ROM/SRAM/FLASH Bank0为 16位数据总线宽度工作方式。 2.4 Flash存储器的操作 Flash存储器的操作包括对 Flash的擦除和烧写编程,针对不同的厂商和不同型号的 Flash 存储器,程序应作相应的修改。向 Flash 存储器的特定寄存器写入地址和数据命令,就可对 Flash 存储器进行烧写、擦除等操作,但操作必须按照一定的顺序进行,否则就会导致 Flash 存储器复位而使操作命令无法完成。编程指令只能使‘1’变为‘0’,而擦除命令可使‘0’ 变为‘1’,因此正确的操作顺序是先擦除,后编程,当 Flash 存储器被擦除以后读出的内容 应全为 0xFF。下面以 HY29LV160芯片为例介绍对 Flash存储器的操作。 《ARM嵌入式系统开发典型模块》—第 2章、Flash存储器模块 《ARM嵌入式系统开发典型模块》 2.4.1 Flash器件的编程操作 HY29LV160的编程操作需要 4个总线周期,编成指令时序从 2个写周期开始,接着是编 程开始指令,随后是编程地址和数据,并按照顺序启动相应的内嵌算法。芯片自动产生编成 脉冲并校验被编程的单元。系统通过 DQ7、DQ6、RY/BY来获知擦除操作的状态。当内嵌算 法完成后,芯片将返回到读队列,数据和地址被释放。图 2.5是 Flash芯片的编程操作时序图。 图 2.5 编程操作时序图 表 2.3 正常编程命令 第一步 第二步 第三步 第四步 地址 数据 地址 数据 地址 数据 地址 数据 正常 字 0x555 0x2AA 0x555 0xA0 待编程的地址 编程 字节 0xAAA 0xAA 0x555 0xAAA 等编程的数据 如上表所示,向 HY29LV160指定地址中写入数据,可按(16位)或字节(8位)操作, 共需要4个总线周期,分4步完成,前2个周期是解锁周期,第3个是建立编程命令,最后 1个周期完成向待编程地址写入特定的数据。 tVCS 华清远见——嵌入式培训专家 http://www.farsight.com.cn 《ARM嵌入式系统开发典型模块》 2.4.2 Flash器件的擦除操作 片擦除操作需要 6个时序来操作。片擦除命令由 2个非锁定周期引导,接下来是一个开 始命令。跟在片擦除命令后的 2个额外的非锁定写周期用来触发内嵌的擦除算法。内嵌擦除 算法自动修正整个非零数据区。在擦除操作期间,系统不需要提供任何控制和它时序,但擦 除过程中需要片擦除的数据和地址命令序列。在内嵌算法执行期间,任何写芯片的命令都被 忽略。当芯片返回到读取数据队列时,片擦除命令序列被重新引导,来确保数据的完整。系 统通过 DQ7、DQ6、DQ2、RY/BY来获知擦除操作的状态。当内嵌擦除算法完成后,芯片返 回到队列,数据和地址被释放。图 2.6描述了 FLash芯片的擦除操作时序。 图 2.6 擦除操作时序图 结合图 2.6 的 HY29LV160 擦除时序图,表 2.4 给出了擦除命令及其地址及数据。将 HY29LV160整片擦除,也可按字(16位)或字节操作,共需要 6个总线周期,分 6步完成, 前 2个是解锁周期,第 3个是建立编程命令,第 4、第 5是解锁周期,最后1个周期是整片 擦除周期。 表 2.4 擦除命令 第一步 第二步 第三步 第四步 第五步 第六步 地址 数据 地址 数据 地址 数据 地址 数据 地址 数据 地址 数据 《ARM嵌入式系统开发典型模块》—第 2章、Flash存储器模块 《ARM嵌入式系统开发典型模块》 字 0x555 0x2AA 0x555 0x555 0x2AA 0x555 整 片 擦 除 字 节 0xAAA 0xAA 0x555 0x55 0xAAA 0x80 0xAAA 0xAA 0x555 0x55 0xAAA 0x10 2.4.3 Flash存储器的操作检测 当按照 规定 关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定 的命令序列向 Flash 存储器发出命令时,其内部的编程或擦除算法就可以自 动完成编程或擦除操作,但无论是编程或擦除都需要一定的操作时间,同时用户还应了解其 内部的操作检测机制,以便知道操作是否完成或操作是否正确。常用检测的状态位有:跳变 位(DQ6),超时标志位(DQ5),数据查询位(DQ7)和 Ready/Busy(RY/BY#)。 常用的检测方法有3种。第 1种是判断引脚 RY/BY#的状态,在编程或擦除操作过程中, RY/BY#引脚一直为低电平,操作完成后变为高电平。第2种就是检测跳变位 DQ6,在编程 或擦除时对任何地址进行连续的读均引起 DQ6连续跳变,直至操作结束才停止跳变。第3种 方法是使用数据线的 DQ7和 DQ5位,DQ7位在编程或擦除过程中输出的数是写入该位数据 的反码,当操作完成时输出才变为写入该位的数据;DQ5 的状态为“1”时表示操作超时, 此时应该再读一次 DQ7 的状态,若 DQ7 输出仍不是写入的数据,则操作失败,复位 Flash 存储器。其 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 如图 2.7所示。 读 DQ7和 DQ5 检测开始 DQ7=data? DQ5=1? 重读 DQ5和 DQ7 DQ7=data? 操作错误 操作成功 Y N Y N 图 2.7 操作检测流程图 华清远见——嵌入式培训专家 http://www.farsight.com.cn 《ARM嵌入式系统开发典型模块》 2.4.4 Flash存储器的编程方法 对 Flash 存储器的烧写、整片擦除、按扇区擦除以及其他操作,都可以通过编程实现。 现在以 HY23LV160 Flash存储器的整片擦除为例,介绍 Flash编程的方法。其参考程序如下。 # define FLASH_START_ADDR 0x0000 # define FLASH_ADDR_UNLOCK1 0x555 # define FLASH_ADDR_UNLOCK2 0x2aa # define FLASH_DATA_UNLOCK1 0xaaaa # define FLASH_DATA_UNLOCK2 0x5555 # define FLASH_SETUP_ERASE 0x8080 # define FLASH_CHIP_ERASE 0x1010 # define UNIT16 unsigned short int FlashStatusDetect(UINT16 *ptr, UINT16 Data, int TimeCounter); int Main() { int i; Volatile UINT16 *flashptr=(UINT16*) FLASH_START_ADDR; //按 HY29LV160整片擦除命令要求写入命令序列,以 16位方式操作; *((volatile UINT16 *) FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1; *((volatile UINT16 *) FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2; *((volatile UINT16 *) FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)= FLASH_SETUP_ERASE; *((volatile UINT16 *) FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1; *((volatile UINT16 *) FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2; *((volatile UINT16 *) FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)= FLASH_CHIP_ERASE; //判断擦除操作是否正确完成 if(FlashStatusDetect((UINT16 *)flashptr, 0xffff, 0x1000000)!=1) printf(“ERROR!”); return(0); } int FlashStatusDetect(UINT16 *ptr, UINT16 Data, int TimeCounter) { int tmp=TimeCounter; volatile UINT16 *p=ptr; UINT16 data1, data2, current_data; current_data=Data & 0x8080; while((*p & 0x8080;) != current_data) { 《ARM嵌入式系统开发典型模块》—第 2章、Flash存储器模块 《ARM嵌入式系统开发典型模块》 if(tmp--<= 0) return 0; } return 1; } 在该程序中,首先以 16位操作方式,按 HY29LV160整片擦除命令要求写入命令序列, 然后判断 DQ7的状态是否正确。为稳妥起见,在擦除完成之后还应读取 Flash存储器的内容 与 0xFFFF 相比较,看是否相等,若相等则表明擦除操作完全正确,否则表明擦除操作错误 或 Flash存储器已经损坏,读者可自行添加这段代码。 注意符号常量 FLASH_START_ADDR,程序中用其标识系统中 Flash存储器的起始物理 地址,本例假定系统中 Flash 存储器的起始物理地址为 0x0,在系统复位或上电时,位于 ROM/SRAM/FLASH Bank0的 Flash存储器的起始物理地址会被映射到 0x0,可用本例进行整 片擦除操作。但当 Flash 中写有应用程序或操作系统时,这些程序在启动并初始化系统后, 可能会把 Flash存储器映射到其他的地址空间,此时应修改该起始,否则就不能正确擦除 Flash 存储器。 2.5 用 16位 Flash芯片构成 32位存储系统 ARM 微处理器的体系结构支持 8位/16 位/32 位的存储器系统,对应地可以构建 8 位、 16位或 32位的 Flash存储器系统。32位的存储器系统具有较高的性能,而 16位的存储器系 统则在成本及功耗方面占有优势,而 8位的存储器系统现在已经很少使用。 图 2.8 以 HY29LV160 的 Flash 芯片为例说明如何用 2 片 16 位的 Flash 芯片构造基于 S3C4510B的 32位存储系统。采用 2片 16位数据宽度的 HY29LV160Flash存储器芯片并联构 建16/32位的Flash存储系统,其总存储容量可以根据需要灵活配置为16位2MB和32位4MB, 采用 2片 HY29LV160并联的方式构建 32位的 Flash存储器系统,其中一片为高 16位,另一 片为低 16位,Flash存储器在系统中通常用于存放程序代码,系统上电或复位后从此获取指 令并开始执行,因此,应将存有程序代码的 Flash存储器配置到 ROMISRAM/FLASH Bank0, 即将 S3C4510B的 nRCS<0>(Pin75)接至 2片 HY29LV16的 CE#端; 2片 HY29LV160的 RESET#端接系统复位信号; 2片 HY29LV160的 OE#端接 S3C4510B的 nOE (Pin72 ); 低 16位片的WE#端接S3C4510B的 nWBE<0> (Pin100),高 16位片的WE#端接S3C4510B 的 nWBE<2> (Pin102); 2片 HY29LV160的 BYTE#均上拉,使之均工作在字模式; 2片 HY29LV160的地址总线[A19~A0」均与 S3C4510B的地址总线[ADDR19~ADDR0] 相连; 华清远见——嵌入式培训专家 http://www.farsight.com.cn 《ARM嵌入式系统开发典型模块》 图 2.8 32位系统接线图 低 16位片的数据总线与 S3C4510B的低 16位数据总线「XDATAl5~XDATA0]相连,高 16位片的数据总线与 S3C4510B[XDATA31 ~XDATA 16]相连; 若要工作在 16位 2MB方式时,应将 S3C4510B的 BOSIZE [1:0]置为‘10’,选择 ROM/ SRAM/FLASH Bank0为 16位工作方式; 若要工作在 32位 4MB方式时,应将 S3C4510B的 BOSIZE [1:0]置为‘11’,选择 ROM/ SRAM/FLASH Bank0为 32位工作方式。 2.6 应用程序设计 /*********************************************** * NAME : 44BLIB.H ***********************************************/ 《ARM嵌入式系统开发典型模块》—第 2章、Flash存储器模块 《ARM嵌入式系统开发典型模块》 #define DebugOut Uart_Printf #define min(x1,x2) ((x1x2)? x1:x2) #define ONESEC0 (62500) //16us resolution, max 1.04 sec #define ONESEC1 (31250) //32us resolution, max 2.09 sec #define ONESEC2 (15625) //64us resolution, max 4.19 sec #define ONESEC3 (7812) //128us resolution, max 8.38 sec #define ONESEC4 (MCLK/128/(0xff+1)) //@60Mhz, 128*4us resolution, max 32.53 sec #define NULL 0 #define EnterPWDN(clkcon) ((void (*)(int))0xe0)(clkcon) #define DOWNLOAD_ADDRESS _RAM_STARTADDRESS /*44blib.c*/ void Delay(int time); //Watchdog Timer is used. void *malloc(unsigned nbyte); void free(void *pt); void Port_Init(void); void Cache_Flush(void); void ChangeMemCon(unsigned *pMemCfg); void Uart_Select(int ch); void Uart_TxEmpty(int ch); void Uart_Init(int mclk,int baud); char Uart_Getch(void); char Uart_GetKey(void); int Uart_GetIntNum(void); void Uart_SendByte(int data); void Uart_Printf(char *fmt,...); void Uart_SendString(char *pt); void Timer_Start(int divider); //应用看门狗定时器 int Timer_Stop(void); //应用看门狗定时器 //void restart(void); //void run(void); void Led_Display(int LedStatus); void Beep(int BeepStatus); void ChangePllValue(int m,int p,int s); /********Def.h***********/ #define U32 unsigned int 华清远见——嵌入式培训专家 http://www.farsight.com.cn 《ARM嵌入式系统开发典型模块》 #define INT32U unsigned int #define INT32 int #define U16 unsigned short #define INT16U unsigned short #define INT16 short int #define S32 int #define S16 short int #define U8 unsigned char #define INT8U unsigned char #define INT8 char #define S8 char #define TRUE 1 #define FALSE 0 #define OK 1 #define FAIL 0 #define FileEnd 1 #define NotEnd 0 /*************flashrom.h************/ #include "..\Target\def.h" #ifndef __ROMDEF_H__ #define __ROMDEF_H__ int SST39VF160_WordProg(INT32U addr,INT16U dat); void SST39VF160_SectorErase(INT32U SAaddr); int SST39VF160_CheckBlank(INT32U addr,INT32U WordSize); #define Writeflash(addr,dat) *((volatile INT16U *)(addr<<1))=(INT16U)dat #define Readflash(addr) (*((volatile INT16U *)(addr<<1))) #endif // __ROMDEF_H // /*************flashrom.c************/ #include "flashrom.h" #include "..\Target\def.h" int SST39VF160_CheckBlank(INT32U addr,INT32U WordSize) { INT32U i,temp; for (i=addr;i<(addr+WordSize);i++) { temp=*((volatile INT16U *)(i<<1)); if(temp!=0xffff) 《ARM嵌入式系统开发典型模块》—第 2章、Flash存储器模块 《ARM嵌入式系统开发典型模块》 return 0; } return 1; } int Waitfor_endofprg(void) //Check if the bit6 toggle ends. { volatile INT16U flashStatus,old; old=*((volatile INT16U *)0x0); while(1) { flashStatus=*((volatile INT16U *)0x0); if( (old&0x40) = = (flashStatus&0x40) ) break; else old=flashStatus; } return 1; } int SST39VF160_WordProg (INT32U addr,INT16U dat) { Writeflash (0x5555,0xAA); Writeflash (0x2AAA,0x55); Writeflash (0x5555,0xA0); Writeflash (addr,dat); return(Waitfor_endofprg()); } void SST39VF160_SectorErase(INT32U SAaddr) { Writeflash(0x5555,0xAA); Writeflash(0x2AAA,0x55); Writeflash(0x5555,0x80); Writeflash(0x5555,0xAA); Writeflash(0x2AAA,0x55); Writeflash(SAaddr,0x30); Waitfor_endofprg(); }
本文档为【第2章-flash存储器模块】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_041023
暂无简介~
格式:pdf
大小:555KB
软件:PDF阅读器
页数:19
分类:
上传时间:2011-04-01
浏览量:60