NOR FLASH 和NAND FLASH 问题

来源:互联网 发布:淘宝被买家诈骗怎么办 编辑:程序博客网 时间:2024/05/17 03:48

Mini2440的启动时读取的第一条指令是在0x00上,分为成nand flash和nor flash上启动。 Nor flash的有自己的地址线和数据线,可以采用类似于memory的随机访问方式,在nor flash上可以直接运行程序,所以nor flash可以直接用来做boot,采用nor flash启动的时候会把地址映射到0x00上。mini2440就是直接把vivi直接烧录在nor flash上。 Nand flash是IO设备,数据、地址、控制线都是共用的,需要软件区控制读取时序,所以不能像nor flash、内存一样随机访问,不能EIP(片上运行),因此不能直接作为boot。Mini2440把Bootloader烧到nand flash上启动,因为在mini2440里有一个内置的SRAM,叫做stepping stone(垫脚石,很形象…),系统启动加电后,会把nand flash上的起始4KB的内容拷贝到SRAM里执行,这样就实现了从nand flash启动。如果bootloader小于4KB的话(像vboot),在SRAM里就能boot,大于4KB的话(u-boot,vivi),在SRAM里做一些基本初始化后,再把bootloader的剩余部分拷贝到SDRAM里(>0x30000000)。 你使用mini2440的时候,经常通过nor flash启动,进入vivi的菜单(mini2440的Nor flash已经烧录好了vivi),之后通过vivi的usb下载功能,把其他的bootloader下在到nand flash里,下载完成后,再通过nand flash启动,测试你的bootloader。 NOR flash适合做代码存储并EIP的,NAND适合用来作大量数据存储的。

一:地址空间的分配

1:s3c2440是32位的,所以可以寻址4GB空间,内存(SDRAM)和端口(特殊寄存器),还有ROM都映射到同一个4G空间里.

2:开发板上一般都用SDRAM做内存flash(nor、nand)来当做ROM。其中nand flash没有地址线,一次至少要读一页(512B).其他两个有地址线

3:nandflash不用来运行代码,只用来存储代码,NORflash,SDRAM可以直接运行代码)

4:s3c2440总共有8个内存banks

6个内存bank可以当作ROM或者SRAM来使用

留下的2个bank除了当作ROM 或者SRAM,还可以用SDRAM(各种内存的读写方式不一样)

7个bank的起始地址是固定的

还有一个灵活的bank的内存地址,并且bank大小也可以改变

5:s3c2440支持两种启动模式:NAND和非NAND(这里是nor flash)。

具体采用的方式取决于OM0、OM1两个引脚

OM[1:0所决定的启动方式

OM[1:0]=00时,处理器从NAND Flash启动

OM[1:0]=01时,处理器从16位宽度的ROM启动

OM[1:0]=10时,处理器从32位宽度的ROM启动。

OM[1:0]=11时,处理器从Test Mode启动。

当从NAND启动时

cpu会自动从NAND flash中读取前4KB的数据放置在片内SRAM里(s3c2440是soc),同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000)。cpu是从0x00000000开始执行,也就是NAND flash里的前4KB内容。因为NAND FLASH连地址线都没有,不能直接把NAND映射到0x00000000,只好使用片内SRAM做一个载体。通过这个载体把nandflash中大代码复制到RAM(一般是SDRAM)中去执行

当从非NAND flash启动时

nor flash被映射到0x00000000地址(就是nGCS0,这里就不需要片内SRAM来辅助了,所以片内SRAM的起始地址还是0x40000000). 然后cpu从0x00000000开始执行(也就是在Norfalsh中执行)。 

总结:

Arm的启动都是从0地址开始,所不同的是地址的映射不一样。在arm开电的时候,要想让arm知道以某种方式(地址映射方式)运行,不可能通过你写的某段程序控制,因为这时候你的程序还没启动,这时候arm会通过引脚的电平来判断。 

1当引脚OM0跟OM1有一个是高电平时,这时地址0会映射到外部nGCS0片选的空间,也就是Norflash,程序就会从Norflash中启动,arm直接取Norflash中的指令运行。 

2当OM0跟OM1都为低电平,则0地址内部bootbuf(一段4k的SRAM)开始。系统上电,arm会自动把NANDflash中的前4K内容考到bootbuf(也就是0地址),然后从0地址运行。

这时NANDFlash中的前4K就是启动代码(他的功能就是初始化硬件然后在把NANDFlash中的代码复制到RAM中,再把相应的指针指向该运行的地方) 

    为什么会有这两种启动方式,关键还是两种flash的不同特点造成,NOR FLASH容量小,速度快,稳定性好,输入地址,然后给出读写信号即可从数据口得到数据,适合做程序存储器。NAND FLASH 总容量大,但是读写都需要复杂的时序,更适合做数据存储器。这种不同就造成了NORflash可以直接连接到arm的总线并且可以运行程序,而NANDflash必须搬移到内存(SDRAM)中运行。 

   在实际的开发中,一般可以把bootloader烧入到Norflash,程序运行可以通过串口交互,进行一定的操作,比如下载,调试。这样就很可以很方便的调试你的一些代码。Norflash中的Bootloader还可以烧录内核到Norflash等等功能

AXF分区命名

    一般的C程序对于程序分区,一般采用TEXT/BSS/DATA这样的分区.Gcc 的编译程序文件成功后,最后都会生一个.out或ELF格式的可执行文件,这个文件通常都包含三个段.text,.data和.bss段,运行时,会在进程空间会生成.text,.data.bss和stack,heap五个区.  

  AXF对于不同程序的分区采用另外命名.跟GCC程序对应,ADS编写的程序也有两种状态,一个保存状态.对于ELF可执行文件,一种是运行态,对应进程空间分区.

   RO段:ReadOnly段的意思,可执行文件段,相当于GCC的text和rodata段

   RW段:ReadWrite段,数据段,相当于GCC中的Data段

   ZI段,ZeroInit段,未初始化数据段,相当于GCC中的BSS段,而且ZI是RW的一部分。

   对于裸机程序,一般在链接时要指定 --ro-base,即RO段的起始地址,一般它就是程序最开始段。

    因为RO段包含数据和代码,所以RO BASE不一定等于可执行程序的入口.有时ADS里通常还要手工指定 Image Entry Point,它即可以等于或大于RO BASE的地址


 

NOR FLASH 和NAND FLASH 问题 - xfb2020 - fengbo的博客
0 0
原创粉丝点击