S3C2440的SDRAM驱动
启/关闭刷新功能,设置为1,开启刷新
lTREFMD:SDRAM刷新模式,0=CBR/AutoRefresh,1=Self Refresh,设置为0,自动刷新
lTrp:行地址选通预充电时间,一般设置为0b00即可
lTsrc:单行刷新时间,设置为0b11即可。
lRefresh Counter:内存存储单元刷新数,它通过下面公式计算出:
Refresh Counter = 2^11 + 1 – SDRAM时钟频率(MHz)* SDRAM刷新周期(uS)
SDRAM的刷新周期,也就是内存存储单元间隔需要多久进行一次刷新,前面内存工作原理分析可知电容数据保存上限为64ms,笔者使用内存芯片每个L-Bank共有8192行,因此每次刷新最大间隔为:64ms/8192 = 7.8125uS,如果内存工作在外部晶振频率12MHz下,Refresh Counter = 1955,如果内存工作在100MHz下,那么Refresh Counter = 1269(取大整数)
lREFRESH寄存器设置为:
0x8e0000 + 1269 = 0x008e04f5(HCLK = 100MHz)
0x8e0000 + 1955 = 0x008e07a3(HCLK = 12MHz)
(5)BANKSIZE寄存器(BANKSIZE REGISTER)
表2-21 BANKSIZE寄存器(BANKSIZE)
设置内存的突发传输模式,省电模式和内存容量。
lBURST_EN:是否开启突发模式,0 = ARM内核禁止突发传输1 =开启突发传输,设置为1,开启突发传输
lSCKE_EN:是否使用SCKE信号作为省电模式控制信号,0 =不使用SCKE信号作为省电模式控制信号1 =使用SCKE信号作为省电模式控制信号,通常设置为1
lSCLK_EN: 设置向存储器输入工作频率,0 =一直输入SCLK频率,即使没有内存操作也会输入,1 =仅当进行内存数据操作时才输入SCLK频率,通常设置为1
lBK76MAP:设置Bank6/7的内存容量,笔者使用开发板内存为两片32M内存芯片并联成64M,它们全部都外接到Bank6上,因此选择0b001
lBANKSIZE寄存器设置为:0xb1
(6)SDRAM模式设置寄存器MRSRx (SDRAM MODE REGISTER SET REGISTER)
表2-22 SDRAM模式设置寄存器(MRSRx)
该寄存器用于设置CAS潜伏周期,可以手动设置的位只有CL[6:4]位,通过前面内存工作原理可知,笔者使用开发板CL=3,即0b011
lMRSR6,MRSR7设置为:0x00000030
1.1.8内存驱动实验
设置该工程加载时运行时地址为0x30000000,如图2-55所示:
图2-55设置加载时运行时地址
init.s:本程序文件主要实现了,关闭看门狗,初始化内存,拷贝ROM数据到内存中,然后跳往内存中执行xmain函数,从xmain函数返回之后,将全部led点亮,进入死循环。
;
;内存初始化实验
;
AREA Init, CODE, READONLY
ENTRY
start
; close watchdog
ldr r0, = 0x53000000;将看门狗控制寄存器地址放入r0
mov r1, #0
str r1, [r0];设置看门狗控制寄存器的值为0
bl initmem;跳转到initmem代码段,初始化内存
bl copyall;跳转到数据拷贝代码段,将ROM中数据拷贝到内存中
IMPORT xmain;引入main.c中的xmain函数
ldr sp, =0x34000000;调用C程序之前先初始化栈指针
ldr lr, =endxmain;设置xmain函数的返回地址
ldr pc, =xmain;跳转到C程序中的xmain函数的入口处执行
endxmain
ldr r0, =0x56000010; LED的GPIO接口配置寄存器
ldr r1, =0x00015400; GPIO配置数据
str r1, [r0];设置GPIO
ldr r0, =0x56000014; LED控制寄存器地址
ldr r1, =0x0;全部LED亮
str r1,[r0]
loop
b loop;死循环
copyall
IMPORT |Image$$RO$$Base|;引入编译器Image$$RO$$Base符号变量
IMPORT |Image$$RW$$Limit|;引入编译器Image$$RW$$Limit符号变量
ldr r0, = |Image$$RO$Base|;取得Image$$RO$Base域基址的值
ldr r1, = |Image$$RW$$Limit|;取得Image$$RW$Base域结束地址的值
ldr r2, =0x0;数据拷贝源地址
copyallloop
teq r0,r1;测试是否拷贝完成
beq quitcopyallloop;拷贝完成,跳往quitcopyallloop退出
ldr r3, [r2], #4;四字节加载
str r3, [r0], #4;四字节存储
b copyallloop;返回继续执行
quitcopyallloop
mov pc, lr;调用返回
initmem;内存初始化
ldr r0, =0x48000000;加载内存相关寄存器首地址r0
ldr r1, =0x48000034;加载内存相关寄存器尾地址到r1
adr r2, memdata;将寄存器配置数据地址段首地址加载到r2
initmemloop
ldr r3, [r2], #4;循环设置存寄存器
str r3, [r0], #4
teq r0, r1
bne initmemloop;循环到最后一个寄存器时退出函数
mov pc,lr
memdata
DCD0x22000000;BWSCON
DCD0x00000700;BANKCON0
DCD0x00000700;BANKCON1
DCD0x00000700;BANKCON2
DCD0x00000700;BANKCON3
DCD0x00000700;BANKCON4
DCD0x00000700;BANKCON5
DCD0x00018005;BANKCON6
DCD0x00018005;BANKCON7
DCD0x008e07a3;REFRESH
DCD0x000000b1;BANKSIZE
DCD0x00000030;MRSRB6
DCD0x00000030;MRSRB7
END
main.c:本程序文件主要实现led灯的初始化,然后四个l
S3C2440SDRAM驱 相关文章:
- S3C2440的SDRAM驱动 (11-10)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)