S3C2440完全开发流程.docx

上传人:李司机 文档编号:5534308 上传时间:2023-07-19 格式:DOCX 页数:154 大小:476.70KB
返回 下载 相关 举报
S3C2440完全开发流程.docx_第1页
第1页 / 共154页
S3C2440完全开发流程.docx_第2页
第2页 / 共154页
S3C2440完全开发流程.docx_第3页
第3页 / 共154页
S3C2440完全开发流程.docx_第4页
第4页 / 共154页
S3C2440完全开发流程.docx_第5页
第5页 / 共154页
点击查看更多>>
资源描述

《S3C2440完全开发流程.docx》由会员分享,可在线阅读,更多相关《S3C2440完全开发流程.docx(154页珍藏版)》请在三一办公上搜索。

1、S3C2440完全开发流程作者:2023-11-3一.简介3二.建立开发环境61、编译器62、Jflash-S3C2440:S3C2440芯片的JTAG工具73、安装GDB调试工具84、USB下载工具95、UBUNTU开发环境建立10三.S3C2440基础试验141、试验一:LED.ON142、试验二:LED_ON_C183、试验三:I/OPORTS225、试验五:MEMORYCONTROLLER306、试验六:NANDFLASHCONTROLLER377、试验七:UART438、试验八:PRINTFSCANF499、试验九:INTERRUPTCONTROLLER5010、试验十:TIMER6

2、111、试验H一:MMU6612、试验十二:CLOCK81四.BOOTLOADERVIVI881、阶段harchS3C2440head.S882、阶段2:INIT/MAIN.C911)、Step1:resetjandler()932)、Step2:board_init()953)、Step3:建立页表和启动MMU964)、Step4:heap_init()1025)、Step5:mtd_dev_init()1066)、Step6:init_privdata()1167)yStep7:misc()initJbuiltincmds()1178)Step8:boot_or_vivi()119五.附录

3、一Vl吩咐说明1341、HELP吩咐1342、MEM吩咐1353、LOAD吩咐1374、PARAM吩咐1395、PART吩咐1446、BOOT吩咐1467、BON吩咐148一.简介本书面对由传统51单片机转向ARM嵌入式开发的硬件工程师、由硬件转嵌入式软件开发的工程师、没有嵌入式开发阅历的软件工程师,本书开发板基于天嵌科技的TQS3C2440开发板,其官方网站为:,共分9个部分:1、开发环境建立2、S3C2440功能部件介绍与试验(含试验代码)3、BootIoaderViVi具体注释4、LinUX移植5、LinUX驱动6、YaffS文件系统详解7、调试工具8、GUl开发简介9、UC/0S移植通

4、过学习其次部分,即可了解基于ARMCPU的嵌入式开发所须要的外围器件及其接口。对应的试验代码实现了对这些接口的操作,这可以让硬件工程师形成一个嵌入式硬件开发的概念。这部分也可以当作S3C2440的数据手册来运用。一个完整的嵌入式IinUX系统包含4部分内容:Bootloader、Parameters、KerneRRootFileSystemo34、5、6部分具体介绍了这4部分的内容,这是LinUX底层软件开发人员应当驾驭的。通过学习这些章节,您可以具体了解到如何在一个裸板上裁减、移植LinUX,如何构造自己的根文件系统,如何编写适合客户需求的驱动程序驱动程序这章将结合几个经典的驱动程序进行讲解

5、。您还可以了解到在用在nandflash上的特别流行的yaffs文件系统是如何工作的,本书将结合yaffs代码具体介绍yaffs文件系统。第7部分介绍了嵌入式LinUX开发中运用gdb进行调试的具体过程。此文档目前完成了1、2、3部分,后面部分将接连完成。希望能对各位在嵌入式开发方面献上棉力。欢迎来信指出文中的不足与错误,欢迎来信探讨技术问题。Email:QQ:389658188二.建立开发环境1、编译器下载地址:执行如下吩咐安装:bunzip2arm-linux-gcc-3.4.1.tar.bz2tarxvfarm-linux-gcc-3.4.1.tar-C/生成的编译工具在书目下,修改et

