微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM开发步步深入之SDRAM编程示例

ARM开发步步深入之SDRAM编程示例

时间:12-05 来源:互联网 点击:

0 = 8-bit,01 = 9-bit,10= 10-bit),SDRAM列地址位数。查阅K4S561632芯片手册得知此值是9,所以SCAN=0b01。如果使用其他型号的SDRAM,您需要查 看它的数据手册来决定SCAN的取值:00-8位、01-9位、10-10位。综合以上各值,BANKCON6~BANKCON7设为 0x00018005。

★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。

●Trp([21:20]):设置为0即可。

●Tsrc([19:18]):设置默认值即可。

★BANKSIZE: 设置SDRAM的一些参数。位[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。但是BANK6-7的起始地址是可变的,您可以从S3C2410数据手 册第5章"Table 5-1. BANK6-7 Addresses"中了解到BANK6-7的地址范围与地址空间的关系。本开发板仅使用BANK6的64M空间,其中 BK76MAP(bit[2:0])配置BANK6/7映射的大小,可设置为010 = 128MB/128MB或001 = 64MB/64MB,只要比实际RAM大都行,多出来的空间程序会检测出来,不会发生使用不存在的内存的情况(Bootloader和Linux内核都会 作内存检测)。BANKSIZE=0x000000b2。

★MRSRB6、MRSRB7(Mode register set register BANK6/7,SDRAM模式设置寄存器):可以修改的只有CL[6:4](CAS latency,000 = 1 clock, 010 = 2 clocks, 011=3 clocks),其他的全部是固定的(fixed),故值为0x00000030。SDRAM 不支持CL=1的情况,所以位[6:4]取值为010(CL=2)或011(CL=3),开发板保守的值为0b11。

至此,13个存储控制器的寄存器全部介绍完了,下面就可以配置各寄存器的值,完成SDRAM初始化,实现代码复制到SDRAM中执行的操作(注:同样的程序速度要比片内SRAM运行的慢)。

存储控制器13个寄存器的设置值:

mem_cfg_val:

.long 0x02000000 @BWSCON;此处只用到BANK6对应的[27:24],其它位没理会,想理论上应该可以?

.long 0x00000700 @BANKCON0;BANKCON0~BANKCON5没用到,使用默认值0x00000700

.long 0x00000700 @BANKCON1

.long 0x00000700 @BANKCON2

.long 0x00000700 @BANKCON3

.long 0x00000700 @BANKCON4

.long 0x00000700 @BANKCON5

.long 0x00018005 @BANKCON6

.long 0x00018005 @BANKCON7

.long 0x008e07a3 @REFRESH

.long 0x000000b1 @BANKSIZE

.long 0x00000030 @MRSRB6

.long 0x00000030 @MRSRB7

汇编过程主要代码:

.equ MEM_CTL_BASE, 0x48000000 @ 定义存储控制器寄存器基址

.equ SDRAM_BASE, 0x30000000 @ 定义SDRAM起始地址

.text

.global _start

_start:

bl disable_watch_dog @ 去关门喂狗

bl mem_control_setup @ 去设置存储控制器

bl copy_steppingstone_to_sdram @ 复制代码到SDRAM中

ldr pc, =on_sdram @ 跳到SDRAM中继续执行

on_sdram:

ldr sp, =0x34000000 @ 设置堆栈,执行C点灯代码

bl main

halt_loop:

b halt_loop

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top