系統(tǒng)運維
?S3C2440的存儲控制器提供了訪問外設所需要的信號,它有如下特性:
三都網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、成都響應式網(wǎng)站建設等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)成立于2013年到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選創(chuàng)新互聯(lián)。支持大/小端字節(jié)(通過軟件選擇);
每個BANK的地址空間為128MB,總共1GB(8個BANK);
可編程控制的總線寬度(8/16/32bit),BANK0只有兩種位寬(16/32bit);
總共8個BANK:BANK0-BANK5可以支持外接ROM、SRAM等;BANK6-BANK7除了支持ROM、SRAM外,還支持SDRAM等;
BANK0-BANK6七個BANK的起始地址固定;
BANK7的起始地址可編程選擇;
每個BANK的訪問周期均可編程控制;
通過外部的wait信號延長總線的訪問周期;
在外接SDRAM時,支持自刷新和省電模式模式。
?S3C2440對外引出的27根地址線ADDR0-ADDR26的訪問范圍只有128MB,而八個片選信號nGCS0-nGCS7對應于BANK0-BANK7,當訪問BANKx的地址空間時,nGCSx引腳輸出低電平用來選中外接的設備。每個nGCSx對應128MB地址空間,8個nGCSx信號總共對應了1GB。
?在TQ2440開發(fā)板中BANK6連接SDRAM,CPU對其提供了一組用于SDRAM的信號:
SDRAM時鐘有效信號LSCKE;
SDRAM時鐘信號LSCLK0/LSCLK1;
數(shù)據(jù)掩碼信號LnWBE0/LnWBE1/LnWBE2/LnWBE3;
SDRAM行地址選通脈沖信號LnSRAS;
SDRAM列地址選通脈沖信號LnSCAS;
寫允許信號LnWE
????
1、SDRAM介紹
?SDRAM的內部是一個存儲陣列,如同一個二維表格,將數(shù)據(jù)填進去。其檢索原理和表格相同,先指定一個行地址,再指定一個列地址就可以準確找到所需要的單元格。這個單元格被稱為存儲單元,而表格則稱為邏輯BANK(L-BANK),SDRAM一般有4個L-BANK其邏輯圖為上圖所示。
?訪問SDRAM可以分為如下四個步驟:
1、CPU發(fā)出的片選信號LnSCS0有效;
2、SDRAM中有4個L-BANK,需要兩根地址線來選中其中一個,從圖中可知使用ADDR24、ADDR25作為L-BANK選擇信號;
3、對選中的芯片進行統(tǒng)一行/列(存儲單元)尋址;
4、找到存儲單元后,被選中的芯片進行同一的數(shù)據(jù)傳輸。
?在TQ2440開發(fā)板中使用了兩片16位的ADRAM芯片并聯(lián)組成32位的位寬,與CPU的32根數(shù)據(jù)線(DATA0-DATA31)相連。BANK6的起始地址為0x30000000,所以SDRAM的訪問地址為0x30000000-ox33ffffff,共64MB。
2、存儲控制器的寄存器使用
?在S3C2440中,存儲控制器一共有13個寄存器,BANK0-BANK5只需要設置BWSCON和BANKCONx(x為0-5)兩個寄存器,BANK6/BANK7外接SDRAM時,除了WSCON和BANKCONx(x為6-7)外,還需要設置REFRESH、BANKSIZE、MRSRB6、MRSRB7等四個寄存器。下面分別說明每個寄存器。
位寬和等待控制寄存器BWSCON
?對于BANK0,它沒有ST0和WS0、DW0([2:1]),bank0只支持兩種位寬16/32。
BANK控制寄存器BANKCONx(x為0-5),控制BANK0-BANK5外接設備的訪問時序,使用默認的0x0700即可滿足TQ2440開發(fā)板。
BANK控制寄存器BANKCONx(x為6-7),在8個BANK中,只有BANK6和BANK7可以外接SRAM或SDRAM,因此其設置方法有所不同。
刷新控制寄存器REFRESH
BANKSIZE寄存器
SDRAM模式設置寄存器MRSRBx(6-7)
3、存儲控制器實驗;點亮LED燈
?從NAND Flash啟動CPU時,CPU會通過內部的硬件將NAND Flash開始的4KB數(shù)據(jù)復制到稱為Steppingstone的4KB的內部RAM中(起始地址為0),然后跳轉到地址0開始執(zhí)行。
?本實驗先使用匯編語言設置好存儲控制器,使外接的SDRAM可用,然后把程序本身從Steppingstone復制到SDRAM,最后跳轉到SDRAM中執(zhí)行。
首先在head.S文件中,完成的工作是設置SDRAM,將程序復制到SDRAM中,然后跳轉到SDRAM繼續(xù)執(zhí)行。
.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中繼續(xù)執(zhí)行
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數(shù)據(jù)全部復制到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ù)復制到SDRAM中,并讓目地地址加4
cmp r1, r3 @ 判斷是否完成:源地址等于Steppingstone的未地址?
bne 1b @ 若沒有復制完,繼續(xù)
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 @ 若沒有寫成,繼續(xù)
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
在leds.c文件中,完成led循環(huán)閃爍的實驗:
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)
/*
* LED1,LED2,LED4對應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對應的4根引腳設為輸出
GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out;
while(1){
wait(30000);
GPBDAT = (~(i<<5)); // 根據(jù)i的值,點亮LED1,2,3,4
if(++i == 16)
i = 0;
}
return 0;
}
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 #鏈接代碼段的起始地址為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
代碼的具體流程圖為:
????
???
實驗結果:
?相比于直接在內部SRAM運行結果,可以發(fā)現(xiàn)在外部SDRAM運行的LED點燈程序,LED閃爍變慢 。本程序只能將內部SRAM的4KB程序復制到外部SDRAM,當程序大于4KB時,要復制4KB后的代碼,就需要使用NAND Flash控制器。
實驗代碼
分享名稱:07-存儲管理器實驗
路徑分享:http://jinyejixie.com/article48/chojhp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供手機網(wǎng)站建設、ChatGPT、定制網(wǎng)站、服務器托管、企業(yè)網(wǎng)站制作、移動網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)