6、cprofile,增加如下一行。这可以让我们干脆运行arm-linux-gcc,而不必将其肯定路径都写出来,不过这得重新启动后才生效:这个交叉编译器已经比较老旧,对于新版本的编译器我们有许多选择,如下表:表L常用交叉编译器编译器地址备注Crosstool-chain-0.43rkegel/crosstoolARM开源项目,自己编译天嵌编译器(举荐)CodeSourcerySourceryarm-none-linux-gnueabiRonetix-arm-Iinux主要针对AT91芯片,可参考友善编译器(举荐)内容较全,举荐!注:没有太多探讨Co血Sourcery的C编译器,这是/侬官方指定的编

7、译器,可以下载免费版本。Co龙Smmre的编译器对亍新手笨说可能不知如何配置,那幺茨有关系,可以到下载友善已经制作好的基亍CodeSourcery编译器。2、Jflash-S3C2440:S3C2440芯片的JTAG工具我们的第一个程序就是通过它下载到开发板上的norflash或者nandflash上去的。把它放到usrlocalbin书目下。下载地址:留意:步骤3您现在不必理睬,可以等进行到“调试”部分时再回过头来看。Jlink-v7假如手头有这个调试工具,那么运用起来会特别便利,而且支持ADS,MDK,IAR,下载速度远远高于并口JTAG小板,由于Jlink运用的是USB接口,对于没有并口

8、的本原来说无疑又是一大优点。3、安装gdb调试工具下载地址:A、执行如下吩咐安装:a.安装在主机上运行的arm-linux-gdb工具:tarxvzfgdb-6.3.tar.gzcdgdb6.3./configure-target=arm-linuxmakemakeinstall此时,在usrlocalbin中生成arm-linux-gdb等工具b.接着上面的步骤,安装gdbserver。须要将此工具下载到开发板上运行,这在后面会具体描述:Cdgdbserver./configurearm-linuxmake此时在当前书目中生成了gdbserver工具,当我们讲到如何调试时,会把这个文件下载到

9、开发板上去。B、LinUX程序的调试也可以运用图形界面,假如用的是UbUntU,那么可以先安装ddd如下吩咐:sudoapt-getinstallddd编译程序时加入.g参数,然后启动ddd生成目标文件进行图形程序调试,特别便利。4、USB下载工具Win平台:除了通过串口下载程序外,还可以运用USB来下载,速度比串口要快上百倍。常用的也是三星公司举荐的工具是DNW,目前各大开发板商已经推出自己的升级版本DNW,比如友善推出了增加备份功能的DNW,天嵌推出了汉化版的DNW,用起来会更便利。这里要留意的是USB驱动,假如用三星官方供应的驱动,那么会常常出现死机蓝屏现象,但是友善已经将驱动做了改进,

10、蓝屏现象得到修改。1.inUX平台:对于LinUX平台,好多人埋怨无法像在WIN下面那样下载便利。但是,国内的高手们已经将DNW移植到了LinUX平台上,常见的有两个版本,一个是字符模式版本,一个是GUl版本(基于QT),后者要自己编译,当然也可以运用编译好的二进制文件,前提是主机安装了QT,并用要在root用户下运行程序。对于调度工具,LinUX下也可以用Jlink,相关驱动可以去Segger官方下载驱动,不过只有字符模式。5、UbUntU开发环境建立系统安装:将分区作如下调整,一个根书目,一个交换分区,一个工作书目/work/swap5GIOGIG更改升级源:sudogeditetcats

11、ource.list一般状况下,国内比较好的源有重庆电子,北京交通,上海交通这些教化网资源,另外台湾那边速度也不错。安装必要工具:(l)vsftdsudoapt-getinstallvsftd酉己置:Write_enable=no改为Write_enable=yes将IOCaLenabIe=no改为IoCaLenbale=yes然后将服务配置重新启动一下:sudoetcinit.dvsftpdrestart(2)sshsudoapt-getinstallopenssh-server(3)NFSservicesudoapt-getinstallnfs-kernel-serverportmap配置

12、:打开etcexports,添加如下内容:/work/nfs_root*(rw,sync,no_root_squash)然后将服务重新启动一下:sudoetcinit.dnfs-kernel-serverrestart(4)安装二进制工具包sudoapt-getinstallbuild-essential语法词法分析sudoapt-getinstallbisonflex同上sudoapt-getinstallmanpages-dev/man-W(5)将下载好的交叉编译器安装到系统中一般状况下,要将编译器放到书目下,然后在bashrc中将编译器的环境变量加入其中,假如在终端中输入arm-none

