溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

07-存儲(chǔ)管理器實(shí)驗(yàn)

發(fā)布時(shí)間:2020-08-04 02:26:58 來(lái)源:網(wǎng)絡(luò) 閱讀:1074 作者:少年不在了 欄目:系統(tǒng)運(yùn)維

?S3C2440的存儲(chǔ)控制器提供了訪問(wèn)外設(shè)所需要的信號(hào),它有如下特性:

支持大/小端字節(jié)(通過(guò)軟件選擇);
每個(gè)BANK的地址空間為128MB,總共1GB(8個(gè)BANK);
可編程控制的總線寬度(8/16/32bit),BANK0只有兩種位寬(16/32bit);
總共8個(gè)BANK:BANK0-BANK5可以支持外接ROM、SRAM等;BANK6-BANK7除了支持ROM、SRAM外,還支持SDRAM等;
BANK0-BANK6七個(gè)BANK的起始地址固定;
BANK7的起始地址可編程選擇;
每個(gè)BANK的訪問(wèn)周期均可編程控制;
通過(guò)外部的wait信號(hào)延長(zhǎng)總線的訪問(wèn)周期;
在外接SDRAM時(shí),支持自刷新和省電模式模式。

?S3C2440對(duì)外引出的27根地址線ADDR0-ADDR26的訪問(wèn)范圍只有128MB,而八個(gè)片選信號(hào)nGCS0-nGCS7對(duì)應(yīng)于BANK0-BANK7,當(dāng)訪問(wèn)BANKx的地址空間時(shí),nGCSx引腳輸出低電平用來(lái)選中外接的設(shè)備。每個(gè)nGCSx對(duì)應(yīng)128MB地址空間,8個(gè)nGCSx信號(hào)總共對(duì)應(yīng)了1GB。
07-存儲(chǔ)管理器實(shí)驗(yàn)
?在TQ2440開(kāi)發(fā)板中BANK6連接SDRAM,CPU對(duì)其提供了一組用于SDRAM的信號(hào):

SDRAM時(shí)鐘有效信號(hào)LSCKE;
SDRAM時(shí)鐘信號(hào)LSCLK0/LSCLK1;
數(shù)據(jù)掩碼信號(hào)LnWBE0/LnWBE1/LnWBE2/LnWBE3;
SDRAM行地址選通脈沖信號(hào)LnSRAS;
SDRAM列地址選通脈沖信號(hào)LnSCAS;
寫(xiě)允許信號(hào)LnWE

07-存儲(chǔ)管理器實(shí)驗(yàn)????07-存儲(chǔ)管理器實(shí)驗(yàn)
1、SDRAM介紹
?SDRAM的內(nèi)部是一個(gè)存儲(chǔ)陣列,如同一個(gè)二維表格,將數(shù)據(jù)填進(jìn)去。其檢索原理和表格相同,先指定一個(gè)行地址,再指定一個(gè)列地址就可以準(zhǔn)確找到所需要的單元格。這個(gè)單元格被稱(chēng)為存儲(chǔ)單元,而表格則稱(chēng)為邏輯BANK(L-BANK),SDRAM一般有4個(gè)L-BANK其邏輯圖為上圖所示。
?訪問(wèn)SDRAM可以分為如下四個(gè)步驟:

1、CPU發(fā)出的片選信號(hào)LnSCS0有效;
2、SDRAM中有4個(gè)L-BANK,需要兩根地址線來(lái)選中其中一個(gè),從圖中可知使用ADDR24、ADDR25作為L(zhǎng)-BANK選擇信號(hào);
3、對(duì)選中的芯片進(jìn)行統(tǒng)一行/列(存儲(chǔ)單元)尋址;
4、找到存儲(chǔ)單元后,被選中的芯片進(jìn)行同一的數(shù)據(jù)傳輸。

?在TQ2440開(kāi)發(fā)板中使用了兩片16位的ADRAM芯片并聯(lián)組成32位的位寬,與CPU的32根數(shù)據(jù)線(DATA0-DATA31)相連。BANK6的起始地址為0x30000000,所以SDRAM的訪問(wèn)地址為0x30000000-ox33ffffff,共64MB。
07-存儲(chǔ)管理器實(shí)驗(yàn)
2、存儲(chǔ)控制器的寄存器使用
?在S3C2440中,存儲(chǔ)控制器一共有13個(gè)寄存器,BANK0-BANK5只需要設(shè)置BWSCON和BANKCONx(x為0-5)兩個(gè)寄存器,BANK6/BANK7外接SDRAM時(shí),除了WSCON和BANKCONx(x為6-7)外,還需要設(shè)置REFRESH、BANKSIZE、MRSRB6、MRSRB7等四個(gè)寄存器。下面分別說(shuō)明每個(gè)寄存器。
位寬和等待控制寄存器BWSCON

