S3C2410 SDRAM寄存器初始化设置

发布者:灵感发电站最新更新时间:2015-10-22 来源: eefocus关键字:S3C2410  SDRAM  寄存器  初始化设置 手机看文章 扫描二维码
随时随地手机看文章
几天前看初始化SDRAM代码时觉得比较困难,主要是因为之前没有接触过这方面,毫无经验,现在看来不难,麻烦在需要根据datasheet进行设置,好在是移植,很多强人的文章可参考。自己很容易忘事,就记录下来吧。


        我的板子是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(两位,设置位宽。此板子的SDRAM是32位,故将DW6设为10)

特殊的是bit[2:1],即DW0,设置BANK0的位宽,又板上的跳线决定,只读的。我这板子BWSCON可设置为0x22111110。其实只需将BANK6对应的4位设为0010即可。

2、 BANKCON0 – BANKCON7

用来分别配置8个BANK的时序等参数。SDRAM是映射到BANK6和BANK7上的(内存只能映射到这两个BANK,具体映射多大的空间,可用BANKSIZE寄存器设置),所以只需参照SDRAM芯片的datasheet配置好BANK6和BANK7,BANKCON0 – BANKCON5使用默认值0x00000700即可。

对于BANKCON6和BANKCON7中的各个位的描述:

(1)MT(bit[16:15]):设置本BANK映射的物理内存是SRAM还是SDRAM,后面的低位就根据此MT的选择而分开设置。本板子应置0b11,所以只需要再设置下面两个参数

(2)Trcd(bit[3:2]):RAS to CAS delay(00=2 clocks,01=3 clocks,10=4 clocks),推2410手册上的荐值是0b01。我们PC的BIOS里也可以调节的,应该玩过吧。

(3)SCAN(bit[1:0]):Column address number(00 = 8-bit,01 = 9-bit,10= 10-bit),SDRAM列地址位数。查阅HY57V561620CT-H芯片手册得知此值是9,所以SCAN=0b01。

综合以上各值,BANKCON6 – 7设为0x00018005。

3、 REFRESH:刷新控制寄存器。

此寄存器的bit[23:11]可参考默认值,或自己根据经验修改,这里用0x008e0000,关键是最后的Refresh Counter(简称R_CNT,bit[10:0])的设置,2410手册上给出了公式计算方法。SDRAM手册上“8192 refresh cycles / 64ms”的描述,得到刷新周期为64ms/8192=7.8125us,结合公式,R_CNT=2^11 + 1 – 12 * 7.8125 = 1955。所以可得REFRESH=0x008e0000+1995=0x008e07a3。

4、 BANKSIZE:设置SDRAM的一些参数。其中BK76MAP(bit[2:0])配置BANK6/7映射的大小,可设置为010 = 128MB/128MB或001 = 64MB/64MB,只要比实际RAM大都行,因为bootloader和linux内核都可以检测可用空间的。BANKSIZE=0x000000b2。

5、 MRSRB6、MRSRB7:Mode register set register bank6/7

可以修改的只有CL[6:4](CAS latency,000 = 1 clock, 010 = 2 clocks, 011=3 clocks),其他的全部是固定的(fixed),故值为0x00000030。这个CAS在BIOS中应该也设置过吧,对PC的速度提升很明显哦J

    至此,13个寄存器全部配置好了,下面就可以把代码复制到SDRAM中执行了,同样的程序速度要比片内SRAM运行的慢不少。

————————————————————