13、-linux-gcc-V出现相应的版本信息,那么说明已经安装胜利。安装ncurses官方下载地址:下载源码,然后手工编译安装:CdworktoolsCdncurses-5.6./configure-with-shared-prefix=usrmakesudomakeinstall三.S3C2440基础试验本章将逐一介绍S3C2440各功能模块,并结合简洁的程序进行上机试验。您不必将本章各节都看完,完全可以看了一、两节,得到一个也许的印象之后,就起先下一章。本章可以当作手册来用。留意:了解S3C2440各部件最好的参考资料是它的数据手册。本文不准备翻译该手册,在进行必要的讲解后,进行实际试验这才

14、是本文的重点。1、试验一:LED_ONled_on.s只有7条指令,它只是简洁地点亮发光二极管LEDl。本试验的目的是让您对开发流程有个基本概念。试验步骤:a.把PC并口和开发板JTAG接口连起来、确保插上“BOOTSEL”跳线、上电(呵呵,废话,假如以后试验步骤中未特殊指出,则本步骤省略)b.进入LEDJDN书目后,执行如下吩咐生成可执行文件led_on:makec.执行如下吩咐将led_on写入nandflash:i .Jflash-S3C2440led_ont=5ii .当出现如下提示时,输入0并回车:K9S1208NDFlashJTAGProgranrnerVer0.00:K9S120

15、8Program1:K9S1208PrBIkPage2:ExitSelectthefunctiontotest:|iii当出现如下提示时,输入o并回车:AvaiIabletargetblocknumber:04095Inputtargetblocknut)er:!iii 当再次出现与步骤ii相同的提示时,输入2并回车d.按开发板上reset键后可望见LEDl被点亮了试验步骤总地来说分3类:编写源程序、编译/连接程序、烧写代码。先看看源程序led_on.s:.text.global_start_start:1.DRRO=0x56000010RO设为GPBCoN寄存器。此寄存器用于选择端口B各引脚

16、的功能:是输出、是输入、还是其他MOVR!,#0x00004000STRRl,RO设置GPB7为输出口1.DRRO=0x56000014Ro设为GPBDAT寄存器。此寄存器用于读/写端口B各引脚的数据MOVR!,#0x00000000此值改为OXOOOOOO80,可让LEDl熄灭STRR1,ROGPB7输出0,LEDI点亮MAIN_LOOP:BMAIN.LOOP对于程序中用到的寄存器GPBCoN、GPBDAT,我稍作描述,具体寄存器的操作可看试验三:I/OPORTSoGPBCON用于选择Pe)RTB的11根引脚的功能:输出、输入还是其他特殊功能。每根引脚用2位来设置:00表示输入、Ol表示输出

17、、10表示特殊功能、11保留不用。LED1-3的引脚是GPB7-GPB10,运用GPBCON中位12:13、13:14、15:16.17:18来进行功能设置。GPBDAT用来读/写引脚:GPBO对应位0、GPBl对应位1,诸如此类。当引脚设为输出时,写入0或1可使相应引脚输出低电平或高电平。程序很简洁,第4、5、6行3条指令用于将LEDI对应的引脚设成输出引脚;第7、8、9行3条指令让这条引脚输出0;第11行指令是个死循环。试验步骤b中,指令“make”的作用就是编译、连接IeCLOn.S源程序。Makefile的内容如下:led_on:led_on.sarm-linux-gcc-g-c-ol

18、ed_on.oled_on.sarm-linux-ld-Ttext0x0000000-gled_on.o-oled_on_tmp.oarm-linux-objcopy-Obinary-Sled_on_tmp.oled_onclean:rm-fled_onrm-fled_on.orm-fled_on_tmp.omake指令比较第1行中文件led_on和文件IeeLOn.s的时间,假如led_on的时间比IeCLon.s的时间旧(IeeLon未生成时,此条件默认成立),则执行第2、3、4行的指令更新led_on。您也可以不用指令make,而干脆一条一条地执行2、3、4行的指令但是这样多累啊。第2行

