根据韦东山修改的mini2440 nand flash裸机程序

发布者:Serendipity99最新更新时间:2016-04-13 来源: eefocus关键字:mini2440  nand  flash  裸机程序 手机看文章 扫描二维码
随时随地手机看文章
说明
       开发板: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


关键字:mini2440  nand  flash  裸机程序 引用地址:根据韦东山修改的mini2440 nand flash裸机程序

上一篇:根据韦东山修改的mini2440中断的裸机代码
下一篇:ARM汇编指令MCR/MRC学习

推荐阅读最新更新时间:2024-03-16 14:50

基于多端口串行Flash的条形LED显示屏控制的工作原理介绍
为了不增加硬件成本而提高显示数据的输出速度,在分析现有条形LED 显示屏单元板电路的基础上,提出了一种基于多端口串行Flash 存储器的LED 显示控制系统,该系统由STC12C5616 高速1T 单片机和带SPI接口的SST26VF016B 串行多端口Flash 存储器组成。 显示数据输出时,利用单片机的高速同步串行口( SPI) 高速时钟,将多端口串行Flash 存储器中的显示数据以"存储器直接存取( DMA) "的方式直接输出至超长条形LED显示屏。 最后,以4 096 × 64 点阵单色LED 显示屏为例进行了测试。 结果表明,显示屏刷新率达到62. 5 Hz,验证了该系统在实际应用中的有效性和可行性。   在LED
[电源管理]
基于多端口串行<font color='red'>Flash</font>的条形LED显示屏控制的工作原理介绍
搞定新唐error:flash download failed - cortex-m0
新唐Cortex-M0下载Flash失败-设置正确但下载失败的一个解决方法 今天在调试程序时、DEMO板下载几次后就提示Flash下载失败: Keil v4里面的设置都没有动过、不可能被修改。 此时、使用新唐的ICP Programming Tool软件来链接芯片,提示需要擦除芯片,然后才能下载。 这下、发现了在Keil v4里面老是下载失败的解决方法了: 在Keil v4里面、先擦除芯片:
[单片机]
搞定新唐error:<font color='red'>flash</font> download failed - cortex-m0
向192层3D NAND闪存进发,长江存储计划今年将产量提高一倍
据日经亚洲评论报道,长江存储计划今年将产量提高一倍,并开始率先生产192层3D NAND闪存。 两名知情人士表示,长江存储计划到2021年下半年将存储芯片的月产量提高一倍,至10万片晶圆,约占全球总产量的7%。这将有助于该公司缩小与全球先进制造商之间的差距。据悉,三星电子目前每月约生产48万片晶圆,而美光的月产能约为18万片。 报道指出,长江存储除计划增产外,也在加快技术开发进程。 知情人士表示,长江存储最早将于2021年年中试产第一批192层3D NAND闪存芯片。不过,因先进工艺的复杂性,需要时间确保量产芯片质量,这一计划有可能会被推迟到今年下半年。 长江存储于
[嵌入式]
向192层3D <font color='red'>NAND</font>闪存进发,长江存储计划今年将产量提高一倍
mini2440硬件篇之ADC触摸屏
1.1. ADC知识 ADC(Analog to Digital Converter),可以接收8个通道的模拟信号输入,并将它们转换为10位的二进制。在2.5MHz的A/D转换时钟下,最大转化速率可达500KSPS(SPS:samples per second,每秒采样次数)。 1.2. 触摸屏硬件知识 触摸屏是当今最流行的一种人机交互接口,它被广泛地应用于手机等消费类电子产品中,目前这种技术有向PC机方向发展的趋势。基于原理的不同,触摸屏可以分为电阻式、电容式、表面声波式等。电阻式是应用较广的一种触摸屏,它的原理是通过测量横向和纵向的电阻值来获得触点的坐标。 1.3. 电阻式触摸屏工作原理原理 触摸屏附着在显示器的表面,与显
[单片机]
<font color='red'>mini2440</font>硬件篇之ADC触摸屏
ARMLinux(mini2440)串口与51单片机的9位串口通讯
当51单片机的串口模式在方式2或方式3时为9位通讯方式,即当串行数据第9位为 1 时,前8位数据指示的是用来和主机通讯的从机地址;当串行数据第9位为 0 时,前8位数据则用为真正的数据。具体请参考: https://www.eeworld.com.cn/mcu/2011/0621/article_4424_1.html 而FriendlyARM的mini2440可以设置的数据位数为5~8位,即CS5,CS6,CS7,CS8。关于Linux串口的编程教学请参见: http://www.adamjiang.com/pukiwiki/index.php?Linux串口编程详解#ec39e271 查阅了一下前人的做法,有两种:1.硬方
[单片机]
ARMLinux(<font color='red'>mini2440</font>)串口与51单片机的9位串口通讯
ICinsights:DRAM、NAND售价已暴涨一年
IC Insights的报告显示,DRAM及NAND Flash售价已经连续四个季度上涨。 不过因为原厂纷纷提出扩产计划,IC Insights稍早忧心忡忡认为,未来几年包括三星电子、SK海力士、美光、英特尔、东芝、西部数据、武汉新芯、长江存储,都大举提高3D NAND Flash产能,大陆还有新建厂商也会加入战场,3D NAND Flash产能供过于求的可能性相当高。 近期SK海力士宣布今年资本支出追加至86.1亿美元,进行3D NAND Flash和DRAM两大内存扩产,让3D NAND存储器战火提前引爆。 市场正密切注意三星和美光的动作,担心DRAM涨势将提前画下句点。 SK海力士无锡厂主要以生产DRAM为主;另在南
[半导体设计/制造]
ICinsights:DRAM、<font color='red'>NAND</font>售价已暴涨一年
STM32 Flash 擦除 读写 成功
要点: 将数据写入flash之前,每次都要擦除,否则会写入不成功,出现的错误状态为:FLASH_Status=FLASH_ERROR_PG 写入数据成功后可以在Memory 中查看刚刚写入的数据,具体在Memory 窗口中输入:0x08010000,既可以看到此处的数据为 :Data = 0x15041979;//要写入的地址 擦除的起始地址与终止地址 #define StartAddr ((u32)0x08010000) #define EndAddr ((u32)0x0807ffff) //擦除 char IAP_Init()//初始化loaded 的flash { FLASHStatu
[单片机]
东芝闪存新厂08年将量产
全球第二大闪存制造商东芝周二表示,其位于日本西部的第四座厂房,12寸晶圆月产能在2008年下半年将达八万片。 东芝是全球第二大NAND闪存制造商,由于闪存价格急剧下降,公司的收入受到了打击。上财年公司出售了它的东芝陶瓷公司和其他部门,大约获得了550亿日元的收益。东芝上财年获得的运营利润为2550亿日元,比前一财年增长了6%,其中芯片业务的收入大约占到一半。 此外,东芝新建的微晶片厂已竣工,预计07年12月将投产,以力图追赶其竞争对手韩国三星电子。
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved