APP下载

基于S3C2440 Nand Flash启动模式的研究

2013-10-22韩金利

机械工程与自动化 2013年6期
关键词:寄存器嵌入式启动

韩金利

(山西机电职业技术学院 数控工程系,山西 长治 046000)

0 引言

随着嵌入式系统的发展,Nor Flash和Nand Flash已经成为当今市场上两种重要的非易失闪存技术。由于Nor Flash的成本较高,容量较小,因此Nor Flash比较适合于存储少量的代码。而Nand Flash的单元尺寸几乎是Nor Flash器件的一半,相对于并口Nor Flash而言,引脚数目大大减少,芯片接口简单,使得芯片相关的外围电路更简化,避免了繁琐的硬件连线[1],而且价格便宜,特别适合存储大量数据,具有很强的实用性。

1 Nand Flash的硬件设计

本文采用三星公司的32位RISC微处理器S3C2440作为控制器核心。S3C2440是高性能嵌入式微处理器,主频可达400 MHz,具有外围接口丰富、体积小、功耗低等特点;CPU电压分为2组,核心电压为1.2 V,I/O引脚电压为3.3 V[2]。S3C2440要完成对Nand Flash的读写操作必须具备两个条件:①对S3C2440 CPU上的Nand Flash控制器进行合理配置;②外围必须有与之相配套的Nand Flash存储芯片。要读取Nand Flash存储器中的数据,必须通过Nand Flash控制器发送命令给存储器,所以,Nand Flash仅仅相当于S3C2440的外部设备,并不位于S3C2440本身的内存地址区[3]。

本电路选用的Nand Flash为三星公司的K9F2G08 U0B芯片,它是一个256 MB的内存,每页的大小为2 112 B(2 048 B+64 B备用),每个块的大小132 k B为(128 k B+4 k B备用)。K9F2G08 U0B的8个I/O引脚为数据/地址复用引脚。Nand Flash K9F2G08 U0B与S3C2440的接口控制电路如图1所示。

Nand Flash中8个I/O引脚为数据/地址/命令复用引脚。Nand Flash控制器设计命令锁存使能(Co mmand Latch Enable,CLE)或者地址锁存使能(Address Latch Enable,ALE),一开始先发出 CLE(或ALE)命令,这样Nand Flash内部才能根据传入的内容做出相应的动作。

在K9F2 G08 U0B与S3C2440芯片间进行数据交换时,S3C2440必须对相关引脚进行配置,需要配置的引 脚 有 NCON、OM0、OM1、GPG13、GPG14 和GPG15。其中,OM0、OM1决定S3C2440采用何种启动方式(Nand Flash或者 Nor Flash),这里两个引脚都接为低电平,S3C2440设置为Nand Flash启动方式,NCON与GPG13、GPG14相配合设置,确定存储器的页容量和地址周期。GPG15确定存储器的总线宽度,这里设置为0,表示宽度为8位。

由于S3C2440芯片中集成了Nand Flash芯片控制器,因此对Nand Flash芯片进行读写操作,只与S3C2440中的4个寄存器有关,这4个寄存器为NFCONT、NFCMMD、NFADDR和NFDATA。

2 软件设计

本设计中S3C2440采用Nand Flash启动方式,上电后,CPU首先将Nand Flash中前4 k B的数据自动加载到SRA M中来运行,即ARM在Nand Flash启动模式下启动时,系统会将Nand Flash中前4 k B代码拷贝到SRA M(也就是Steppingstone中);然后Nand Flash中的全部程序代码拷贝到SDRA M中,最后由SRA M跳转到SDRA M,程序正常执行。其启动加载过程如图2所示。

2.1 启动流程图

本文中的部分功能用C语言实现,故在程序开头设置堆栈,再对SDRA M初始化,对Nand Flash控制器进行配置,并使用汇编语言中的R0、R1、R2寄存器传入参数,然后启动读Nand Flash操作函数,将Nand Flash数据读入SDRA M中,最后调用闪灯程序。启动流程如图3所示。

图1 Nand Flash K9F2G08 U0B与S3C2440的接口控制电路

图2 启动加载过程

图3 启动流程

2.2 Nand Flash读操作流程

Nand Flash芯片控制主要分两个部分:①nand_init()中的初始化函数,如nandflash_select_chip()、nandflash_write_c md()、nandflash_wait_idle()、nandflash_deselect_chip();②nand_read()中的读写函数,如nandflash_select_chip()、nandflash_write_c md()、nandflash_wait_idle()、nandflash_deselect_chip()、nandflash_write_addr()、nandflash_read_data()。这两部分读写函数相互配合着完成对Nand Flash芯片的读操作。首先,程序需要读写Nand Flash芯片时,会调用nand_init(void)中的函数,使能 Nand Flash控制器,初始化ECC,禁止片选,设置时序,初始化Nand Flash;接着,nand_read()中的读写函数就会调用nandflash_select_chip()、nandflash_write_c md()、nandflash_wait_idle()、nandflash_write_addr()、nandflash_read_data()、nandflash_deselect_chip(),最终达到将闪灯函数写入SDRA M中。相关函数调用路线图如图4所示。

图4 函数调用路线图

Nand Flash中4 k B以后的数据被拷贝到片外内存中使用,所以在程序设计时必须对Nand Flash进行读操作。读操作流程如图5所示[4]。

Nand Flash读数据函数关键代码如下:

图5 Nand Flash读操作流程

3 结果验证

根据Nand Flash启动方法,在Linux环境中,编写一个闪灯测试程序,并将闪灯函数运行地址在链接文件(*.ld)中定位于0x30000000地址,当程序开始执行后,初始化程序将4 k B以后的数据全部拷贝到SDRA M中,开始地址为0x30000000,在初始化程序完成以后,CPU会自动去执行30000000地址中的数据,如果电路板闪灯,则说明Nand Flash中的程序被读到SDRA M中,表示实验成功,反之读取不成功。

以下为链接文件中的主要代码:

调用Nand Flash前必须为数据读取函数传送3个参数:读取数据存放在SDRA M的目的地址、所要读取数据的源地址、所要读取数据的长度。

以下为3个参数传递的关键代码:

该实验证明,Nand Flash的启动过程是硬件首先将Nand Flash中前4 k B的内容自动加载到片内SRA M中,而且这4 k B程序同时也具备将Nand Flash中剩余数据拷贝到SDRA M中的功能。

4 结束语

详细分析了Nand Flash控制器中相关寄存器的配置过程及其启动原理,并给出了一种读取Nand Flash中数据的方法,文中关键代码段已经得到实验验证,在相关程序的设计中具有一定的参考价值。

[1]叶林俊.Nand Flash内存设备的读写控制设计[J].单片机与嵌入式系统应用,2012(12):16-19.

[2]叶林俊.S3C2440 A嵌入式手持终端电源管理系统设计[J].单片机与嵌入式系统应用,2009(9):28-31.

[3]谢韦华,谭永东,徐伟华.Nand Flash的驱动程序设计[J].单片机与嵌入式系统应用,2009(9):35-38.

[4]韦东山.嵌入式Linux应用完全开发手册[M].北京:人民邮电出版社,2008.

猜你喜欢

寄存器嵌入式启动
Lite寄存器模型的设计与实现
搭建基于Qt的嵌入式开发平台
雾霾来袭 限产再次启动
分簇结构向量寄存器分配策略研究*
安发生物启动2017
嵌入式软PLC在电镀生产流程控制系统中的应用
西部最大规模云计算中心启动
俄媒:上合组织或9月启动扩员
Altera加入嵌入式视觉联盟
倍福 CX8091嵌入式控制器