[ZLG-ARM] MDK下向S3C2440 nand flash烧写程序程的实现

[复制链接]
6683|3
 楼主| arminfo 发表于 2009-6-22 14:16 | 显示全部楼层 |阅读模式
当大家看到题目时也许会觉得很简单,用J-LINK来烧写程序到NAND&nbsp;FLASH很简单,我想说的是,如果是学习,那么就应该不光要知其然,更要知其所以然。如果你是老手,建议就不要看下去了,因为这块你已经熟悉的不能再熟悉了,而对于新手来说的确很有用。<br /><br />注:所使用的开发环境为Keil&nbsp;MDK&nbsp;3.50,需要了解的部分有Bootloader,分散加载<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一工作任务<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、向S3C2440&nbsp;NAND&nbsp;FLASH烧写程序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这点对ARM入门的人来说都不是件难事。先说说我的硬件配置吧,64M&nbsp;NAND&nbsp;FLASH,64M&nbsp;SDRAM,2M&nbsp;NOR&nbsp;FLASH。当程序下载到NAND&nbsp;FLASH时,系统上电运行后由NAND&nbsp;FLASH的控制器把前4K程序拷贝到SRAM来运行。如果程序大于4K,那么仅仅把程序下载到NAND&nbsp;FLASH中是不能完全运行的,这是因为程序不能在NAND&nbsp;FLASH中运行,必须利用SRAM把程序从NAND&nbsp;FLASH搬移到SDRAM中,搬移过程完成后再把PC指向SDRAM中的程序所放置的起始位置,此时bootloader的使命才算完成。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、<br />Bootloader的编写<br />要实现上述功能,必须编写一个小于4K的启动或者Bootloader程序。在Bootloader中应包含有中断向量表,异常向量表,时钟初始化,SDRAM初始化,GPIO及堆栈初始化等工作,另外还要有相应的代码将程序从NAND&nbsp;FLASH搬移到SDRAM的功能。<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、<br />程序下载<br />虽然实现了Bootloader,也将其下载到了NAND&nbsp;FLASH中,也可以将程序从NAND&nbsp;FLASH搬移到SDRAM中,并且将PC交给SDRAM的程序首地址处,但程序并不能正确运行。为什么呢?这是因为下载到NAND&nbsp;FLASH的可执行程序中包含有绝对地址,尽管程序从NAND&nbsp;FLASH搬移到了SDRAM中,但当运行到绝对地址是,程序就会跑飞,从而不能正确运行。那么如何解决这个情况呢?<br />有一个办法:先将程序基于SDRAM的地址编译好,然后下载到NAND&nbsp;FLASH中,再通过Bootloader将程序搬回到SDRAM中,这样所有的地址都是相对于SDRAM的了,程序可以正确运行。但遗憾的是,MDK实现不了这种方法,因为MDK生成的*.axf文件带有地址信息。使用分散加载文件生成的映像文件是基于某一地址,由必须下载到FLASH的相应地址,如果要基于SDRAM某一地址编译生成的*.axf文件下载到NAND&nbsp;FLASH时,MDK会提示出错,找不到烧写算法。<br />如果不生成带地址信息的文件,就可以解决这个问题。在MDK下不能直接生成bin,要在Run&nbsp;User&nbsp;Programs&nbsp;After&nbsp;Build/Rebuild框中的Run#1后面的文本中输入C:KeilARMBIN31fromelf.exe&nbsp;–bin&nbsp;–o&nbsp;./output/Axf_To_Bin.bin&nbsp;./output/Axf_To_Bin.axf命令转化成bin格式的文件。然后将bin下载到SDRAM中,再搬移到NANK&nbsp;FLASH中,剩下的就由bootloader来完成了,整个过程虽然比较麻烦,但是MDK下最有效的方法。<br /><br /><br /><br />二&nbsp;实现过程<br /><br />(1)Bootloader主要是进行一些硬件初始化,以及将程序从NAND搬移到SDRAM中。Bootloader程序的编译比较简单,在Target页配置一下RO和RW的读写域,设置ROM1起始地址为0,大小为0x1000,在RAM1设置起始地址为0x30800000,因为bootloader要把程序搬移到0x30000000处运行,为了避免用户程序将bootloader的RW段覆盖,故先留下足够的空间来存放用户程序。程序可以用USB下载到SDRAM中,这里要说明一下,用户程序要用到分散加载文件,即起始地址为0x30000000,<br /><br />下面介绍一下bootloader的烧写过程:<br /><br /><br /><br /><br />1.JPG<br /><br /><br />FLASH的下载方式我不再说了,如果手头有J-LINK可以使用,如果没有也可以使用JTAG小板下载,也可以用MDK来下载都行,总之能下载到NAND&nbsp;FLASH中就行。这一步是前提。<br />(2)USB下载实现<br />可以使用dnw软件来下载,非常方便,要注意的是,用户自己写的程序中要加入一段到NAND&nbsp;FLASH的write函数,实现将文件从SDRAM到flash的搬移功能。<br />&nbsp;&nbsp;l<br />编译例程生成.bin文件<br />&nbsp;&nbsp;用户程序中要使用分散加载文件,如下:<br />LR_ROM1&nbsp;0x30000000<br />{<br /><br />;&nbsp;load&nbsp;region<br /><br />ER_ROM1&nbsp;0x30000000&nbsp;0x0800000<br />{<br />;&nbsp;load&nbsp;address&nbsp;=&nbsp;execution&nbsp;address<br /><br />*.o&nbsp;(RESET,&nbsp;+First)<br /><br />*(InRoot$$Sections)<br /><br />.ANY&nbsp;(+RO)<br /><br />}<br /><br />RW_RAM1&nbsp;0x30800000&nbsp;0x0800000<br />{<br />;&nbsp;RW&nbsp;data<br /><br />.ANY&nbsp;(+RW&nbsp;+ZI)<br /><br />}<br /><br />RW_IRAM1&nbsp;0x40000000&nbsp;0x00001000<br />{<br /><br />.ANY&nbsp;(+RW&nbsp;+ZI)<br /><br />}<br />}<br />上面写的很清楚,用户程序代码放到0x30000000位置处,与Bootloader的RW段没有冲突。<br />&nbsp;&nbsp;l<br />运行USB程序<br />首先连接好USB线,打开超级终端DNW,接着在RAM中调试运行USB程序。第一次运行该程序时,会提示驱动安装对话框,将安装路径指向到usb例程目录的USB驱动文件夹点击确认安装即可。<br /><br />运行程序后,在超级终端上显示如下信息:<br /><br /><br /><br /><br />3.JPG<br /><br /><br /><br /><br />打开Configration选择下载地址:<br /><br /><br /><br /><br />4.JPG<br /><br /><br />&nbsp;&nbsp;&nbsp;l<br />使用bootloader运行例程<br />用USB下载完例程的.bin文件后,该文件就被自动搬移到了nand&nbsp;flash,这时就可以关闭USB程序了。按动开发板上的复位键,刚下载到nand&nbsp;flash的程序就可以运行了。<br /><br /><br /><br /><br /><br />5.JPG<br /><br /><br /><br />至此,用户自己编写的程序已经下载到NAND&nbsp;FLASH中,只要将开发板重启一下,Bootloader就会把放在NAND&nbsp;FLASH中的程序拷贝到SDRAM的&nbsp;0x30000000处,完成后并把PC给SDRAM。好了,你自己的程序已经成功运行下来了。<br />程序源代码如下:<br /><br /><br />&nbsp;<br /> &nbsp;&nbsp;<br />已经编译好的bin文件2440bin.rar&nbsp;(文件大小:291K)<br />基于S3C2440的启动文件,根据个人需要可自行修改bootloader_2440.rar&nbsp;(文件大小:66K)<br />用户程序usbdownload.rar&nbsp;(文件大小:394K)<br /><br />&nbsp;<br /> &nbsp;&nbsp;<br />
miclinux 发表于 2009-6-24 13:09 | 显示全部楼层

有些不详细啊

  
cheng105 发表于 2011-5-16 16:02 | 显示全部楼层
图呢?
lixin_bipt 发表于 2011-5-31 11:20 | 显示全部楼层
软件在哪里下载啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

47

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部