s3c2440裸机-内存控制器(五、SDRAM编程实现)
配置内存控制器-SDRAM编程配置
2440内存控制器共有13个寄存器。
BANK0--BANK5只需要设置BWSCON和BANKCONx(x为0~5)两个寄存器;
BANK6、BANK7外接SDRAM时,除BWSCON和BANKCONx(x为6、7)外,还要设置REFRESH、BANKSIZE、MRSRB6、MRSRB7等4个寄存器。
下面分别说明各个寄存起的设置:
1.位宽和等待控制寄存器BWSCON(BUSWIDTH&WAITCONTROLREGISTER)

我们SDRAM的位宽为32,DW6[25:24]设置成10, 没有使用等待信号,所以WS6[26]=0。 bank7跟随bank6的配置,
因此BWSCON寄存器的值为:0x22000000。
2.BANK控制寄存器BANKCON6(BANKCONTROLREGISTER)
在8个BANK中,只有BANK6和BANK7可以外接SRAM或SDRAM.

MT[16:15]:设置BANK是ROM/SRAM还是DRAM,我们用的SDRAM,属于DRAM。
Trcd[3:2]:行地址和列地址间隔多长时间,看SDRAM芯片手册时间间隔Trcd>18ns,我们HCLK=100MHZ,clocks为10ns,所以设置为2clocks即可。


SCAN[1:0]:SDRAM的列地址位数,上面的图片已经查看sdram手册分析过,列地址位数为9。
综上所述,本开发板中BANKCON6设为0x017001
3.刷新控制寄存器REFRESH(REFRESHCONTROLREGISTER)

REFEN[23]:设置开启SDRAM的刷新功能。
TREFMD[22]:SDRAM的刷新模式,0=CBR/AutoRefresh,选择自动刷新。
Trp[21:20]:根据sdram手册Trp>18ns, 设为0(2 clocks)即可。
Tsrc[19:18]: Tsrc = Trc - Trp = Trc-20, 根据sdram手册Trc>=60,我们取Trc =70, 则Tsrc= 50ns(5clocks)即可。
RefreshCounter[10:0]:Refresh period = (211-refresh_count+1)/HCLK,
RefreshCount = 211 + 1 - 100*Refresh period,看SDRAM手册“8192 refresh cycles/64ms”, Refresh period= 64000us/8192 = 7.8us,
RefreshCount取推荐值1269= 0x4f5.
综上,REFRESH寄存器设为0x8404F5。
4.BANKSIZE寄存器REFRESH(BANKSIZEREG ISTER)

BURST_EN[7]:0=ARM核禁上突发传输,1=ARM核支持突发传输(推荐);
SCKEEN[5]:0=不使用SCKE信号令SDRAM进入省电模式,1=使用SCKE信号令SDRAM进入省电模式(推荐);
SCLK-EN[4]:0=时刻发出SCLK信号,1=仅在访问SDRAM期间发出SCLK信号(推荐);
BK76MAP[2:0]:配置banksize成64M
因此,BANKSIZE寄存器设为0xB1。
5.SDRAM模式设置寄存器MRSRBx6(SDRAM MODE REGISTER SET REGISTER)

