嵌入式系統學習——儲存管理器

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

持續更新


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章