知识点梳理
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函数直接就执行了,哪里还用复制。
地址线 | [A28:A18] | [A17:A12] | [A11:A0] |
地址表示 | 块地址 | 页地址 | 页内偏移地址 |
不论是在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位。
mini2440开发板的时钟
编译生成bin文件,下载运行
代码源文件
百度文库pdf地址:http://wenku.baidu.com/view/85e30572168884868662d603
pdf文件下载地址:http://download.csdn.net/detail/mybelief321/5234586
源代码下载地址:http://download.csdn.net/detail/mybelief321/5234602
上一篇:根据韦东山修改的mini2440中断的裸机代码
下一篇:ARM汇编指令MCR/MRC学习
推荐阅读最新更新时间:2024-03-16 14:50