您的位置 首页 产品

ARM裸机开发bootloader内存初始化

一、从内部看内存内存由于其访问速度快,访问方式简单成为PC机与嵌入式设备不可缺少的部件。1、内存的分类内存分为DRAM和SRAM,其中DRAM又…

一、从内部看内存

内存咱们其拜访速度快,拜访方法简略成为PC机与嵌入式设备不行短少的部件。

1、内存的分类

内存分为DRAM和SRAM,其间DRAM又包括SDRAM、DDR、DDR2。

DRAM:它的根本部件是小电容电容能够再两个极板上保存电荷,可是需求定时的充电(改写),不然数据就好丢掉。缺陷:要进行不断的改写才干坚持数据,存取速度较慢。

SRAM:它是一种具有停止存取功用的内存,不需求定时改写电路就能坚持它们内部存储的数据。其长处:存取的速度快;可是缺陷是:功耗大,本钱高。常用于存储容量不高,但存取速度快的场合,比方stepping stone。

DRAM的分类:在嵌入式体系中,除了CPU内部的垫脚石选用SRAM外,板载内存一般会选用DRAM,而DRAM又能够分为SDRAM,DDR,DDR2等。

SDRAM(Synchronous Dynamic Random Access Memory):同步动态随机存储器

同步:内存作业需求同步时钟,内部指令的发送与数据的传输都以该时钟为基准。

动态:存储阵列要不断坚持改写来确保数据不丢掉。

随机:数据不是线性顺次存储,而是自在指定地址进行数据读写。

2440运用的是SDRAM

DDR:(Double Data Rate SDRAM),即“双倍速率同步动态随机存储器”。与早上的SDRAM比较,DDR除了能够在时钟脉冲的上升沿传输数据,还能够在下降沿传输信号,这就意味着在相同的作业频率下,DDR的理论传输速度为SDRAM的两倍。DDR2则在DDR的基础上再次进行了改善,使得数据传输速率在DDR的基础上再次翻倍。

6410开发板一般选用DDR内存

210开发板一般选用DDR2内存

2、内存的内部结构

内存的内部结构包括三项内容:表结构、L-Bank、寻址信息

2.1内存的内部好像表格,数据就寄存在每个单元格中。数据读写时,先指定行号(行地址),再指定列号(列地址),咱们就能够精确地找到所需求的单元格。而这张表格称为:Logical Bank(L-Bank)。

咱们技能、本钱等原因,一块内存不行能把一切的单元格做到一个L-Bank,现在内存内部根本都会分割成4个L-Bank。

内存的寻址有三个重要因素:1、L-Bank挑选信号 2、行地址 3、列地址

二、内存初始化

1、2440

关于这部分内容,接下来要从以下四个方面来论述:1、地址空间2、内存芯片的硬件衔接3、存储操控寄存器的设置4、编写代码进行内存初始化设置

1、S3c2440芯片对外供给的引脚上,只给出了27根地址线Addr[0:26]。单靠芯片上的27根引脚,它只能拜访128M的外设空间。为了扩展外设的拜访规模,S3c2440芯片又供给了8个片选信号nGCS0-nGCS7.当某个片选信号nGCSX有用时,则能够经过27根地址线去拜访对应的片选的128MB空间。咱们有8个片选,所以2440芯片能拜访的外设空间总共为8*128MB=1GB。而1G(0x40000000)以上的空间,则组织给了2440内部的寄存器,拜访这些内部寄存器,则是经过32位的处理器内部总线来完结的。

ARM9核不知道内存、NorFlash、网卡芯片寄存器地址,而是经过存储器操控器来进行解析,然后使得ARM核能够经过存储操控器寄存器来设置拜访外设寄存器。

2、S3c2440有32根数据线引脚,两片32M的内存芯片并联在数据线的高、低位上。所以说2440的数据是32位的。

3、设置2440存储操控寄存器,参阅2440的芯片手册进行设置。

BWSCON 0x22000000

BANK CON0-5 坚持不变,为0x00000070.咱们0-5不寄存内存。只要6-7才寄存了内存。

在计算机中,RAM一般用于内存。ROM用来寄存一些硬件的驱动程序,也便是固件。

咱们平常用的U盘为Flash。它能够在相同的电压下读写,且容量大,本钱低。而ROM一般读为5V,写12V。

BANK6-7 0x18001

REFRESH 定时充电

BANKSEZE

MRSRB6-7

对以上的一切寄存器进行完初始化后,内存操控器的一切寄存器就都进行了初始化。

4、代码编写:

咱们数据和寄存器比较多,所以运用循环把相应的数据存入各个寄存器。

