原来程序是这样从NandFlash拷贝并跳转到SDRAM的

发布者:中和子最新更新时间:2021-10-14 来源: eefocus关键字:FL2440  SDRAM 手机看文章 扫描二维码
随时随地手机看文章

重新看了一下FL2440的BootLoader,终于把程序是怎样从Nandflash拷贝并跳转到SDRAM的过程弄清楚了,在这边做一下笔记。先上张图:

1.当S3C2440被配置成从Nand Flash启动时, S3C2440的Nand Flash控制器会在 S3C2440上电时自动把NandFlash上的前4K代码搬移到Boot Internal SRAM,然后系统从起始地址是0x0000_0000的Boot Internal SRAM启动,在这4K代码中我们必须完成CPU的核心配置,把NandFlash上的代码全部拷贝到SDRAM中去,然后跳转到SDRAM中去执行剩余的代码(进入操作系统等等);


2.这一步完成的是把NandFlash上的代码拷贝到SDRAM的过程:


(1)先判断是从nor启动还是从nand启动      


     ldr        r0,=BWSCON


             ldr        r0,[r0]


             ands     r0,r0, #6                  ;OM[1:0] != 0, NOR FLash boot


             bne      NORRoCopy           ;don't read nand flash


             adr       r0,ResetEntry          ;OM[1:0] == 0, NAND FLash boot // ADR 装载参照的地址=subr0,pc,#off_set;


             cmp      r0,#0                      ;if use Multi-ice,//JTAG调试时是直接下载到SDRAM中运行,不需要再从nand拷贝


             bne      InitRamZero            ;don't read nand flash for boot


注意哦,执行adr r0,ResetEntry 后,r0 = PC - off_set,adr得到是相对地址而不是绝对地址。ResetEntry是整个程序的入口处,由链接器指定入口地址,如下图,ResetEntry=RO Base=0x3001_0000即|Image

RO

RO

Base|。当程序在SDRAM中运行时,当前PC=0x3001_0000+off_set,r0=0x3001_0000,当程序在Boot Internal SRAM运行时,由于程序是从0x0000_0000开始运行的,所以当前PC=0x0000_0000+off_set,即r0=0x0000_0000。所以可以通过 cmp r0,#0来判断程序是否运行在Boot Internal SRAM,如果是,则把NandFlash中的程序拷贝到SDRAM。


(2)从NandFlash拷贝程序到SDRAM


在这步中最让我困惑的是在SDRAM中从哪个地址开始存放从NandFlash拷过来的程序。


;===========================================================

;//将程序从nandflash拷贝到sdram

;===========================================================