1。关于CPU和SDRAM的硬件连接参考s3c2410datasheet的“MEMORY (SROM/SDRAM) ADDRESS PIN CONNECTIONS”可以得知,那么复制4K以后的代码需要使用NANDFLASH控制器来读取NANDFLASH,以后的实验中将列举,本实验系统启动后将NANDFLASH开始的4K数据复制到SRAM中,然后跳转到0地址开始执行,然后初始化存储控制器,把程序本身从SRAM中复制到SDRAM中,最后跳转到SDRAM中运行,程序的标号:on_sdram,这个地址在连接程序时被确定为30000010,这个是SDRAM的地址,通过ldr pc,on_sdram,程序就可以跳转到SDRAM去了。那么on_sdram的值为什么等于31000010呢?原因在于Makefile中连接程序的命令为arm-softfloat-linux-gnu-ld -Ttext 30000000 head_yoyo.o leds_yoyo.o -o sdram_elf,意思就是代码段的起始地址为30000000,即程序的第一条指令( bl disable_watchdog)的连接地址为30000000,其他类推,其程序标号为on_sdram的值为30000010,虽然 bl disable_watchdog,bl memsetup, bl copy_steppingstone_to_sdram,的连接地址都在SDRAM中,但是由于他们都是位置无关的相对跳转指令,所以可以在SRAM中运行。
  
@**********************************************************
2 @ File : head_yoyo.S
3 @ 功能 : 设置SDRAM,将程序复制到SDRAM中,并跳转到SDRAM中运行
4 @**********************************************************
5
6 .equ    MEM_CTL_BASE,       0x48000000
7 .equ    SDRAM_BASE,         0x30000000
8 .text
9 .global _start
10 _start:
11         bl disable_watchdog     @关闭看门狗,否则CPU不断重启
12         bl memsetup             @初始化SDRAM控制器
13         bl copy_steppingstone_to_sdram @复制代码到SDRAM
14         ldr pc,=on_sdram
15
16
17 @*********************************************************
18 @ 子函数说明:跳转到SDRAM中运行
19 @*********************************************************
20
21 on_sdram:
22         ldr sp,=0x34000000      @设置栈,由于栈是向下增长,实际的使用为0x340    00000-4(栈在使用之前要减4)
              bl main                 @跳转到C语言
24
25
26 halt_loop:
27             b halt_loop         @死循环
28
29 @*********************************************************
30 @ 子函数说明:关闭看门狗
31 @*********************************************************
32
33 disable_watchdog:
34                 ldr r0,=0x53000000
35                 mov r1,#0x0
36                 str r1,[r0]
37                 mov pc,lr
38
39 @*********************************************************
40 @子函数说明:初始化内存控制器
41 @*********************************************************
42
43 memsetup:
                  mov r1,#MEM_CTL_BASE
45             adrl r2,mem_cfg_val
46             add r3,r1,#52
47 1:
48             ldr r4,[r2],#4    @将地址为R2的内存单元数据读取到R4中,然后r2=r2    +4
49             str r4,[r1],#4    @将r4的数据写入到r1的内存单元,然后r1=r1+4
50             cmp r1,r3         @比较R1,R3是否设置完所有的13个寄存器。
51             bne 1b            @如果没有复制完,就继续
52             mov pc,lr         @复制完后返回,b指令则不行。区别bl。
53
54
55 @*****************************************************************
56 @子函数说明:复制代码到SDRAM,将SRAM中的4K数据全部复制到SDRAM,
57 @            SRAM起始地址为0x00000000,SDRAM的起始地址为0x30000000
58 @*****************************************************************
59
60 copy_steppingstone_to_sdram:
61             mov r1,#0               @设置R1为SRAM的起始地址为0x00000000
62             ldr r2,=SDRAM_BASE      @设置R2为SDRAM的起始地址为0设置R1为0X300    00000
63             mov r3 ,#4*1024         @设置R3为4K
        1:
65             ldr r4,[r1],#4          @从SRAM中读取4字节的数据到R4中,然后r1=r    1+4
66             str r4,[r2],#4          @将r4中的4字节数据复制到SDRAM中,然后r2=    r2+4
67             cmp r1,r3               @判断是否完成:SRAM的地址是否等于末地址>   
68             bne 1b                  @若没有完成,继续复制
69             mov pc,lr               @返回
70
71 .align 4
72
73 @******************************************************
74 @存储控制器13个寄存器的设置值
75 @******************************************************
76 mem_cfg_val:
77             .long 0x22011110    @BWSCON :
78             .long 0x00000700    @BANKCON0
79             .long 0x00000700    @BANKCON1
80             .long 0x00000700    @BANKCON2
81             .long 0x00000700    @BANKCON3
82             .long 0x00000700    @BANKCON4
                  .long 0x00000700   @BANKCON5
