1.想访问一个芯片,需要哪些条件?
a.地址线
b.数据线 8/16/32位的数据宽度
c.时钟/频率
d.芯片相关的一些特性比如SDRAM(行地址、列地址、Bank)
运行时,CPU通过存储管理器->SDRAM(列/行、刷新周期、Bank地址、数据位宽)分别看内存芯片手册,原理图
想使用SDRAM,就需要
a.配置存储管理器
b.使用8bank,也就是8个片选信号。每个Bank外接128M
程序启动过程:
a.一上电,Nand前4K被拷贝到->片内内存RAM
b.关看门狗,初始化存储管理器
c.把代码拷贝到SDRAM里去,继续执行
程序源码:
head.S
.equ MEM_CTL_BASE, 0x48000000
.equ SDRAM_BASE, 0x30000000
.text
.global _start
_start:
bl disable_watch_dog //关闭WATCHDOG,否则CPU会不断重启
bl memsetup //设置存储控制器
bl copy_steppingstone_to_sdram //复制代码到SDRAM中
ldr pc, =on_sdram //跳到SDRAM中继续执行
on_sdram:
ldr sp, =0x34000000 //设置堆栈
bl main
halt_loop:
b halt_loop
disable watch_dog:
//往WATCHDOG寄存器里写0即可
mov r1, #0x53000000
mov r2, #0x0
str r2, [r1]
mov pc, lr //返回
copy_steppingstone_to_sdram:
//将Steppingstone的4K数据全部复制到SDRAM中,teppingstone就是0地址指向SRAM
//Steppingstone起始地址为0x00000000,SDRAM起始地址为0x30000000
mov r1, #0
ldr r2, =SDRAM_BASE
mov r3, #4*1024
l:
ldr r4, [r1],#4 //从Steppingstone读取4字节的数据,并让源地址加4
str r4, [r2],#4 //将此4字节的数据复制到SDRAM中,并让目的地址加4
cmp r1, r3 //判断是否完成,原地址等于Steppingstone的末地址?
bne lb //若没有复制完,继续
mov pc, lr //返回
memsetup:
//设置存储控制器以便使用SDRAM等外设
mov r1, #MEM_CTL_BASE //存储控制器的13个寄存器开始地址
adr1 r2, mem_cfg_val //这13个值的起始存储地址
add r3, r1, #52 //13*4 = 54
l:
ldr r4, [r2],#4 //读取设置值,并让r2加4
str r4, [r1],#4 //将此值写入寄存器,并让r1加4
cmp r1, r3 //判断是否设置完所有13个寄存器
bne lb //若没有写成,继续
mov pc, lr //返回
.align 4
mem_cfg_val:
//存储管理器13个寄存器的设置值
.long 0x22011110 //BWSCON
.LONG 0x00000700 //BANKCON1
.LONG 0x00000700 //BANKCON2
.LONG 0x00000700 //BANKCON3
.LONG 0x00000700 //BANKCON4
.LONG 0x00000700 //BANKCON5
.LONG 0x00018005 //BANKCON6
.LONG 0x00018005 //BANKCON7
.LONG 0x008C07A3 //REFRESH
.LONG 0x000000B1 //BANKSIZE
.LONG 0x00000030 //MESRE6
.LONG 0x00000030 //MESRE7
链接地址:运行时,程序应该位于哪里
即把head.S从内存拷贝到应该位于的地方0x30000000,由Makefile指定
Makefile:
sdram.bin:head.S leds.c
arm-linux-gcc -c -o head.o head.S
arm-linux-gcc -c -o leds.o leds.c
arm-linux-ld -Ttext 0x30000000 head.o leds.o -o sdram_elf
arm-linux-objcopy -o binary -S sdram elf sdram.bin
arm-linux-objdump -D -m arm sdram_elf > sdram.dis
clean:
rm-f sdram.dis sdram.bin sdram_elf *.o
持续更新