#define mem_contrl 0x48000000init_sdram:ldr r0, =mem_contrl add r3, r0, #4*13adrl r1, mem_data0:ldr r2, [r1], #4str r2, [r0], #4cmp r0, r3bne 0b /*一共向前跳转*/mov pc, lrmem_data:.long 0x22000000 .long 0x00000700.long 0x00000700.long 0x00000700.long 0x00000700.long 0x00000700.long 0x00000700.long 0x00018001.long 0x00018001.long 0x008c04f5.long 0x000000b1.long 0x00000030.long 0x00000030

介绍一下汇编语言中的拜访存储器 [r1] 便是取出r1地址处的内容,实践便是指针操作。

6410:

1、地址空间:S3C6410处理器具有32位地址总线,其寻址空间为4GB。其间高2G为保存区,低2G区域又可分为两部分:主存储区和外设存区。

2、主存储区又分为:

发动镜像区:这个区域的效果正如它的姓名所述,是用来发动ARM体系的。可是这个区域并没有固定的存储介质与之对应。而是经过修正发动选项,把不同的发动介质映射到

该区域。比方说挑选了IROM发动方法后,就把IROM映射到该区域。

内部存储区:这个区域对应着内部的内存地址,iROM和SRAM都是散布在这个区间。0x08000000-0x0bffffff对应着内部ROM,可是IROM实践只要32KB,挑选从IROM发动的时分,首要运转便是这儿面的程序BL0,这部分代码由三星固化。0x0c000000-ox0fffffff对应内部SRAM,实践便是8KB的Steppingstone。

静态存储区:这个区域用于拜访挂在外部总线上的设备,比方说NOR flash、oneNand等。这个区域被分割为6个bank,每个bank为128MB,数据宽度最大支撑16bit,每个bank由片选Xm0CS[0]-Xm0CS[5]选中。

动态存储区:该区域从0x50000000-0x6fffffff,又分为2个区间,别离占256MB,能够片选Xm1CS[0]-Xm1CS[1]来进行着2个区间的挑选。咱们6410开发板上256MB的DDR内存就组织在这个区域,这也便是为什么6410的内存地址是从0x50000000开端的原因。

2、内存芯片的衔接能够参阅2440

3、代码编写:

咱们这部分代码量比较大,所以我把这部分独自放在了一个文件下并命名为

mem.S,并要在makefile中做相应的修正

.text.global mem_initmem_init:@set data pin;ldr r0, =0x7e00f120 mov r1, #0x0str r1, [r0]@program memc_cmd to b100,which makes DRAM Controller enter Configstate.	ldr r0, =0x7e001004 mov r1, #0x4         str r1, [r0]ldr r0, =0x7e001010  ldr r1, =( ( 7800 / ( 1000000000/133000000 ) + 1 ) )      str r1, [r0]ldr r0, =0x7e001014  mov r1, #(3 << 1)str r1, [r0]ldr r0, =0x7e001018  mov r1, #0x1str r1, [r0]ldr r0, =0x7e00101c  mov r1, #0x2str r1, [r0]ldr r0, =0x7e001020   ldr r1, =( ( 45 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001024  ldr r1, =( ( 68 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001028  ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e00102c  ldr r1, =( ( 80 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001030   ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001034   ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001038   ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) )@  ldr r2, [r0]str r1, [r0]ldr r0, =0x7e00103c   mov r1, #0x07str r1, [r0]ldr r0, =0x7e001040   mov r1, #0x02str r1, [r0]ldr r0, =0x7e001044   ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001048   ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e00100c   ldr r1, =0x00010012   str r1, [r0]ldr r0, =0x7e00104c   ldr r1, =0x0b45str r1, [r0]ldr r0, =0x7e001200   ldr r1, =0x150f8str r1, [r0]ldr r0, =0x7e001304   mov r1, #0x0str r1, [r0]@Issue NOPldr r0, =0x7e001008 ldr r1, =0x000c0000str r1, [r0]@prechargeallldr r1, =0x00000000str r1, [r0]@Autorefreshldr r1, =0x00040000str r1, [r0]@Autorefreshldr r1, =0x00040000str r1, [r0]@mrsldr r1, =0x000a0000str r1, [r0]@mrsldr r1, =0x00080032str r1, [r0]ldr r0, =0x7e001004mov r1, #0x0str r1, [r0]check_dmc1_ready:ldr r0, =0x7e001000 ldr r1, [r0]mov r2, #0x3and r1, r1, r2cmp r1, #0x1bne check_dmc1_readynopmov pc, lr

210:

1、地址空间

1、210有4G的寻址空间,内存地址从0x20000000开端,0地址处为映射区,体系从此开端。

2、210选用的芯片是8bit的4个内存芯片(128M)。

其间DRAM0为512M

DRAM1为1G。

正告:当编写代码时,假如能够坚持默认值不变,就把寄存器设置为默认值。

4、代码的编写部分能够参阅210的芯片手册或U-Boot中的代码。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/265159.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部