BWSCON 說(shuō)明
STx 啟動(dòng)/禁止SDRAM的數(shù)據(jù)掩碼引腳,對(duì)于SDRAM,此位為0;對(duì)于SRAM,此位為1
WSx 是否使用存儲(chǔ)器的WAIT信號(hào),通常設(shè)為0
DWx 使用兩位來(lái)設(shè)置相應(yīng)BANK的位寬,0b00對(duì)應(yīng)8位,0b01對(duì)應(yīng)16位,0b10對(duì)應(yīng)32位,0b11保留

?對(duì)于BANK0,它沒(méi)有ST0和WS0、DW0([2:1]),bank0只支持兩種位寬16/32。
BANK控制寄存器BANKCONx(x為0-5),控制BANK0-BANK5外接設(shè)備的訪問(wèn)時(shí)序,使用默認(rèn)的0x0700即可滿足TQ2440開(kāi)發(fā)板。
BANK控制寄存器BANKCONx(x為6-7),在8個(gè)BANK中,只有BANK6和BANK7可以外接SRAM或SDRAM,因此其設(shè)置方法有所不同。

BANKCONn 說(shuō)明
MT [16:15] 用于設(shè)置BANK外接的是SRAM或SDRAM,00 = ROM or SRAM,11 = Sync. DRAM
Trcd [3:2] RAS to CAS delay,推薦設(shè)置0b01
SCAN [1:0] SDRAM的列地址位數(shù),00 = 8-bit 01 = 9-bit 10= 10-bit

刷新控制寄存器REFRESH

REFRESH 說(shuō)明
REFEN [23] 0,禁止SDRAM的刷新功能,1,開(kāi)啟SDRAM的刷新功能
TREFMD [22] SDRAM的刷新模式。0 = CBR/Auto Refresh 1 = Self Refresh(一般系統(tǒng)休眠時(shí)使用)
Trp [21:20] 一般設(shè)置為0
Tsrc [19:18] 設(shè)為默認(rèn)值11
Refresh Counter [10:0] SDRAM的刷新值,Refresh period = (211-SDRAM時(shí)鐘頻率(MHX)+1)/sdram刷新周期(us)

BANKSIZE寄存器

BANKSIZE 說(shuō)明
BURST_EN [7] 0,禁止ARM核突發(fā)傳輸;1,ARM核支持突發(fā)傳輸
SCKE_EN [5] 0,不使用SCKE信號(hào)令SDRAM進(jìn)入省電模式;1,使用SCKE信號(hào)令SDRAM進(jìn)入省電模式
SCLK_EN [4] 0,時(shí)刻發(fā)出SCLK信號(hào);1,僅在訪問(wèn)SDRAM期間發(fā)出SCLE信號(hào)
BK76MAP [2:0] 配置BANK大小

SDRAM模式設(shè)置寄存器MRSRBx(6-7)

MRSRBx 說(shuō)明
CL [6:4] SDRAM時(shí)序的時(shí)間參數(shù)設(shè)置

3、存儲(chǔ)控制器實(shí)驗(yàn);點(diǎn)亮LED燈
?從NAND Flash啟動(dòng)CPU時(shí),CPU會(huì)通過(guò)內(nèi)部的硬件將NAND Flash開(kāi)始的4KB數(shù)據(jù)復(fù)制到稱(chēng)為Steppingstone的4KB的內(nèi)部RAM中(起始地址為0),然后跳轉(zhuǎn)到地址0開(kāi)始執(zhí)行。
?本實(shí)驗(yàn)先使用匯編語(yǔ)言設(shè)置好存儲(chǔ)控制器,使外接的SDRAM可用,然后把程序本身從Steppingstone復(fù)制到SDRAM,最后跳轉(zhuǎn)到SDRAM中執(zhí)行。
首先在head.S文件中,完成的工作是設(shè)置SDRAM,將程序復(fù)制到SDRAM中,然后跳轉(zhuǎn)到SDRAM繼續(xù)執(zhí)行。

.equ        MEM_CTL_BASE,       0x48000000
.equ        SDRAM_BASE,           0x30000000

