您的位置 首页 开关

依据韦东山修正的mini2440 nand flash裸机程序

说明开发板:mini2440Nandflash:K9F2G08U0B2,56M本程序实现功能:我是参考韦东山的第8章的裸机程序,但是他的nandflash型号是6

阐明
开发板:mini2440
Nand flash:K9F2G08U0B2,56M
本程序完成功用:我是参阅韦东山的第8章的裸机程序,可是他的nand flash类型是64MB的K9F12080M,所以我依照他的程序加以修正,下载到nand flash,从nand flash完成将main.c程序仿制到sdram中履行。
参阅书:《嵌入式运用开发彻底手册》
《ARM处理器裸机开发实战—机制而非战略》

知识点整理
页的必定地址与相对地址

在nand.c中有一个函数void RdNF2SDRAM(),它的功用是将nand flah的内容仿制到sdram,如下:


nand flash的页读取函数原型是void nf_readpage(unsigned int block,unsigned int page,unsigned char *dstaddr),它的功用是从nand flash的第block块的第page页读取1页(关于K9F2G来说,1页等于2KB)的内容,寄存到指针dstaddr所指的地址处。有的人或许就会说了,已然nf_readpage能够读取1页的数据到指定的地址处,而sdram的地址是0x30000000,那直接能够运用它将nand flash的代码仿制到sdram去啊,答案当然是能够啊!可是有个条件,仿制到sdram的内容必须在2KB以内,一旦超过了2KB,那就需求借用RdNF2SDRAM()函数了,信任这样解说就能理解这两个函数的差异于联系了。
再说说必定地址与相对地址,首要知道k9f2g有2048个块,每个块有64个页,每页有2K字节。咱们往常所说的第几块第几页便是相对地址,比方第2块第3页是相对地址。而必定地址=块号*64+页号,例如前边的第2块第3页换成必定地址便是131(131=2*64+3)。
下面解说一下RdNF2SDRAM()函数:
113行:从117行能够看出,这儿的i指的是相对地址
114行:在nand flash内的开端地址,这儿的4096表明的是字节,k9f2g内存巨细是256Mbyte,这儿之所以令start_addr=4096,是因为咱们在nand.lds文件中,将main.c文件的地址界说在了4096处。如下图:

假如AT(4096)改为AT(5120),那么这儿start_addr就等于5120。还要留意这儿4096byte也便是4KB,为什么把他界说在nand flash的4KB之后呢,因为硬件电路会主动将nand flash里的前4KB的内容搬移到stepping stone中去履行,假如界说在3KB之后,main.c函数直接就履行了,哪里还用仿制。
115行:界说了读取的nand flash的内容寄存的方位,这儿0x30000000是sdram的物理地址。
116行:界说了总共读取nand flash多少字节,这儿界说的是1M,当然小小的一个main.c代码也便是不到2KB。
117-123行:这才是该函数的要害。因为nf_readpage函数是以页为单位进行读取的,每次读取2KB数据,因而,数据指针的移动是页对齐的,即每次移动一页。
117行:因为每page巨细为2KB即2048Byte,这儿start_addr>>11位,相当于start_addr/2048,这样就得到了给定地址多对应的页。
119行:这儿的i是必定地址,因为每块包括64页,i/64得到给定地址处于哪一块;id是该页在块内的第几页。

NAND FLASH地址周期:

下面咱们讲讲地址周期。关于mini2440的开发板,它的nand flash的接口电路如下图:

从接口电路能够看到,地址线和数据线是复用的,接口线宽是8位,因而每次只能发送一个字节,又因为nand flash的地址是28位的,需求5个地址周期才能将地址发送结束,如图1所示。发送完地址后,NAND FLASH内部的地址译码电路会主动将收到的地址进行组合,不需求咱们关怀,可是需求留意发送的次序,依照先发送低地址,再发送高地址的次序发送。
那么为什么是29根地址线,而不是28根或许30根呢?这儿必定有它的原因的。一般来说,nand flash的地址的表明方式为:

地址线 [A28:A18] [A17:A12] [A11:A0]
地址表明 块地址 页地址 页内偏移地址

关于k9f2g来说,它有2048个块,故用11根地址线寻址(2^11=2048);每个块有64页,故用6根地址线寻址(2^6=64);每页有2048字节的数据和64字节的信息,也便是说它有2112字节,故用12根地址线寻址。理解了这儿的话就很简单理解下面的发送地址了。
不论是在nand flash页读取函数仍是也写入函数内,都需求向地址寄存器送地址,如下图:

为什么是这样呢?因为页读取和写入函数均是以页为单位进行的,所以每次都要在页的第0个字节开端,也便是说页内偏移地址为0,所以对地址线的低12位设为0即可,如第93行,94行。
第95行,此刻处于第3个地址周期因而需求发送blockpage(此刻blockpage是页的必定地址)的A12-A19位,因而,将blockpage与0xff相与即可。必定要留意页的必定地址是A28-A12一起表明的,与A11-A0无关。
第96行,此刻处于第3个地址周期因而需求发送blockpage(此刻blockpage是页的必定地址)的A20-A27位,因而,将blockpage右移8位,与0xff相与即可。
第97行,此刻处于第3个地址周期因而需求发送blockpage(此刻blockpage是页的必定地址)的A28位,从图1能够看到,此刻虽然是发送8位,可是只要第0位是有用的,其他位无效。因而,将blockpage右移16位,然后再与0x1相与,只保存第0位。

nand.lds代码解说:

假如代码小于4096字节,那么开发板发动后它们被主动仿制进“Steppingstone”中;本实例的意图便是把一部分代码寄存在NAND Flash地址4096之后,当程序发动经过NAND Flash控制器将它们读出来、履行。nand.lds便是完成这个意图的,即衔接脚本nand.lds把代码分为两部分,nand.lds代码如下:

第2行表明head.o、init.o、nand.o这3个文件的运转地址为0,它们在生成的映像文件中的偏移地址也为0(从0开端寄存)
第3行表明main.o的运转地址为0x30000000,它在生成的映像文件中的偏移地址为4096。
此刻生成的bin文件巨细为4.10KB。
假如将第3行的AT(4096)去掉,其他的文件程序不变的话,make生成的bin文件巨细为1.7KB。这姿态比照就能够看出来AT真的起作用了。



mini2440开发板的时钟

Fin=12MHz FCLK=400MHz HCLK=100MHz PCLK=50MHz
所以FCLK:HCLK:PCLK=1:4:8,CLKDIV_VAL=5
MDIV=127 PDIV=2 SDIV=1
编译生成bin文件,下载运转

本试验总共包括6个文件,分别为Makefile,head.S,init.c,main.c,nand.c,nand.lds,最终会把文件源代码悉数贴出来。
将6个文件仿制到虚拟机的linux体系中,然后make编译生成nand.bin文件,经过supervivi的v指令,结合DNW将它下载到板子中,然后板子从nand flash发动,能够看到4个led灯全亮。


代码源文件

百度文库pdf地址:http://wenku.baidu.com/view/85e30572168884868662d603.html?st=1
pdf文件下载地址:http://download.csdn.net/detail/mybelief321/5234586
源代码下载地址:http://download.csdn.net/detail/mybelief321/5234602

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/kaiguan/262967.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部