84             .long 0x00018005    @BANKCON6
85             .long 0x00018005    @BANKCON7
86             .long 0x008e07a3    @REFRESH
87             .long 0x000000b1    @BANKSIZE
88             .long 0x00000030    @MRSRB6
89             .long 0x00000030    @MRSRB7
说明:
BWSCON:对应BANK0-BANK7,每BANK使用4位。这4位分别表示:
a.STx:启动/禁止SDRAM的数据掩码引脚,对于SDRAM,此位为0;对于SRAM,此位为1。有原理图可知Not using UB/LB (The pins are dedicated nWBE[3:0])。
b.WSx:是否使用存储器的WAIT信号,通常设为0
c.DWx:使用两位来设置存储器的位宽:00-8位,01-16位,10-32位,11-保留。
d.比较特殊的是BANK0对应的4位,它们由硬件跳线决定,只读。
对于本开发板,使用两片容量为32Mbyte、位宽为16的SDRAM组成容量为64Mbyte、位宽为32的存储器,所以其BWSCON相应位为: 0010。对于本开发板,BWSCON可设为0x22111110:其实我们只需要将BANK6对应的4位设为0010即可,其它的是什么值没什么影响,这个值是参考手册上给出的。

BANKCON0-BANKCON5:我们没用到,使用默认值0x00000700;

BANKCON6-BANKCON7:设为0x00018005 在8个BANK中,只有BANK6和BANK7可以使用SRAM或SDRAM,所以BANKCON6-7与BANKCON0-5有点不同:
a.MT([16:15]):用于设置本BANK外接的是SRAM还是SDRAM:SRAM-0b00,SDRAM-0b11
b.当MT=0b11时,还需要设置两个参数:
Trcd([3:2]):RAS to CAS delay(00=2 clocks,01=3 clocks,10=4 clocks),由于使用的是HY57V561620(L)T-H,查看其手册具体在“DEVICE OPERATING OPTION TABLE”,在100M的工作频率下的推荐值为3clocks,所以设为推荐值0b01。
SCAN([1:0]):SDRAM的列地址位数,(00 = 8-bit,01 = 9-bit,10= 10-bit)对于本开发板使用的SDRAM HY57V561620(L)T-H(Column Address : CA0 ~ CA8),列地址位数为9,所以SCAN=0b01。
如果使用其他型号的SDRAM,您需要查看它的数据手册来决定SCAN的取值:00-8位,01-9位,10-10位.

REFRESH:设为0x008e0000+ R_CNT 其中R_CNT用于控制SDRAM的刷新周期,占用REFRESH寄存器的[10:0]位,它的取值可如下计算(SDRAM时钟频率就是HCLK):
R_CNT = 2^11 + 1 – SDRAM时钟频率(MHz) * SDRAM刷新周期(uS)
在未使用PLL时,SDRAM时钟频率等于晶振频率12MHz;
SDRAM 的刷新周期在SDRAM的数据手册上有标明,在本开发板使用的SDRAM HY57V561620(L)-H的数据手册上,可看见这么一行“8192 refresh cycles / 64ms”:所以,刷新周期=64ms/8192 = 7.8125 uS。
对于本实验,R_CNT = 2^11 + 1 – 12 * 7.8125 = 1955, REFRESH=0x008e0000 + 1955 = 0x008e07a3
Trp([21:20]):设置为0即可
Tsrc([19:18]):设置默认值即可。