19、的指令是预编译,第3行是连接,第4行是把ELF格式的可执行文件IeCLonjmp.o转换成二进制格式文件led-on执行“makeclean”时强制执行6、7、8行的删除吩咐。留意:MakefiIe文件中相应的吩咐行前肯定有一个制表符(TAB)汇编语言可读性太差,现在请起先试验二,我用C语言来实现了同样的功能,而以后的试验,我也尽可能用C语言实现。2、试验二:LED_ON_CC语言程序执行的第一条指令,并不在main函数中。当我们生成一个C程序的可执行文件时,编译器总是在我们的代码前加一段固定的代码一一crtO.o,它是编译器自带的一个文件。此段代码设置C程序的堆栈等,然后调用main函数。很

20、惋惜,在我们的裸板上,这段代码无法执行,所以我们得自己写一个。这段代码很简洁,只有3条指令。CrtO.s代码:.text.global_startstart:IdrSP,=1024*4设置堆栈,留意:不能大于4knandflash中的代码在复位后会移到内部ram中,它只有4kblmain调用C程序中的main函数halt_loop:bhalt_loop现在,我们可以很简洁写出限制LED的程序了,led_on_c.c代码如下:#defineGPBCON(*(volatileunsignedlong*)0x56000010)#defineGPBDAT(*(volatileunsignedlong*

21、)0x56000014)intmain()GPBCON=0x00004000;/设置GPB7为输出口GPBDAT=0x00000000;令GPB7输出0return0;)最终,我们来看看Makefile:IeeLOn_c:crt.sled_on_c.carm-linux-gcc-g-c-ocrtO.ocrt.sarm-linux-gcc-g-c-oled_on_c.oled_on_c.carm-linux-ld-Ttext0x0000000-gcrtO.oled_on_c.o-oled_on_c_tmp.oarm-linux-objcopy-Obinary-Sled_on_c_tmp.oled

22、_on_cclean:rm-fled_on_crm-fled_on_c.orm-fled_on_c_tmp.orm-fcrtO.o第2、3行分别对源程序CrtO.s、led_on_c.c进行预编译,第4行将预编译得到的结果连接起来,第5行把连接得到的ELF格式可执行文件led_on_c_tmp.o转换成二进制格式文件led_on_c。好了,可以起先上机试验了:试验步骤:a.进入LED_ON_C书目后,执行如下吩咐生成可执行文件IeCLon_c:makeb.执行如下吩咐将led_on_c写入nandflash:i.Jflash-S3C2440led_on_ct=5ii当出现如下提示时,输入O并回

23、车:K9S1208NANDFlashJTAGProgrammerVer0.00:K9S1208Programl:K9S1208PrBlkPage2:ExitSelectthefunctiontotest:iii.当出现如下提示时,输入0并回车:Inputtargetblocknumber:iv当出现与步骤ii相同的提示时,输入2并回车c.按开发板上reset键后可望见LEDl被点亮了书目LEDS中的程序是运用4个LED从0到15轮番计数,您可以试试:a.进入书目后makeb. Jflash-S3C2440Iedst=5c. reset运行另外,假如您有爱好,可以运用如下吩咐看看二进制可执行文件

24、的反汇编码:arm-linux-objdump-D-bbinary-marmxxxxx(二进制可执行文件名)留意:本文的全部程序均在SoURCE书目中,各程序所在书目均为大写,其可执行文件名为相应书目名的小写,比如LEDS书目下的可执行文件为leds。以后不再赘述如何烧写程序:干脆运行JfIaSh-S3C2440即可看到提示。3、试验三:I/OPORTS请打开S3C2440数据手册第9章IO/PORTS,I/OPoRTS含GPA、GPB、GPH八个端口。它们的寄存器是相像的:GPXCoN用于选择引脚功能,GPxDAT用于读/写引脚数据,GPXUP用于确定是否运用内部上拉电阻(X为A、B、H,没

25、有GPAUP寄存器)。1、PORTA与PoRTB-H在功能选择方面有所不同,GPACON中每一位对应一根引脚(共23根引脚)。当某位设为0时,相应引脚为输出引脚,此时我们可以在GPADAT中相应位写入。或1让此引脚输出低电平或高电平;当某位设为1时,相应引脚为地址线或用于地址限制,此时GPADAT无用。一般而言GPACON通常设为全1,以便访问外部存储器件。PORTA我们短暂不必理睬。2、PORTB-H在寄存器操作方面完全相同。GPxCON中每两位限制一根引脚:OO表示输入、Ol表示输出、10表示特殊功能、11保留不用。GPXDAT用于读/写引脚:当引脚设为输入时,读此寄存器可知相应引脚的状态

