嵌入式系统学习——储存管理器

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

持续更新


猜你喜欢

转载自blog.csdn.net/zxh1592000/article/details/79066203