nand_boot_beg

            bl         ClearSdram

            mov      r5,#NFCONF

            ;set timing value

            ldr        r0,        =(7<<12)|(7<<8)|(7<<4)

            str        r0,        [r5]

            ;enable control

            ldr        r0,=(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0)

            str        r0,[r5, #4]

           

            bl         ReadNandID

            mov      r6,#0

            ldr        r0,=0xecF1

            cmp      r5,        r0

            beq      %F1

;           ldr        r0,=0xecda

;           cmp      r5,r0

            mov      r6,#1                            ;Nandaddr(寻址周期 0:4 1:5)

1         

            bl         ReadNandStatus

           

            mov      r8,#0

            ldr        r9,=ResetEntry

            mov r10,#32                              ;+081010 feiling


上面代码中最关键的是这句:


 ldr        r9,=ResetEntry


其它都是一些NandFlash的相关设置与操作细节,先不管了。这据代码中用ldr来获得在SDRAM存放代码的起始地址,ldr将ResetEntry的绝对地址|Image

RO

RO

Base|赋给了r9。也就是说,从NandFlash拷过来的代码放在了SDRAM中从|Image

RO

RO

Base|开始的地址空间里。


3.CPU配置完了,程序和数据也都拷到SDRAM里了,该跳转到SDRAM里去做其他事情了,怎么知道是否跳转到SDRAM呢?这还是地址啊。我之前一直搞不清楚为什么一句ldr pc,=CEntry和bl Main 就能从Boot Internal SRAM直接跳到SDRAM,原来在编译的时候,像ResetEntry和CEntry这些表示地址的标号都被赋于从|Image

RO

RO

Base|开始之后的地址,只要|Image

RO

RO

Base|大等于0x3000_0000,利用ldr取得绝对地址后赋给PC就能直接跳转到SDRAM里去了。我之前一直以为ResetEntry=0x0000_0000,而且分不清ldr和adr之间的差别,因此纠结了好久。  


ldr        pc,=CEntry                   ;goto compiler address

 

CEntry

            bl         Main                  ;Don t use main()because ......

            b          .


洗洗睡了,明天再看一下中断向量表。

关键字:FL2440  SDRAM 引用地址:原来程序是这样从NandFlash拷贝并跳转到SDRAM的

上一篇:Freestanding C与交叉编译器的生成原理分析
下一篇:s3c2440的2440init.s详解_补充

推荐阅读最新更新时间:2024-11-11 10:43

STM32F429 >> 22. FMC_扩展外部SDRAM(二)
FMC 简介 STM32F429 使用 FMC 外设来管理扩展的存储器,FMC 是 Flexible Memory Controller的缩写,译为可变存储控制器。 它可以用于驱动包括 SRAM、SDRAM、NOR FLASH 以及NAND FLSAH 类型的存储器。 在其它系列的 STM32 控制器中,只有 FSMC 控制器(Flexible Static Memory Controller),译为可变静态存储控制器,所以它们不能驱动 SDRAM这样的动态存储器,因为驱动 SDRAM 时需要定时刷新,STM32F429 的 FMC 外设才支持该功能,且只支持普通的 SDRAM,不支持 DDR 类型的 SDRAM。 FMC
[单片机]
STM32F429 >> 22. FMC_扩展外部<font color='red'>SDRAM</font>(二)
mini2440之S3C2410 SDRAM寄存器初始化设置
板子是s3c2410,使用两片容量为32MB、位宽16bit的HY57V561620CT-H芯片拼成容量为64M、32bit的SDRAM存储器。根据2410datasheet,要使用SDRAM需配置13个寄存器,以下逐个来看: 1、 BWSCON:Bus width & wait status control register总线位宽和等待状态控制寄存器。 此寄存器用于配置BANK0 – BANK7的位宽和状态控制,每个BANK用4位来配置,分别是: ● ST(启动/禁止SDRAM的数据掩码引脚。对于SDRAM,此位置0;对于SRAM,此位置1) ● WS(是否使用存储器的WAIT信号,通常置0为不使用) ● DW(两位,设置位宽
[单片机]
ARM9_S3C2440学习(六)SDRAM内存分配
SDRAM内存分配
[单片机]
smt32h750扩展sdram
STM32H750是STMicroelectronics推出的一款高性能微控制器,其特点之一是可扩展的SDRAM(同步动态随机存储器)接口。本文将详细介绍STM32H750扩展SDRAM的相关知识。 SDRAM是一种集成电路存储器,可以通过同步钟信号进行数据读写。与传统的静态随机存储器(SRAM)相比,SDRAM具有更高的存储密度和更低的成本。扩展SDRAM接口使得微控制器能够使用外部的SDRAM作为其存储器,极大地增加了存储容量。 首先,我们来看一下SDRAM的工作原理。SDRAM由若干存储单元组成,每个存储单元可以存储一个比特的数据。通过将地址信号和控制信号发送给SDRAM,可以实现数据的读写操作。为了实现高速读写,S
[单片机]
u-boot-2014.10移植(2)设置时钟/SDRAM
时钟修改 vim arch/arm/cpu/arm920t/start.S # if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) ldr r1, =0x3ff ldr r0, =INTSUBMSK str r1, /* FCLK:HCLK:PCLK = 1:2:4 */ /* default FCLK is 120 MHz ! */ ldr r0, =CLKDIVN mov r1, #5 str r1, /* add by Flinn */
[单片机]

推荐帖子

请问 socket 函数在仿真器中和在实际硬件中行为为何不同?
我刚接触wince,开发环境是pb5.0,evc4.0,套用《evc高级变成及其应用开发〉中的实例tcp客户端和服务器端,目标硬件用x86,sdk已生成并安装成功,已在实际硬件中成功实现了串口通讯,但在开发网口通讯时遇到了麻烦,在仿真器中一切正常,客户端和服务器端可以连接并传输数据,但在何时际硬件连接时,调试时运行到m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);这一语句就走不下去,好像是内存冲突,有那位遇到过类似的问题吗?请问
julyfeel 嵌入式系统
Helper2416-27——Linux_Programing——传输文件到目标版
Linux_Programing——传输文件到目标版参与Helper2416开发板助学计划心得学习Linux应用编程,却总是为怎么把在宿主机上编译好的文件传送到目标版运行而犯愁,一段琢磨后有了一个比较适合自身的解决方案,现在分享给大家!如果您有什么好的方法,请不吝赐教在《HELPER2416_V2开发板LINUX用户手册》中给我们介绍了如下几种传输方式:1:使用U盘传输文件2:使用SD卡传输文件3:使用串口传输文件4:
yuanlai2010 嵌入式系统
求串联型稳压电路的工作原理、有图
图就是这个、求大神帮忙分析下、这图的工作原理!!求串联型稳压电路的工作原理、有图这种电路虽然简单,但要说原理,也不说一句话能说完的。给个地址,,好好看看http://wenku.baidu.com/view/08ac34d149649b6648d7472e.html楼主电路是错的,Q3的CE反了,另外滤波电容的容量太小。哈哈,是啊,滤波电容100pF,太小了。是不是楼主忘了修改参数标注?
醒在寂静的夜 电源技术
城域网技术和解决方案(转)
MSTP毫无疑问是城域网技术和解决方案的热点。MSTP技术和对应的解决方案经过近3年的演进发展很快,MSTP的功能和内涵也在不断的丰富着,在即将到来的2004年中我们将会发现RPROverSDH以及内嵌Martini的MPLS功能离我们越来越近。  首先,MSTP技术和标准的变化。MSTP技术自从诞生之日起就一直在改进,在完善更多的如RPROverSDH等对IP业务的承载和处理后,MSTP即将提供例如IMA接口等以适应3G传送网的要求。对于RPROverSDH以及内嵌Martini的MPL
mdreamj RF/无线
28335 CAN时钟频率以及波特率问题?
这段是复制例程中的,感觉不太对啊,求大家指教。记得书上写的是:SYSCLKOUT是CAN模块系统的时钟频率,与CPU的时钟频率一样,那么对于150MHzSYSCLKOUT,CAN模块系统的时钟频率也应该为150MHz,那么下面这段的CANclock是什么意思?又是如何计算出来的?记得书上公式中有个SYSCLKOUT/2,那么对于红色部分,位速率=(150M/2)/10/15=500k才对啊,怎么会是1Mbps呢?/**************************
喜鹊王子 DSP 与 ARM 处理器
求助:仿真器不能连接的原因!F2812的
我用的是EEWORLD的F2812的实验板,但在仿真器连接过程中,老是报以下的错误信息:Errorconnectingtothetarget:Error0x80000200/-1037FatalErrorduring:OCS,PTI_ERR_EMU_CLOSEErrorOccuredat0x00000000SequenceID:0ErrorCode:-1037ErrorClass:0x80000200I/OPort=240Board
majiansong 微控制器 MCU
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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