26、是高是低;当引脚设为输出时,写此寄存器相应位可令此引脚输出低电平或高电平。GpxUP:某位为0时,相应引脚无内部上拉;为1时,相应引脚运用内部上拉。其他寄存器的操作在后续相关章节运用到时再描述;PORTA-H中引脚的特殊功能比如串口引脚、中断引脚等,也在做相关试验时再描述。书目KEY_LED中的程序功能为:当Kl-K4中某个按键按下时,LEDl-LED4中相应LED点亮。keyed.c代码:#defineGPBCON(*(volatileunsignedlong*)0x56000010)#defineGPBDAT(*(volatileunsignedlong*)0x56000014)#defi

27、neGPFCON(*(volatileunsignedlong*)0x56000050)#defineGPFDAT(*(volatileunsignedlong*)0x56000054)*LEDl-4对应GPB7-10*/#defineGPB7_out(1(7*2)#defineGPB8.out(1(8*2)#defineGPB9_out(1(9*2)#defineGPB10.out(l(10*2)*KI-K3对应GPFI-3K4对应GPF7*/#defineGPFlJn(3vv(l*2)#defineGPF2Jn(3vv(2*2)#defineGPF3Jn(3vv(3*2)#defineGP

28、F7Jn(3(7*2)intmain()/LED1-LED4对应的4根引脚设为输出GPBCON=GPB7_outGPB8_outGPB9_outGPB10_out;/KI-K4对应的4根引脚设为输入GPFCON&=GPFlJn&GPF2_in&GPF3Jn&GPF7Jn;while(l)若Kn为0(表示按下),则令LEDn为0(表示点亮)GPBDAT=(GPFDAT&0x0e)6)|(GPFDAT&0x80)ttt.s# arm-linux-objdump-D-bbinary-marmlinkttt2.sclean:rm-flinkrm-flink.orm-flink_tmp.o试验步骤:1

29、.进入书目LINK,运行make生成arm-linux-ld选项为u-TtextOXOOoOOOoo”的反汇编码ttts2 .makeclean3 .修改MakefiIe:将第4、7行的“#去掉,在第3、6行前加上“铲4 .运行make生成arm-linux-ld选项为“-Ttext0x30000000”的反汇编码ttt2.sIink.s程序中用到两种跳转方法:b跳转指令、干脆向PC寄存器赋值。我们先把在不同“一Ttext”选项下,生成的可执行文件的反汇编码列出来,再具体分析这两种不同指令带来的差异。ttt.s:ttt2.s0:eaffffffb0x40:eaffffffb0x44:e59ff

30、000Idrpc,pc,#0;Oxc4:e59ff000Idrpc,pc,#0;Oxc8:eafffffebx88:eafffffeb0x8c:00000008andeqr,r,r8c:30000008tsteqr,#8;0x8先看看b跳转指令:它是个相对跳转指令,其机器码格式如下:Cond101LOffset31:28位是条件码;27:24位为“101(F时,表示B跳转指令,为“1011”时,表示BL跳转指令;23:0表示偏移地址。运用B或BL跳转时,下一条指令的地址是这样计算的:将指令中24位带符号的补码马上数扩展为32(扩展其符号位);将此32位数左移两位;将得到的值加到PC寄存器中,即

31、得到跳转的目标地址。我们看看第一条指令bstepl的机器码eaffffff:1.24位带符号的补码为OXffffff,将它扩展为32得到:Oxffffffff2.将此32位数左移两位得到:Oxfffffffc,其值就是43.pc的值是当前指令的下两条指令的地址,加上步骤2得到的-4,这恰好是其次条指令StePI的地址各位不要被被反汇编代码中的“b0x4”给迷惑了,它可不是说跳到肯定地址0x4处执行,肯定地址得像上述3个步骤那样计算。您可以看到b跳转指令是依靠于当前PC寄存器的值的,这个特性使得运用b指令的程序不依靠于代码存储的位置即不管我们连接吩咐中“-TteXt”为何,都可正确运行。再看看其