BANKSIZE:
位[7]=1:Enable burst operation (0=ARM核禁止突发传输,1=ARM核支持突发传输)
位[5]=1:SDRAM power down mode enable(0=不使用SCKE信号令SDRAM进入省电模式,1=使用SCKE信号令SDRAM进入省电模式)
位[4]=1:SCLK is active only during the access (recommended)
位 [2:1]=010:BANK6、BANK7对应的地址空间与BANK0-5不同。BANK0-5的地址空间都是固定的128M,地址范围是 (x*128M)到(x+1)*128M-1,x表示0到5。但是BANK7的起始地址是可变的,您可以从S3C2410数据手册第5章“Table 5-1. Bank 6/7 Addresses”中了解到BANK6、7的地址范围与地址空间的关系。本开发板仅使用BANK6的64M空间,我们可以令位 [2:1]=010(128M/128M)或001(64M/64M):这没关系,多出来的空间程序会检测出来,不会发生使用不存在的内存的情况——后面介绍到的bootloader和linux内核都会作内存检测。
位[6]、位[3]没有使用。

MRSRBx:
能让我们修改的只有位[6:4](CL=CAS latency,查看SDRAM的DATASHEET)这是SDRAM时序的一个时间参数,SDRAM 不支持CL=1的情况,所以位[6:4]取值为010(CL=2)或011(CL=3)。开发板保守的值为0b11。

NOTE:
In Power_OFF mode, SDRAM has to enter SDRAM self-refresh mode.


1
18
19 #define rGPFCON     (*(volatile unsigned long *)0x56000050)
20 #define rGPFDAT     (*(volatile unsigned long *)0x56000054)

       #define GPF4_OUTP   (0x01<<8)
23 #define GPF5_OUTP   (0x01<<10)
24 #define GPF6_OUTP   (0x01<<12)
25 #define GPF7_OUTP   (0x01<<14)
26
27 void wait(unsigned long time)
28 {
29     for(;time>0;time--);
30 }
31
32 int main()
33 {
34
35     rGPFCON = GPF4_OUTP|GPF5_OUTP|GPF6_OUTP|GPF7_OUTP;
36
37     while(1)
38     {
39         wait(30000);
40         rGPFDAT = (~1<<4);
41         wait(30000);
42         rGPFDAT = (~1<<5);
43         wait(30000);
44         rGPFDAT = (~1<<6);
45         wait(30000);
46         rGPFDAT = (~1<<7);
47
48     }
49 }

关键字:S3C2410  SDRAM  寄存器  初始化设置 引用地址:S3C2410 SDRAM寄存器初始化设置

上一篇:嵌入式Linux启动过程中的问题积累
下一篇:RealView MDK+Jlink+TQ2440 调试笔记

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

