ARM S3C2410硬件手册上的重要部分
ANK7的起始地址是可变的,您可以从S3C2410数据手册第5章“Table 5-1. Bank 6/7 Addresses”中了解到BANK6、7的地址范围与地址空间的关系。
本开发板仅使用BANK6的64M空间,我们可以令位[2:1]=010(128M/128M)或001(64M/64M):这没关系,多出来的空间程序会检测出来,不会发生使用不存在的内存的情况——后面介绍到的bootloader和linux内核都会作内存检测。 位[6]、位[3]没有使用
6.MRSRB6、MRSRB7:0x00000030
能让我们修改的只有位[6:4](CL),SDRAM HY57V561620CT-H不支持CL=1的情况,所以位[6:4]取值为010(CL=2)或011(CL=3)。
Nand Flash
当OM1、OM0都是低电平——即开发板插上BOOT SEL跳线时,S3C2410从NAND Flash启动:NAND Flash的开始4k代码会被自动地复制到内部SRAM中。我们需要使用这4k代码来把更多的代码从NAND Flash中读到SDRAM中去。
NAND Flash的操作通过NFCONF、NFCMD、NFADDR、NFDATA、NFSTAT和NFECC六个寄存器来完成。在开始下面内容前,请打开S3C2410数据手册和NAND Flash K9F1208U0M的数据手册。
在S3C2410数据手册218页,我们可以看到读写NAND Flash的操作次序:
1.Set NAND flash configuration by NFCONF register.
2.Write NAND flash command onto NFCMD register.
3.Write NAND flash address onto NFADDR register.
4.Read/Write data while checking NAND flash status by NFSTAT register. R/nB signal should be checked before read operation or after program operation.
1、NFCONF:设为0xf830——
使能NAND Flash控制器、初始化ECC、NAND Flash片选信号nFCE=1(inactive,真正使用时再让它等于0)
设置TACLS、TWRPH0、TWRPH1。
需要指出的是TACLS、TWRPH0和TWRPH1,请打开S3C2410数据手册218页,可以看到这三个参数控制的是NAND Flash信号线CLE/ALE与写控制信号nWE的时序关系。
我们设的值为TACLS=0,TWRPH0=3,TWRPH1=0,其含义为:TACLS=1个HCLK时钟,TWRPH0=4个HCLK时钟,TWRPH1=1个HCLK时钟。
请打开K9F1208U0M数据手册第13页,在表“AC Timing Characteristics for Command / Address / Data Input”中可以看到: CLE setup Time = 0 ns,CLE Hold Time = 10 ns, ALE setup Time = 0 ns,ALE Hold Time = 10 ns, WE Pulse Width = 25 ns 可以计算,即使在HCLK=100MHz的情况下,TACLS+TWRPH0+TWRPH1=6/100 uS=60 ns,也是可以满足NAND Flash K9F1208U0M的时序要求的。
2、NFCMD: 对于不同型号的Flash,操作命令一般不一样。对于本板使用的K9F1208U0M,请打开其数据手册第8页“Table 1. Command Sets”
3、NFADDR:地址
4、NFDATA:数据,只用到低8位
5、NFSTAT:状态,只用到位0,0-busy,1-ready
6、NFECC:校验
现在来看一下如何从NAND Flash中读出数据:
1、NFCONF = 0xf830
2、在第一次操作NAND Flash前,通常复位一下:
NFCONF &= ~0x800 (使能NAND Flash)
NFCMD = 0xff (reset命令)
循环查询NFSTAT位0,直到它等于1
3、NFCMD = 0 (读命令)
4、这步得稍微注意一下,请打开K9F1208U0M数据手册第7页,那个表格列出了在地址操作的4个步骤对应的地址线,A8没用到:
NFADDR = addr & 0xff
NFADDR = (addr>>9) & 0xff (注意了,左移9位,不是8位)
NFADDR = (addr>>17) & 0xff (左移17位,不是16位)
NFADDR = (addr>>25) & 0xff (左移25位,不是24位)
5、循环查询NFSTAT位0,直到它等于1
6、连续读NFDATA寄存器512次,得到一页数据(512字节)
7、NFCONF |= 0x800 (禁止NAND Flash)
UART
UART的寄存器有11X3个(3个UART)之多,我选最简单的方法来进行本实验,用到的寄存器也有8个。不过初始化就用去了5个寄存器,剩下的3个用于接收、发送数据。
1、初始化:
a.把使用到的引脚GPH2、GPH3定义为TXD0、RXD0:
GPHCON |= 0xa0 GPHUP |= 0x0c (上拉)
b.ULCON0 ( UART channel 0 line control register ):设为0x03 此值含义为:8个数据位,1个停止位,无校验,正常操作模式(与之相对的是Infra-Red Mode,此模式表示0、1的方式比较特殊)。
c.UCON0 (UART channel 0 control register ):设为0x05 除了位[3:0],其他位都使用默认值。位[3:0]=0b0101表示:发送、接收都
使用“中断或查询方式”——本实验使用查询查询方式。
d.UFCON0 (UART channel 0 FIFO control register ):设为0x00 每个UART内部都有一个16字节的发送FIFO和接收FIFO,但是本实验不使用FIFO,设为默认值0
e.UMCON0 (UART channel 0
ARMS3C2410硬件手 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)