32、次条指令IdrPc,=step2:从反汇编码“Idrpc,pc,#O可以看出,这条指令从内存中某个位置读出数据,并赋给PC寄存器。这个位置的地址是当前PC寄存器的值加上偏移值0,其中存放的值依靠于连接吩咐中的-text”选项。执行这条指令后,对于ttts,PC=OXOOoOOO08;对于ttt2.s,pc=0x30000008于是执行第三条指令bstep2”时,它的肯定地址就不同了:对于ttt.s,肯定地址为OXOOOOOo08;对于Ilt.s,肯定地址为0x30000008。ttt2s上电后存放的位置也是0,但是它连接的地址是0x30000000o我们以后会常常用到“存储地址和连接地址不同”

33、(术语上称为加载时域和运行时域)的特性:大多机器上电时是从地址0起先运行的,但是从地址0运行程序在性能方面总有许多限制,所以一般在起先的时候,运用与位置无关的指令将程序本身复制到它的连接地址处,然后运用向PC寄存器赋值的方法跳到连接地址起先的内存上去执行剩下的代码。在试验5、6中,我们将会作进一步介绍。arm-linux-ld吩咐中选项-Ttexf,也可以运用选项“-Tfilexxx”来代替,在文件filexxx中,我们可以写出更困难的参数来运用arm-linux-ld吩咐在试验6中,我们就是运用这种方法来指定连接参数的。5、试验五:MEMORYCONTROLLERS3C2440供应了外接Ro

34、M、SRAM、SDRAM、NORFlashNANDFlaSh的接口。S3C2440外接存储器的空间被分为8BANKS,每BANK容量为128M:当访问BANKX(X从O到7)所对应的地址范围(x*128M到(x+l)*128M-l,BANK67有略微差别,请参考下面第5点BANKSIZE寄存器的说明)时,片选信号nGCSx有效。本文所用的开发板,运用了64M的NANDFlaSh和64M的SDRAM:NANDFIaSh不对应任何BANK,它是通过几组寄存器来访问的,在上电后,NANDFlaSh起先的4k数据被自动地复制到芯片内部一个被称为“Steppingstone”的RAM上。StePPing

35、Stone被映射为地址0,上面的4k程序完成必要的初始化;SDRAM运用BANK6,它的物理起始地址为6*128M=OX30000000。请您打开S3C2440数据手册,第5章的图“Figure5-1.S3C2440XMemoryMapafterReSet”可让您一目了然。在起先下面内容前,假如您对SDRAM没什么概念,建议先看看这篇文章高手进阶,终极内存技术指南完整/进阶版。当然,不看也没关系,照着做就行了。此文链接地址:本试验介绍如何运用SDRAM,这须要设置13个寄存器。呵呵,别担忧,这些寄存器许多是类似的,并且由于我们只运用了BANK6,大部分的寄存器我们不必理睬:1. BWSCON:

36、对应BANKo-BANK7,每BANK运用4位。这4位分别表示:a. STx:启动/禁止SDRAM的数据掩码引脚,对jFSDRAM,此位为0;对于SRAM,此位为1。b. wsx:是否运用存储器的WArr信号,通常设为Oc. DWx:运用两位来设置存储器的位宽:00-8位,01-16位,10-32位,Il-保留。d.比较特殊的是BANKo对应的4位,它们由硬件跳线确定,只读。对于本开发板,运用两片容量为32Mbyte、位宽为16的SDRAM组成容量为64Mbyte、位宽为32的存储器,所以其BWSCON相应位为:0010。对于本开发板,BWSCON可设为0x22111110:其实我们只须要将B

37、ANK6对应的4位设为OOIO即可,其它的是什么值没什么影响,这个值是参考手册上给出的。2. BANKCONo-BANKCON5:我们没用到,运用默认值OXOOooO700即可3. BANKCON6-BANKCON7:设为OXoOoI8005在8个BANK中,只有BANK6和BANK7可以运用SRAM或SDRAM,所以BANKCON6-7与BANKCON0-5有点不同:a.MT(16:15):用于设置本BANK外接的是SRAM还是SDRAM:SRAM-ObOO,SDRAM-Obllb.当MT=ObIl时,还须要设置两个参数:TrCd(3:2):RAStoCASdelay,设为举荐值ObolSC

