03.存储管理器实验

来源:互联网 发布:labview软件下载 编辑:程序博客网 时间:2024/06/15 23:31

**

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  mainhalt_loop:    b   halt_loopdisable_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*10241:      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 = 541:      ldr r4,     [r2], #4            @ 读取设置值,并让r2加4    str r4,     [r1], #4            @ 将此值写入寄存器,并让r1加4    cmp r1,     r3                  @ 判断是否设置完所有13个寄存器    bne 1b                          @ 若没有写成,继续    mov pc,     lr                  @ 返回.align 4mem_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.disclean:    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地址运行

原创粉丝点击