为什么指定了SDRAM,程序却烧写到了Nand flash?

转载 2017年12月12日 00:00:00

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

在刚开始学习ARM9的裸机编程和Linux系统移植的时候,烧写Nand flash内存的时候对一些指定的地址产生了疑惑。


看过很多教学视频,他们在烧写程序到Nand flash的时候一般会指定一个地址0X3000_0000,而S3C2440的官方手册上指明了0X3000_0000地址对应的片内外设是SDRAM。这不禁让人产生疑问:明明是指定了SDRAM却烧写到了Nand flash,这到底是为什么呢?


要解答这个问题,首先要从Nand flash本身的结构说起。Nand flash的结构和RAM不一样,它的数据线是复用的,内与足够的地址线用来寻址,对于它的数据存取通常是以块为单位。这一点跟Nor flash不一样,Nor flash带有RAM接口,有足够的地址线进行寻址,所以CPU可以访问Nor flash内部的每一个字节,程序可以在nor flash中运行,而Nand flash不行,所以Nand flash中的程序想要运行必须拷贝到内存(一般是SDRAM)当中来。


当我们想烧写程序至Nand flash中时,会借助一个“中转站”,既SDRAM。程序先烧写到SDRAM中(这就是指定0X3000_0000地址的原因),然后在从SDRAM中拷贝到Nand flash中去,而这个拷贝工作由实现烧写到Nor flash中的uboot程序引导完成。

 

此外,当我们向2440开发板移植Linux系统的时候,要向Nand flash烧写三个文件,分别是:uboot、Linux kernel和文件系统。每一步的烧写也跟前面一样借用SDRAM作为烧写的“中转站”。但是,我们在烧写的时候并没有对每一步的烧写地址做特定的处理,那怎么能够保证写着三个文件的时候后面的不会覆盖前面的呢?个人理解是:还是Nor flash中的uboot程序的功劳,它会引导着三个文件分别拷贝到Nand flash的不同位置中。


那么说完了Nand flash烧录的问题,自然而然就应该说一下Nand flash中程序运行的问题。前面我们说到,Nand flash中不可以执行程序,而在我们选择从Nand flash启动的时候,S3C2440会自动将Nand flash的前4KB的代码拷贝到内存当中一个Stepping Stone(一般称为垫脚石)的片内内存当中(这一步操作由芯片内部的硬件决定,不用我们操心),PC跳转到0地址去执行这些代码。


但是这个片内内存只有4KB,当我们在Nand flash中的程序大于4KB的时候怎么办呢?


这时候就是这最先拷贝过去的4KB代码发挥作用的时候了。这4KB的代码会帮我们初始化SDRAM,然后将Nand flash中剩下的代码一并拷贝到SDRAM中,PC跳转到SDRAM中去执行剩下的程序(所以我们的裸机程序一般不会超过4KB)。


虽然说烧写只有短短的几步,但是其中蕴含的知识点还是蛮多的,这或许也就是嵌入式的特点吧。

640?

0?wx_fmt=jpeg

1.《单片机与嵌入式系统应用》12月电子刊新鲜出炉~

2.CPU和GPU擅长和不擅长的地方

3.Python是这样调用matlab程序的!

4.写了 15 年代码,总结出提升 10 倍效率的三件事

5.电子爱好者向电子工程师进阶,你需要做些什么?

6.C++17 标准正式发布,以后开发者可更简单地编写和维护代码

0?wx_fmt=gif

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

关于S3C2440开发板Nand flash程序烧写和运行的一些理解

这两天刚开始学习ARM9的裸机编程和Linux系统移植,在烧写Nand flash内存的时候对一些指定的地址产生了疑惑。 我看过很多教学视频,他们在烧写程序到Nand flash的时候一般会指定一个地...
  • Liu_Jack
  • Liu_Jack
  • 2016年03月14日 13:11
  • 1993

ubifs烧写到nand flash中的几种方法

原文出处:http://blog.chinaunix.net/uid-20729605-id-2386476.html 作者:niutao.linux 折腾了好几天,突然柳暗花明,继而思之,发...
  • csdn66_2016
  • csdn66_2016
  • 2017年05月26日 14:40
  • 334

向nandflash中烧写内核和文件系统的方法

明天的一部分 QQ:318175542
  • yusiguyuan
  • yusiguyuan
  • 2013年07月24日 22:49
  • 2822

用uboot 烧写uboot linux内核 文件系统到nandflash的 过程以及bootm go命令启动与区别

文章结构 结构顺序有变化 -1:烧写uboot 0: bootargs bootcmd 命令参数的设置 1:制作yaffs2的过程 2:烧写yaffs2的过程 3:制作uimage 的过程...
  • u012075739
  • u012075739
  • 2014年09月23日 23:44
  • 1299

mini2440采用minitools工具烧写系统或裸机程序方法

主要介绍mini2440通过minitools工具烧录系统或裸机程序的步骤
  • u014449366
  • u014449366
  • 2016年10月18日 00:53
  • 2123

linux 对MTD分区nand flash的烧写和读取

使用mtd-utils工具实现对flash的升级分区的烧写yaffs2 yaffs2的格式是根据所使用的nandflash来制作的,不同的nandflash,得到的yaffs2是不一样的,具体可以参...
  • liqinghan
  • liqinghan
  • 2016年06月01日 22:08
  • 2422

使用JLink烧写bin文件到Mini2440

原文http://blog.chinaunix.net/uid-26019596-id-3434327.html  我自己有一个Mini2440的板子,我学习了Bootloader这一节,想做一...
  • lffpga
  • lffpga
  • 2014年03月27日 10:02
  • 953

DM36x使用串口和NAND启动完成NAND Flash烧写(一)

背景:项目进行到最后阶段,所有的启动都需要放到NAND Flash芯片上。但是由于硬件设计,没有添加网络和JTAG模块,所以常见的NFS和JTAG烧写方式失效。于是,我们需要寻找可行的烧录方式。平台:...
  • qq_36006553
  • qq_36006553
  • 2017年02月15日 23:37
  • 382

UBIFS分区制作 UBIFS烧写 启动 (转载)

相关命令工具 1.ubiattach version 1.0 - a tool to attach MTD device to UBI. Usage: ubiattach    [-m ] [-d ]...
  • muzi_csd
  • muzi_csd
  • 2014年02月28日 21:36
  • 1319

uboot烧写文件

* 此篇文章只介绍了往板子上烧写引导程序及系统,具体的詳細参数设置,或者是通过nfs方式引导系统并没有介绍,如有兴趣可参考Platform Group: 在我们的板子上通过NFS方式启动系统    ...
  • yiwuxue
  • yiwuxue
  • 2013年08月28日 16:54
  • 1166
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么指定了SDRAM,程序却烧写到了Nand flash?
举报原因:
原因补充:

(最多只允许输入30个字)