38、AN(l:0):SDRAM的列地址位数,对于本开发板运用的SDRAMHY57V561620CT-H,列地址位数为9,所以SCAN=Ob01。假如运用其他型号的SDRAM,您须要查看它的数据手册来确定SCAN的取值:00-8位,01-9位,IO-Io位4. REFRESH(SDRAMrefreshcontrolregister):设为0x008e0000+R_CNT其中R_CNT用于限制SDRAM的刷新周期,占用REFRESH寄存器的10:0位,它的取值可如下计算(SDRAM时钟频率就是HCLK):R_CNT=2111-SDRAM时钟频率(MHZ)*SDRAM刷新周期(US)在未运用PLL时,S

39、DRAM时钟频率等于晶振频率12MHz;SDRAM的刷新周期在SDRAM的数据手册上有标明,在本开发板运用的SDRAMHY57V561620CT-H的数据手册上,可望见这么一行8192refreshcycles/64ms:所以,刷新周期=64ms8192=7.8125uSo对于本试验,R_CNT=2111-12*7.8125=1955,REFRESH=0x008e0000+1955=0x008e07a35. BANKSIZE:0x000000b2位7=1:Enableburstoperation位5=1:SDRAMpowerdownmodeenable位4=1:SCLKisactiveonly

40、duringtheaccess(recommended)位2:l=010:BANK6、BANK7对应的地址空间与BANKo-5不同。BANKO-5的地址空间都是固定的128M,地址范围是(x*128M)到(x+l)*128M-LX表示0到5。但是BANK7的起始地址是可变的,您可以从S3C2440数据手册第5章“Table5-1.Bank6/7AddreSSeS”中了解到BANK6、7的地址范围与地址空间的关系。本开发板仅运用BANK6的64M空间,我们可以令位2:1=O10(128M/128M)001(64M/64M):这没关系,多出来的空间程序会检测出来,不会发生运用不存在的内存的状况后面

41、介绍到的bootloader和IinUX内核都会作内存检测。位、位3没有运用6. MRSRB6MRSRB7:0x00000030能让我们修改的只有位6:4(CL),SDRAMHY57V561620CT-H不支持CL=I的状况,所以位6:4取值为OlO(CL=2)或OIl(CL=3)。只要我们设置好了上述13个寄存器,往后SDRAM的运用就很简洁了。本试验先运用汇编语言设置好SDRAM,然后把程序本身从StePPingStOne(还记得吗?本节起先的时候提到过,复位之后NANDFIaSh开头的妹代码会被自动地复制到这里)复制到SDRAM处,然后跳到SDRAM中执行。本试验源代码在SDRAM书目中

42、,head.s开头的代码如下:bldisable_watch_dogblmemsetupblcopy_steppingstone_to_sdram跳到SDRAM中接着执行Idrpc,=Set_spset_sp:Idrsp,=0x34000000设置堆栈blmain跳转到C程序main函数halt_loop:bhaltloop为了让程序结构简洁一点,我都运用函数调用的方式。第一条指令是禁止WATCHDoG,您假如细心的话,肯定会发觉程序LEDS运行得有些不正常,那是因为WATCHDoG在不断地重启系统。以前为了程序简洁,我没有把这段程序加上去。往WTCoN寄存器(地址0x5300。Oo)写入0即

43、可禁止WATCHDOGo其次条指令设置本节开头所描述的13个寄存器,以便运用SDRAMo请您翻看试验四最终一段文字,往下程序做的事情就是:将StePPingStone中的代码复制到SDRAM中(起始地址为0x30000000),然后向PC寄存器干脆赋值跳到SDRAM中执行下一条指令Idrsp,=0x34000000o再往后的代码就和试验二、三一样了。最终我们来看看SDRAM书目下Makefile:sdram:head.ssdram.carm-linux-gcc-c-ohead.ohead.sarm-linux-gcc-c-osdram.osdram.carm-linux-ld-Ttext0x30000000head.osdram.o-osdram_tmp.oarm-linux-objcopy-Obinary-Ssdram_tmp.osdram请看第4句,是否和试验四联系起来了呢?遗忘的人请回头复习,不再罗嗦。在书目SDRAM下执行make指令生成可执行文件Sdram后,下载到板子上运行,可以发觉与LEDS程序相比,LED闪耀得更慢:这就对了,外部SDRAM的性能比起内部SRAM来说性能是差些。把程序从性能更好的内部SRAM移到外部SDRAM中去,是否多此一举呢?内部SRAM只有妹大小,假如我们的程序大于4k,那么就不能希望利用内部SRAM来运行

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号