03.存储管理器实验

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012075395/article/details/78843000

**

03.存储管理器实验

**

CPU通过存储管理器访问SDRAM,网卡DM9000等

存储管理器发出
①片选信号
②bank选择信号
③列地址
④行地址

根据配置信息来决定怎么访问外部设备,条件
①地址线
②数据线,数据宽度,8、16、32
③时钟、频率
④芯片相关

硬件接线

理论上可以接8个存储器。即8个bank,每个bank可以寻址128M。
包括SDRAM,网卡,NOR flash等

32位接线法
2440 内存
A0
A1
A2————A0
A3————A1
A4————A2
… ————…

16位接线法
2440 内存
A0
A1————A0
A2————A1
A3————A2
… ————…

32位接线法
2440 内存
A0————A0
A1————A1
A2————A2
… ————…

软件

总线宽度和等待控制寄存器(bwscon)
这里写图片描述
列举其中一组来说明,看一下BANK1的ST1,WS1,DW1.
这里写图片描述
这里写图片描述
只有BANK6,BANK7才能连接SDRAM,因为BANK6,BANK7做了特别的设置
其他详情看用户手册。

代码

启动文件,头。

@*************************************************************************
@ File:head.S
@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
@*************************************************************************       

.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中去
    @ Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000

    mov r1, #0
    ldr r2, =SDRAM_BASE
    mov r3, #4*1024
1:  
    ldr r4, [r1],#4     @ 从Steppingstone读取4字节的数据,并让源地址加4
    str r4, [r2],#4     @ 将此4字节的数据复制到SDRAM中,并让目地地址加4
    cmp r1, r3          @ 判断是否完成:源地址等于Steppingstone的未地址?
    bne 1b              @ 若没有复制完,继续
    mov pc,     lr      @ 返回

memsetup:
    @ 设置存储控制器以便使用SDRAM等外设

    mov r1,     #MEM_CTL_BASE       @ 存储控制器的13个寄存器的开始地址
    adrl    r2, mem_cfg_val         @ 这13个值的起始存储地址
    add r3,     r1, #52             @ 13*4 = 54
1:  
    ldr r4,     [r2], #4            @ 读取设置值,并让r2加4
    str r4,     [r1], #4            @ 将此值写入寄存器,并让r1加4
    cmp r1,     r3                  @ 判断是否设置完所有13个寄存器
    bne 1b                          @ 若没有写成,继续
    mov pc,     lr                  @ 返回
.align 4
mem_cfg_val:
    @ 存储控制器13个寄存器的设置值
    .long   0x22011110      @ BWSCON
    .long   0x00000700      @ BANKCON0
    .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      @ MRSRB6
    .long   0x00000030      @ MRSRB7

C文件

#define GPFCON      (*(volatile unsigned long *)0x56000050)
#define GPFDAT      (*(volatile unsigned long *)0x56000054)

#define GPF4_out    (1<<(4*2))
#define GPF5_out    (1<<(5*2))
#define GPF6_out    (1<<(6*2))

void  wait(volatile unsigned long dly)
{
    for(; dly > 0; dly--);
}

int main(void)
{
    unsigned long i = 0;

    GPFCON = GPF4_out|GPF5_out|GPF6_out;        // 将LED1,2,4对应的GPF4/5/6三个引脚设为输出

    while(1){
        wait(30000);
        GPFDAT = (~(i<<4));        // 根据i的值,点亮LED1,2,4
        if(++i == 8)
            i = 0;
    }

    return 0;
}

程序启动过程

①上电Nand flash前4K,拷贝到片内RAM。从0启动。
②关闭看门狗,初始化管理存储器
③把SRAM的代码复制到SDRAM,继续执行

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

2440启动方式

①Nor flash启动②Nand flash启动

Nor flash启动
①CPU的0地址指向nor(BANK0)
②从0地址运行

Nand flash启动
①上电,会把nand flash前4K字节的数据复制到片内SRAM
②CPU的0地址指向内部SRAM
③从0地址运行

猜你喜欢

转载自blog.csdn.net/u012075395/article/details/78843000
03.