.text
.global _start
_start:
    bl  disable_watch_dog               @ 關(guān)閉WATCHDOG,否則CPU會(huì)不斷重啟
    bl  memsetup                              @ 設(shè)置存儲(chǔ)控制器
    bl  copy_steppingstone_to_sdram     @ 復(fù)制代碼到SDRAM中
    ldr pc, =on_sdram                             @ 跳到SDRAM中繼續(xù)執(zhí)行
on_sdram:
    ldr sp, =0x34000000                          @ 設(shè)置堆棧
    bl  main
halt_loop:
    b   halt_loop

disable_watch_dog:
    @ 往WATCHDOG寄存器寫(xiě)0即可
    mov r1,     #0x53000000
    mov r2,     #0x0
    str r2,     [r1]
    mov pc,     lr      @ 返回

copy_steppingstone_to_sdram:
    @ 將Steppingstone的4K數(shù)據(jù)全部復(fù)制到SDRAM中去
    @ Steppingstone起始地址為0x00000000,SDRAM中起始地址為0x30000000

    mov r1, #0
    ldr r2, =SDRAM_BASE
    mov r3, #4*1024
1:  
    ldr r4, [r1],#4     @ 從Steppingstone讀取4字節(jié)的數(shù)據(jù),并讓源地址加4
    str r4, [r2],#4     @ 將此4字節(jié)的數(shù)據(jù)復(fù)制到SDRAM中,并讓目地地址加4
    cmp r1, r3          @ 判斷是否完成:源地址等于Steppingstone的未地址?
    bne 1b              @ 若沒(méi)有復(fù)制完,繼續(xù)
    mov pc,     lr      @ 返回

memsetup:
    @ 設(shè)置存儲(chǔ)控制器以便使用SDRAM等外設(shè)

    mov r1,     #MEM_CTL_BASE       @ 存儲(chǔ)控制器的13個(gè)寄存器的開(kāi)始地址
    adrl    r2, mem_cfg_val                 @ 這13個(gè)值的起始存儲(chǔ)地址
    add r3,     r1, #52                          @ 13*4 = 54
1:  
    ldr r4,     [r2], #4            @ 讀取設(shè)置值,并讓r2加4
    str r4,     [r1], #4            @ 將此值寫(xiě)入寄存器,并讓r1加4
    cmp r1,     r3                  @ 判斷是否設(shè)置完所有13個(gè)寄存器
    bne 1b                          @ 若沒(méi)有寫(xiě)成,繼續(xù)
    mov pc,     lr                  @ 返回

.align 4
mem_cfg_val:
    @ 存儲(chǔ)控制器13個(gè)寄存器的設(shè)置值
    .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

在leds.c文件中,完成led循環(huán)閃爍的實(shí)驗(yàn):


#define GPBCON      (*(volatile unsigned long *)0x56000010)
#define GPBDAT      (*(volatile unsigned long *)0x56000014)

/*
 * LED1,LED2,LED4對(duì)應(yīng)GPB5、GPB6、GPB7、GPB8
 */
#define GPB5_out    (1<<(5*2))
#define GPB6_out    (1<<(6*2))
#define GPB7_out    (1<<(7*2))
#define GPB8_out    (1<<(8*2))

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

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

    // LED1,LED2,LED3,LED4對(duì)應(yīng)的4根引腳設(shè)為輸出
    GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out;

    while(1){
        wait(30000);
        GPBDAT = (~(i<<5));     // 根據(jù)i的值,點(diǎn)亮LED1,2,3,4
        if(++i == 16)
            i = 0;
    }

    return 0;
}

Makefile的編寫(xiě)為:

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     #鏈接代碼段的起始地址為0x30000000
    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

代碼的具體流程圖為:
????07-存儲(chǔ)管理器實(shí)驗(yàn)
07-存儲(chǔ)管理器實(shí)驗(yàn)???07-存儲(chǔ)管理器實(shí)驗(yàn)
07-存儲(chǔ)管理器實(shí)驗(yàn)
實(shí)驗(yàn)結(jié)果:
07-存儲(chǔ)管理器實(shí)驗(yàn)
07-存儲(chǔ)管理器實(shí)驗(yàn)
?相比于直接在內(nèi)部SRAM運(yùn)行結(jié)果,可以發(fā)現(xiàn)在外部SDRAM運(yùn)行的LED點(diǎn)燈程序,LED閃爍變慢 。本程序只能將內(nèi)部SRAM的4KB程序復(fù)制到外部SDRAM,當(dāng)程序大于4KB時(shí),要復(fù)制4KB后的代碼,就需要使用NAND Flash控制器。
實(shí)驗(yàn)代碼

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI