S3C2440内存初始化

发布者:GoldenHarmony最新更新时间:2018-07-22 来源: eefocus关键字:S3C2440  内存初始化 手机看文章 扫描二维码
随时随地手机看文章

分三部分说明: 
①2440地址空间 
②内存与芯片硬件连接 
③存储控制器寄存器

S3C2440地址空间

S3C2440对外提供27根地址线,单靠芯片上的27根引脚,它只能访问128M的外设空间。 
为了扩大外设的访问范围,S3c2440芯片又提供了8个片选信号nGCS0~nGCS7,对应Bank0-Bank7。当某个片选信号nGCSx有效时,则可以通过27根地址线去访问对应这个片选的128MB空间。当访问BANKx的地址空间时,nGCSx引脚输出低电平来选中外接设备。由于有8个片选,所以2440芯片能访问的外设空间总为8*128MB=1GB.而1G(0x40000000)以上的空间,则安排给了2440内部的寄存器,访问这些内部的寄存器,则是通过32位的处理器内部总线来完成的。

S3C2440外设地址空间图:

这里写图片描述

一共8个片选,其中nGCS6,nGCS7为内存。

内存与芯片的硬件连接

BANK0-BANK5的连接方式类似,BANK6连接SDRAM时复杂一些,SDRAM内部是一个存储阵列,指定一个行,再指定一个列,就可以准确找到所需要的单元格,而SDRAM有4个逻辑表格(L-BANK),那么SDRAM的访问步骤为: 
1)CPU发出片选信号nSCS0(与nGCS6是同一引脚)有效,选中SDRAM芯片

2)SDRAM有4个L-BANK,需要两个地址信号来选中其中一个,即ADDR24、ADDR25,如下图

这里写图片描述

3)对被选中的芯片进行同一的行/列(存储单元)寻址 
根据SDRAM芯片的列地址线数目设置CPU相关寄存器后,CPU会从32位地址中自动分出L-BANK选择信号、行地址信号、列地址信号,然后先后发出行地址信号、列地址信号。L-BANK选择信号在发出行地址信号的同时发出,并维持到列地址信号结束。 
如上图:行地址、列地址公用地址线ADDR2-ADDR14,使用nSRAS(R=Row)、nSCAS(C=Column)两个信号来区分它们,当nSRAS信号有效时,ADDR2-ADDR14发出的是行地址,对应地址空间bit[23:11],当nSCAS信号有效时,ADDR2-ADDR14发出的是列地址,对应地址空间bit[10:2]。

4)找到存储单元后,被选中的芯片就要进行统一的数据传输。 
开发板使用两片16bit的SDRAM芯片并联形成32位的位宽,与CPU的32根数据线DATA0-DATA31相连,BANK6的起始地址位0x30000000

存储控制器寄存器

存储控制器共有13个寄存器,BANK0-BANK5只需要设置BWSCON和BANKCONx两个寄存器,BANK6、BANK7外接SDRAM时,还要设置REFRESH,BANKSIZE,MRSRB6,MRSRB7,等4个寄存器,下面分别说明 
1)位宽和等待控制寄存器BWSCON 
BWSCON中每四位控制一个BANK,最高4位对应BANK7、接下来4位对应BANK6,依次类推。 
STx:启动/禁止SDRAM的数据掩码引脚 
WSx:是否使用存储器的WAIT信号 
DWx:设置对应BANK的位宽,0b00对应8位,0b01对应16位,0b10对应32位,0b11表示保留 
比较特殊的是BANK0,它没事ST0和WS0,DW0只读,由硬件跳线决定,0b01表示16位,0b10表示32位,BANK0只支持16、32两种位宽 
所以可以确定BWSCON寄存器值为:0x22000000

2)BANK控制寄存器BANKCONx(x为0-5) 
这些寄存器用来控制BANK0-BANK5外接设备的访问时序,使用默认0x0700即可

3)BANK控制寄存器BANKCONx(x为6-7) 
MT[16:15]:设置BANK外接ROM/SRAM还是SDRAM,00=ROM/SRAM,01=保留,10=保留,11=SDRAM 
MT=0b00时,与BANKCON0-BANKCON5类似 
MT=0b11时, 
Trcd[3:2]:RAS to CAS delay,从时序图可知为2 clocks,所以设为0b00 
SCAN[1:0]:SDRAM的列地址数,本开发板使用的SDRAM列地址数为9,0b00=8位,0b01=9位,0b10=10位 
所以本开发板,BANKCON6/7均设为0x00018001

4)刷新控制寄存器REFRESH 
REFEN[23]: 0=禁止SDRAM的刷新功能,1=开启SDRAM的刷新功能 
TREFMD[22]: SDRAM的刷新模式,0=CBR/Auto Refresh,1=SelfRefresh 
Trp[21:20]: SDRAM RAS预充电时间 00=2 clocks,01=3clocks,10=4clocks,11=不支持 
Tsrc[19:18]: SDRAM半行周期时间 00=4clocks,01=5clocks,10=6clocks,11=7clocks,SDRAM行周期时间Trc=Tsrc+Trp 
Refresh Counter[10:0]: SDRAM刷新计数,刷新时间=(2^11+1-refresh_count)/HCLK,使用PLL后时,HCLK=100MHz,刷新周期为7.8us 
refresh_count=2^11+1-100*7.8=1269 
REFRESH=0x008C0000+1269=0x008C04F5

5)BANKSIZE寄存器 
BURST_EN[7]: 0=ARM核禁止突发传输,1=ARM核支持突发传输 
SCKE_EN[5]: 0=不使用SCKE信号令SDRAM进入省电模式,1=使用SCKE信号令SDRAM进入省电模式 
SCLK_EN[4]: 0=时刻发出SCLK信号,1=仅在方位SDRAM期间发出SCLK信号 
BK76MAP[2:0]: 设置BANK6/7的大小,0b010=128MB/128MB,0b001=64MB/64MB,0b000=32M/32M,0b111=16M/16M,0b110=8M/8M,0b101=4M/4M,0b100=2M/2M 
本开发板外接64MB的SDRAM 
则本开发板BANKSIZE设为0xB1

6)SDRAM模式设置寄存器MRSRBx(x为6-7) 
CL[6:4]: 0b000=1clocks,0b010=2clocks,0b011=3clocks 
本开发板取0b011,所以MRSRB6/7取值为0x30

PS:Trcd,Trp的值可通过芯片手册的时序图查的;Tsrc通常取7个时钟。寄存器地址通过芯片手册查询。

汇编代码(利用循环来对寄存器赋值):

#define mem_contrl 0x48000000init_sdram:
    ldr r0, =mem_contrl 
    add r3, r0, #4*13
    adrl r1, mem_data0:
    ldr r2, [r1], #4
    str r2, [r0], #4
    cmp r0, r3
    bne 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 0x00000030123456789101112131415161718192021222324252627

ps:bne 0b表示不相等时跳回之前的0处。当标号为0~9的数字时,该标号是局部标号。局部标号可以重复出现,使用方法如下:

  • 标号f: 表示往前跳,顺序执行的话是没有运行过的程序 ,front的意思。

  • 标号b: 表示跳转到以前执行过的语句,第一个1标号处 ,back的意思。


关键字:S3C2440  内存初始化 引用地址:S3C2440内存初始化

上一篇:ARM中的中断向量表
下一篇:S3C2440 SDRAM寄存器初始化设置

推荐阅读最新更新时间:2024-03-16 16:09

变电所遥视监控系统研究
  1 引言   随着我国电网调度管理水平的不断提高, 许多地区电力通信网的建设取得了很大的进展,基本上实现了数字化通信。采用光纤、数字微波或无线扩频等通信方式,信道带宽和信道质量明显提高。而要全面直观地了解变电站的真实情况,远程视觉监控是必备的监控管理手段,它可在几十公里及更远之外的调度中心及时准确地掌握变电站的情况, 并对各种情况进行操作控制,做到真正的无人值守。   2 无人值班变电所运行现状   近年来, 随着电网规模的迅速扩大, 电力系统科技水平不断提高, 无人值守变电所的数量日益增加, 尤其随着变电所自动化程度的不断提高,非电气因素造成的事故比例越来越高。如何降低或避免这类事故的发生,已是实现无人值班变电所要解决
[单片机]
变电所遥视监控系统研究
S3C2440 测试程序(四) 外部中断实验
TQ2440板上将4个按键K1~K4分别接在4个外部中断口上: K1 ---- EINT1(GPF1) K2 ---- EINT4(GPF4) K3 ---- EINT2(GPF2) K4 ---- EINT0(GPF0) K5 ---- EINT5(GPF5)外接单片机的I/O口 主程序里初始化:KeyPort_Init(); 之后while(1) ; void KeyPort_Init(void) { rGPFCON = rGPFCON & ~((3 0)|(3 2)|(3 4)|(3 8)|(3 10))\ |((2 0)|(2 2)|(2 4)|(2 8)|(2 10)); //将GPF
[单片机]
C51、STM32和S3C2440中断体系的比较
/* 名称:C51、STM32和S3C2440中断体系的比较 说明:对于这三个芯片的中断体系来说,就我目前了解的, 我说:差不多。这里说的差不多,是中断的本质上差不多,都是首先中断源提出申请(比如触发了外部中断,定时器中断等),然后经过中断源屏蔽寄存器,再然后中断优先级的比较,最后CPU相应中断。(我去,这好像又回到了计算机组成原理啊)。 不同的是细节,C51作为低级一点的芯片,其中断少,中断能达到的功能也少,相对来说较为简单些(无论是设计还是具体使用)。而STM32和S3C2440来说,其提供的功能较多,设计起来和使用起来要复杂的多(使用的时候得配置好多好多寄存器)。 目前总结的,差不多就是这些吧。 */
[单片机]
s3c2440 外中断的按钮实现
根据TQ2440开发板的原理图,按键接的是S3C2440可用于外部中断的EINT0,1,2,4引脚,GPFCON可以设置这些引脚的功能。 EXTINT0寄存器可以设置这四个引脚的中断产生的条件,需要注意的是EINT0~2都有自己的中断向量,而EINT4~7则共用一个中断向量。 因此使用EINT4时还要在EINTMASK寄存器开相应中断允许位,进入EINT4中断后还要清EINTPEND寄存器的中断位。 以下是中断处理函数的流程图,这四个按钮实现的方法都一样: 以下是程序: /******************************* s3c2440外部中断按键实验 L
[单片机]
<font color='red'>s3c2440</font> 外中断的按钮实现
S3C2440 存储器地址映射
一、S3C2440存储控制器 如果大家写过S3C2440的ARM裸机程序都应该知道通常SDRAM的起始地址是0X30000000,但是大家有没有想过为什么呢?下面我将给大家做一个简要的介绍。 查S3C2440的手册可知S3C2440可寻址1G的地址范围,但是S3C2440的地址线只有27根,理论上只能寻址2的27次方等于128M的地址范围。于是S3C2440通过一个叫BANK的东东解决了这个问题。S3C2440引出了8根BANK线(对应nGCS0~ nGCS7),通过这个8根线来选通和关闭不同的存储器,这样S3C2440最多就可以连接8个128M的存储器,只要在某一时刻只选通一个BANK就可以实现1G的寻址空间每个BANK有个地址
[单片机]
<font color='red'>S3C2440</font> 存储器地址映射
s3c2440 nand flash 拷贝实验
首先明确一下我们的编程步骤。 (1)、加电在nand_flash加载boot.s中4K以内的程序。这4k将自动拷贝到SRAM(片内RAM)执行。 (2)、我们需要用这4k的程序实现nand-flash中4K以后的程序的拷贝(当然,拷贝到SDRAM基址为0x30000000处)继续执行(main.o部分的程序)。对于SDRAM的初始化和Watchdog的禁用已经在前一个实验中使用到了,这里就不再详细叙述。主要来看一下nand-flash的初始化和使用。 查阅一下s3c2440的空间布局。查看手册图Figure 5-1. S3C2440A Memory Map after Reset一目了然。 有8个banks
[单片机]
S3C2440裸机------从零实现用于裸机调试的printf函数
我们的C语言中有标准的printf,可以很方便的打印一些变量的值用于调试,在嵌入式开发中,我们通过串口实现我们自己的printf函数,将一些变量值通过串口打印出来。 1.printf函数介绍 首先看一下C语言中的printf函数中的格式字符,我们就是要实现下表中的几个格式字符。 然后看一下printf函数的声明,int printf(const char * format, ...); format: 表示固定参数, ...: 表示可变参数 2.手动确定可变参数 要实现printf函数,首先我们要知道怎么取到format和...所接受到的参数,我们取参数的依据就是:x86平台,函数调用时参数传递是使用堆栈来实
[单片机]
<font color='red'>S3C2440</font>裸机------从零实现用于裸机调试的printf函数
基于Linux和s3C2440的GPC控制器设计
  近年来,基于Internet的网络化控制系统已成为国内外测控领域研究的热点,在石油勘探开发、钢铁化工等领域有着广阔的应用前景。而控制器的设计和研发是整个网络控制系统的关键和核心。在一些地域高度分散以及环境恶劣的控制现场,使用嵌入式系统作为控制器节点,可更有利于多点分布式综合布控及并行处理,实现更好的测控效果。然而由于网络传输本身的特点,网络时延会不可避免地影响网络控制系统的控制性能和稳定性,因此本文提出基于S3C2440A及嵌入式Linux的GPC(Generalized PredictiveControl)控制器的设计方案,具有一定的通用性。    1 控制器硬件平台设计   控制器节点是嵌入式网络化测控系统的中心。
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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