CL[6:4]:表示发出行、列地址后,等多久才返回收到数据, 看SDRAM手册发现Tcas >=18ns,所以配置成2 clocks即可。
MRSRB6寄存器设置为0x20。
代码如下:
void sdram_init(void)
{
BWSCON = 0x22000000;
BANKCON6 = 0x18001;
BANKCON7 = 0x18001;
REFRESH = 0x8404f5;
BANKSIZE = 0xb1;
MRSRB6 = 0x20;
MRSRB7 = 0x20;
}
int sdram_test(void)
{
volatile unsigned char *p = (volatile unsigned char *)0x30000000;//sdram base addr
int i;
// write sdram
for (i = 0; i < 1000; i++)
p[i] = 0x55;
// read sdram
for (i = 0; i < 1000; i++)
if (p[i] != 0x55)
return -1;
return 0;
}
int main(void)
{
uart0_init();
sdram_init();
if (sdram_test() == 0)
led_test();
return 0;
}
测试结果:
当进行sdram_init后可已访问0x3000_0000地址的内容,led流水灯闪烁。
不初始化sdram_init,运行程序卡死。
s3c2440裸机-内存控制器(五、SDRAM编程实现)的更多相关文章
- s3c2440裸机-内存控制器(一、内存控制器的原理)
1.内存接口概念 S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚(GPA-GPH)),有串口控制器 (接有TXD RXD引脚),有memory controller内存控制器,有Nan ...
- s3c2440裸机-内存控制器(二、不同位宽外设与CPU地址总线的连接)
不同位宽设备的连接 black 我们先看一下2440芯片手册上外设rom是如何与CPU地址总线连接的. 8bit rom与CPU地址线的连接 8bit*2 rom与CPU地址线的连接 8bit*4 r ...
- s3c2440裸机-内存控制器(三、norflash初始化-时序设置)
1.norflash与2440的硬件连接 2.初始化nor,配置nor时序 1.如图是S3C2440的内存控制器的可编程访问周期读写时序,里面的时间参数要根据外部设备的性能进行配置,这里先列出时间参数 ...
- s3c2440裸机-内存控制器(四、SDRAM原理-cpu是如何访问sdram的)
1.SDRAM原理 black (1)SDRAM内部存储结构: (2)再看看与2440连接的SDRAM原理图: sdram引脚说明: A0-A12:地址总线 D0-D15:数据总线(位宽16,2片级联 ...
- s3c2440内存控制器与SDRAM基本测试
前面我们实验的LED和串口程序,是cpu发送地址给特定的寄存器,在寄存器中写相应的位,达到控制要求. 第一类是GPIO门电路如LED,第二类是协议类如串口,这些都不是cpu直接给地址信息,而是通过寄存 ...
- s3c2440裸机-代码重定位(2.编程实现代码重定位)
代码重定位(2.编程实现代码重定位) 1.引入链接脚本 我们上一节讲述了为什么要重定位代码,那么怎么去重定位代码呢? 上一节我们发现"arm-linux-ld -Ttext 0 -Tdata ...
- s3c2440裸机-时钟编程(二、配置时钟寄存器)
s3c2440裸机编程-时钟编程(二.配置时钟寄存器) 1.2440时钟时序 下图是2440时钟配置时序: 1.上电后,nRESET复位信号拉低,此时cpu还无法取指令工作. 2.nRESET复位信号 ...
- S3C2440内存控制器详解
S3C2440A Memory Map after Reset S3C2440的内存空间划分为不同的块,当CPU向内存控制器发出地址,内存控制器根据地址范围,发出对应片选信号到片选引脚,实现对不同设备 ...
- s3c2440裸机-时钟编程(一、2440时钟体系介绍)
1.总线框架 下图是2440的总线框架,其中有AHB(Advanced High performance Bus)高速总线,APB(Advanced Peripheral Bus)外围总线. 不同总线 ...
随机推荐
- [TimLinux] django model关于QuerySet
1. 获取执行过的sql命令 from django.db import connections connections['default'].queries 2. 获取QuerySet将执行的sql ...
- CF240E Road Repairs(最小树形图-记录路径)
A country named Berland has n cities. They are numbered with integers from 1 to n. City with index 1 ...
- SpringMvc 跨域处理
导读 由于浏览器对于JavaScript的同源策略的限制,导致A网站(Ajax请求)不能通过JS去访问B网站的数据,于是跨域问题就出现了. 跨域指的是域名.端口.协议的组合不同就是跨域. http:/ ...
- F#周报2019年第50期
新闻 Azure Functions 3.0系统上线 GC性能架构--第1部分 ConfigureAwait问题解答 介绍System.Threading.Channels Windows Serve ...
- Day 09 作业
简述定义函数的三种方式 有参函数, 无参函数, 空函数 简述函数的返回值 函数内部代码经过一系列的逻辑处理返回的结果 简述函数的参数 函数的参数分形参和实参 形参: 定义函数阶段, 括号内定义的参数, ...
- zabbix环境搭建部署(一)
Linux高端架构师课程 Linux实战运维国内NO.1全套视频课程 QQ咨询:397824870 > 监控报警 > zabbix环境搭建部署(一) zabbix环境搭建部署(一) 监 ...
- 如何为.NETCore安装汉化包智能感知
引言 具体不记得是在群里还是什么地方有人问过,.NETCore有没有汉化包,答案是有,目前微软已经为我们提供了.NETCore多种语言的语言包.下面看看如何安装与使用吧. 在哪下载? 在微软官方下载 ...
- Instrument API介绍
1. Instrumentation介绍 JVMTI(JVM Tool Interface)是 Java 虚拟机所提供的 native 编程接口,是 JVMPI(Java Virtual Machi ...
- 百万级高并发mongodb集群性能数十倍提升优化实践
背景 线上某集群峰值TPS超过100万/秒左右(主要为写流量,读流量很低),峰值tps几乎已经到达集群上限,同时平均时延也超过100ms,随着读写流量的进一步增加,时延抖动严重影响业务可用性.该集群采 ...
- HttpRunner学习7--引用CSV文件数据
前言 在之前的文章中,我们已经学习了 parameters 参数化,是在测试脚本中直接指定参数列表.这种方法简单易用,但如果我们的参数列表数据比较多,这种方法可能就不太适合了. 当数据量比较大的时候, ...