uboot 在 ARM s3c2410 上移植过程
总述 u-boot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序,在LINUX下可以通过CVS来得到当前正在开发的u-boot软件。当前版本号:u-boot 1.0.2,见include/version.h中的定义。 #cvs dserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot login #cvs z3 d server:anonymous@cvs.sourceforge.net:/cvsroot/u-boot checkout P u-boot 本文讲述S3C2410中u-boot的移植过程:S3C2410的硬件配置是: l CPU:S3C2410
[单片机]
PIC18F4550单片机三个操作寄存器的使用方法
试验芯片:Microchip PIC 18F4550 集成开发环境:MPLAB IDE v8.53 编译器:Microchip C18 PIC18系列单片机是美国微芯公司(Microchip)8位单片机系列中的高档系列,其任一I/O引脚允许的最大灌电流或最大拉电流达25mA,可以直接驱动LED和继电器。PORTA、PORTB和PORTE的最大灌电流或最大拉电流总和为200mA,PORTC和PORTD的最大灌电流或最大拉电流总和为200mA,PORTF和PORTG的最大灌电流或最大拉电流总和为100mA(注:PIC18F4550没有这两个端口)。 单片机和外设的交互都是通过I/O端口进行,每个I/O端口均有三个操作寄存器:
[单片机]
PIC18F4550单片机三个操作<font color='red'>寄存器</font>的使用方法
LM3S9B96 读写寄存器的两种方式
可以通过两种方式读写寄存器 1. 在hw_types.h文件中 //***************************************************************************** // // Macros for hardware access, both direct and via the bit-band region. // //***************************************************************************** #define HWREG(x) (*((volatile unsigned long *
[单片机]
STM8 时钟寄存器
STM8S 的时钟管理可以通过对 13 个寄存器的设置来实现,它们是 ● 内部时钟寄存器 CLK_ICKR ● 外部时钟寄存器 CLK_ECKR ● 主时钟状态寄存器 CLK_CMSR ● 主时钟切换寄存器 CLK_SWR ● 切换控制寄存器 CLK_SWCR ● 时钟分频寄存器 CLK_CKDIVR ● 外设时钟门控寄存器 1CLK_PCKENR1 ● 外设时钟门控寄存器 2CLK_PCKENR2 ● 时钟安全系统寄存器 CLK_CSSR ● 可配置时钟输出寄存器 CLK_CCOR ● CAN外部时钟控制寄存器 CLK_CANCCR ● HSI 时钟修正寄存器 CLK_HSITRIMR ● SWIM 时钟控制寄存器CLK_SWI
[单片机]
STM8 时钟<font color='red'>寄存器</font>
ATmega32 I/O存储器
ATmega32 的I/O 空间定义见 P283“ 寄存器概述” 。 ATmega32所有的I/O及外设都被放置于I/O I/O位置都可以通过IN 与OUT指 令来访问,在32个通用工作寄存器和 I/O之间传输数据。 地址为0x00 - 0x1F 的I/O寄存 器还可用 SBI 和 CBI 指令直接进行位寻址,而 SBIS 和 SBIC 则用来检查某一位的值。更 多内容请参见指令集。使用 IN 和 OUT 指令时地址必须在 0x00 - 0x3F 之间。如果要象 SRAM 一样通过 LD 和 ST 指令访问 I/O 寄存器,相应的地址要加上 0x20。 为了与后续产品兼容,保留未用的未应写 0 ,而保留的I/O 寄存器则不应进行
[单片机]
AVR--I/O端口寄存器
ATmega16的4个8位的端口都有各自对应的3个I/O端口寄存器,它们占用了I/O空间的12个地址 下面是PA口寄存器—PORTA、DDRA、PINA各个位的具体定义,以及其是否可以通过指令读写操作和RESET复位后的初始值。其它3个口的寄存器的情况与PA口相同,只是地址不一样。 1 ) 正确使用AVR的I/O口要注意:先正确设置DDRx方向寄存器,再进行I/O口的读写操作。 2) AVR的I/O口复位后的初始状态全部为输入工作方式,内部上拉电阻无效。所以,外部引脚呈现三态高阻输入状态。 3) 因此,用户程序需要首先对要使用的I/O口进行初始化设置,根据实际需要设定使用I/O口的工作方式(输出还是输入),当设定为
[单片机]
AVR--I/O端口<font color='red'>寄存器</font>
arm-linux-gcc4.4.3编译s3c2410平台linux内核
一、首先下载linux内核: linux-2.6.14.tar.bz2 下载地址: http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2 二、解压linux-2.6.14.tar.bz2: tar -jxvf linux-2.6.14.tar.bz2 三、配置Makefile文件: 1、打开源码根目录下的Makefile文件: gedit Makefile 修改Makefile文件: ARCH ?= arm CROSS_COMPILE ?= arm-linux- 2、查看目录结构: ls -l linux-2.6.14/arch/arm/ d
[单片机]
基于ADmC812和DSP实时数据采集系统设计
   引言   ADmC812是ADI公司的以8051(8052)内核为控制核心的新型微转换器。由于ADmC812内部集成了大量的外围设备。它本身就是一个完全可编程、自校准、高精度的数据采集系统,可以取代传统的MCU+A/D+ROM+RAM高成本、大体积产品,尤其是它的高精度和高速度A/D模块,特别适应于智能传感、瞬时获取、数据采集和各种通信系统。但是,对于需要采集数据量大、运算复杂、实时性又要求较高的场合,由于在结构和速度上的限制,往往是无法满足要求的。本文针对这种情况,提出了基于ADmC812和DSP的数据采集系统。在这个系统中,ADmC812作为主机,完成ADC、DAC、显示、键盘等功能,而DSP作从机,专注于复杂的数据运
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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