S3C2440 存儲控制器(memory controller)提供了訪問外部設備所需的信號,這是一種通過總線形式來訪問擴展的外設。
S3C2440 的存儲器控制器有以下的特性:
支持小字節序、大字節序(通過軟件選擇)
每個BANK的地址空間為128MB,總共1GB(8 BANKs)
可編程控制的總線位寬(8/16/32 -bit),不過 BANK0 只能選擇兩種位寬(16/32 -bit)
總共8個BANK, BANK0 ~ BANK5 可以支持外接 ROM,SRAM等,BANK6 ~ BANK7 除可以支持 ROM,SRAM外,還支持SDRAM等;
BANK0 ~ BANK6 共7個BANK的起始地址是固定的;
BANK7 的起始地址是可編程選擇;
BANK6、BANK7的地址空間大小是可編程控制的;
每個BANK的訪問周期均可編程控制;
可以通過外部的”wait“ 信號延長總線的訪問周期;
在外接SDRAM時,支持自刷新(self-refresh)和省電模式(power down mode)。
S3C2440 對外引出的27根地址線 ADDR0 ~ ADDR26 的訪問范圍只有 128MB,那么如果達到上面所說的1GB的訪問空間呢?CPU對外還引出了8根片選信號 nGCS0 ~ nGCS7,對應與 BANK0 ~ BANK7,當訪問 BANKx 的地址空間時,nGCSx 引腳輸出低電平用來選中外接的設備。這樣,每個 nGCSx 對應 128MB 地址空間,8個 nGCSx 信號總共就對應了 1GB 的地址空間。這8個 BANK的地址空間如圖:
如圖所示,左邊對應不使用 NAND Flash 作為啟動設備(單板上不接 NAND_BOOT 跳線)時的地址空間布局,右邊對應使用 NAND Flash啟動設備(單板上接 NAND_BOOT 跳線)時的地址空間布局。
S3C2440 作為32位的CPU,可以使用的地址范圍理論上達到 4GB。除去上述用于連接外設的 1GB 地址空間外,還有一部分是 CPU 內部寄存器的地址,剩下的地址空間沒有使用。
注意:這里說的是物理地址。
S3C2440 的寄存器地址范圍都處于 0x48000000 ~ 0x5FFFFFFF,各功能部件的寄存器大體相同。如圖:
源碼:
@*************************************************************************
@ File:head.S
@ 功能:設置SDRAM,將程序復制到SDRAM,然后跳到SDRAM繼續執行
@*************************************************************************
.equ MEM_CTL_BASE, 0x48000000
.equ SDRAM_BASE, 0x30000000
.text
.global _start
_start:
bl disable_watch_dog @ 關閉看門狗
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 = 52
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 個寄存器的設置值
@ 存儲控制器共有 13 個寄存器,
@ BANK0 ~ BANK5 只需要設置 BWSCON 和 BANKCONx(x為0~5)兩個寄存器:
@ BANK6、BANK7 外接SDRAM時,除 BWSCON 和 BANKCONx(x為6~7)外,還要設置
@ REFRESH、BANKSIZE、MRSRB6、MRSRB7 等4個寄存器。
@ 位寬和等待控制寄存器 BWSCON (BUS WIDTH & WAIT CONTROL REGISTER)
@ BWSCON 中每4位控制一個 BANK,最高4位對應 BANK7、接下來4位對應 BANK6,依此類推
@ STx:啟動/禁止 SDRAM 的數據掩碼引腳,對于 SDRAM,此位為0;對于 SRAM,此位為 1
@ WSx:是否使用存儲器的 WAIT 信號,通常設為 0
@ DWx:使用兩位來設置相應 BANK 的位寬, 0b00 對應8位, 0b01 對應16位,0b10 對應32位,0b11表示保留
@ 比較特殊的是 BANK0,它沒有 ST0 和 WS0,DW0([2:1])只讀---由硬件跳線決定:
@ 0b01 對應16位,0b10 對應32位,BANK0 只支持16、32兩種寬度
@ 對于本開發板(JZ2440),可以確定 BWSCON 寄存器的值為: 0x22011110
.long 0x22011110 @ BWSCON
@ BANK 控制寄存器 BANKCONx(BANK CONTROL REGISTER, x 為 0~5)
@ 這幾個寄存器用來控制 BANK0 ~ BANK5 外接設備的訪問時序,使用默認的 0x0700 即可
.long 0x00000700 @ BANKCON0
.long 0x00000700 @ BANKCON1
.long 0x00000700 @ BANKCON2
.long 0x00000700 @ BANKCON3
.long 0x00000700 @ BANKCON4
.long 0x00000700 @ BANKCON5
@ BANK 控制寄存器 BANKCONx(BANK CONTROL REGISTER, x 為 6~7)
@ 在8個BANK中,只有BANK6和BANK7可以外接SRAM或SDRAM,
@ 所以BANKCON6 ~ BANKCON7 與 BANKCON0 ~ BANKCON5 有點不同
@ MT([16:15]) 用于設置本 BANK 外接的是 ROM/SRAM 還是 SDRAM。
@ MT=0b00 時,此寄存器與 BANKCON0 ~ BANKCON5 類似。(外接SRAM)
@ MT=0b11 時,此寄存器其它值如下設置。(外接SDRAM)
@ Trcd([3:2]) RAS to CAS delay,設置推薦值為 0b01
@ SCAN([1:0]) SDRAM 的列地址位數。對于本開發板使用的 SDRAM K4S561632,
@ 列地址位數為 9, 所以 SCAN = 0b01。如果使用其他型號的 SDRAM, 需要查看其數據手冊來決定 SCAN 的取值。
@ 0b00 表示8位, 0b01 表示9位, 0b10 表示10位
@ 綜上所述,本開發板中 BANKCON6/7 均設為 0x00018005
.long 0x00018005 @ BANKCON6
.long 0x00018005 @ BANKCON7
@ 刷新控制寄存器 REFRESH(REFRESH CONTROL REGISTER): 設為 0x008C0000 + R_CNT
@ REFEN([23]) 0 = 禁止 SDRAM 的刷新功能, 1 = 開啟 SDRAM 的刷新功能
@ TREFMD([22]) SDRAM 的刷新模式。0 = CBR/Auto Refresh, 1 = Self Refresh(一般在系統休眠時使用)
@ Trp([21:20]) 設為 0 即可。
@ Tsrc([19:18]) 設為默認值 0b11 即可。
@ Refresh Counter([10:0]) 即上述的 R_CNT
@ R_CNT 可如下計算 (SDRAM 時鐘頻率就是 HCLK)
@ R_CNT = 2 ^ 11 + 1 - SDRAM 時鐘頻率(MHz) * SDRAM 刷新周期 (uS)
@ SDRAM 的刷新周期在 SDRAM 的數據手冊上有標明,在本開發板使用的 SDRAM K4S561632 的數據手冊上,
@ 可看見這么一行 "64 ms refresh period (8K Cycle)"
@ 所以,刷新周期 = 64ms/8192 = 7.8125 us
@ 在未使用 PLL 時, SDRAM 時鐘頻率等于晶振頻率 12 MHz
@ 現在可以計算: R_CNT = 2 ^ 11 + 1 - 12 * 7.8125 = 1955
@ 所以,在末使用 PLL 時, REFRESH = 0x008C0000 + 1955 = 0x008C07A3
.long 0x008C07A3 @ REFRESH
@ BANKSIZE 寄存器 REFRESH (BANKSIZE REGISTER)
@ BURST_EN([7]) 0 = ARM 核禁止突發傳輸, 1 = ARM 核支持突發傳輸
@ SCKE_EN([5]) 0 = 不使用 SCKE 信號令 SDRAM 進入省電模式, 1 = 使用 SCKE 信號令 SDRAM 進入省電模式
@ SCLK_EN([4]) 0 = 時刻發出 SCLK 信號, 1 = 僅在訪問 SDRAM 期間發出 SCLK 信號
@ BK76MAP([2:0]) 設置 BANK6/7 的大小
@ BANK6/7 對應的地址空間與 BANK0~5 不同。 BANK0~5 的地址空間大小都是固定的 128MB,
@ 地址返回是 (x*128M) 到 (x+1)*128M-1。 x表示 0 到 5。BANK6/7 的大小是可變的,
@ 以保持這兩個空間的地址連續,即 BANK7 的其實地址會隨它們的大小變化。BK76MAP 的取值意義如下:
@ 0b010 = 128M/128M
@ 0b001 = 64MB/64MB
@ 0b000 = 32MB/32MB
@ 0b111 = 16MB/16MB
@ 0b110 = 8MB/8MB
@ 0b101 = 4M/4M
@ 0b100 = 2M/2M
@ 本開發板 BANK6 外接64MB的 SDRAM, 令[2:0]=0b001 (64MB/64MB)
@ 表示 BANK6/7 的容量都是64MB,雖然 BANK7 沒有使用
@ 綜上所述,本開發板 BANKSIZE 寄存器的值可算得 0xB1
.long 0x000000B1 @ BANKSIZE
@ SDRAM 模式設置寄存器 MRSRBx (SDRAM MODE REGISTER SET REGISTER, x為6~7)
@ 能修改的只有位 CL([6:4]),這是 SDRAM 時序的一個時間參數:
@ 0b000 = 1 clocks, 0b010 = 2 clocks, 0b011 = 3 clocks
@ SDRAM K4S561632 不支持 CL = 1的情況,所以位[6:4]取值為 0b010 或 0b011 。
@ 本開發板取最保守的值 0b011, 所以 MRSRB6/7 的值為 0x30
.long 0x00000030 @ MRSRB6
.long 0x00000030 @ MRSRB7
// leds.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;
}
#Makefile
sdram.bin : head.S leds.c
arm-linux-gcc -g -c -o head.o head.S
arm-linux-gcc -g -c -o leds.o leds.c
arm-linux-ld -Ttext 0x30000000 -g 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.dis *.o
上一篇:【嵌入式Linux+ARM】存儲控制器(操作SDRAM)
下一篇:(嵌入式)關于arm中的存儲控制器(一)
推薦閱讀
史海拾趣
隨著業務的快速發展,博巨興公司在2004年決定擴大經營規模,將寫字樓搬遷至福田區彩田路彩虹大廈。這一舉措不僅提升了公司的形象,也為進一步拓展業務提供了更好的條件。同時,公司不斷加強技術研發,成功取得了蘇州市華芯微電子有限公司的代理權,進一步鞏固了在芯片代理領域的地位。
博巨興公司成立于2003年9月,初創時期,公司主要從事芯片代理及項目研發,并與臺灣巨虹電子展開了合作。憑借著對市場趨勢的敏銳洞察,公司很快取得了臺灣義隆公司在華南地區的代理權。隨著業務的不斷拓展,博巨興的業績在短短幾個月內就實現了快速增長,全年業績達到了860萬元。
隨著市場的不斷變化和客戶需求的多樣化,奇力新開始拓展產品線,推出了更多類型的電感器產品。這些產品不僅涵蓋了傳統領域,還涉及到了新能源汽車、工業控制等新興市場。為了保持市場競爭優勢,奇力新不斷加大研發投入,提升產品質量和性能。通過不斷的市場推廣和客戶服務,奇力新逐漸贏得了客戶的信任和市場的認可。
奇力新公司自創立之初,就專注于電感器的研發與生產。創始人憑借對電感技術的深入理解和市場需求的敏銳洞察,確定了公司的發展方向。在創業初期,奇力新積極引進先進的生產設備和技術人才,建立了一套完整的技術研發和生產體系。通過不斷的技術積累和創新,奇力新逐漸在電感器領域取得了領先地位。
隨著公司規模的擴大和市場份額的提升,DCCOM開始注重品牌建設和市場推廣。公司投入大量資金進行品牌宣傳和市場推廣,通過參加各種行業展會、舉辦技術研討會等方式提高品牌知名度和影響力。這些舉措使得DCCOM的品牌價值得到了顯著提升。
與桌面操作系統和服務器操作系統下的軟件開發不同,為嵌入式操作系統開發軟件可不只是寫寫應用程序那么簡單。我們常常要深入到內核,甚至要深入到硬件。根據不同的開發層面,我們把Windows CE 下的嵌入式軟件開發者分為下面三類: 第一類我們稱之 ...… 查看全部問答∨ |
|
各位好:我的平臺基于WINCE5.0 上面有帶CF 的WIFI.一旦無線網卡連接上網絡,我打開Explorer 沒有下面的錯誤信息出現。如果拔掉網卡,在打開EXPLORER 就會出現下面的信息,請問如何解決 謝謝 RaiseException: Thread=87647640 Proc=8299add0 \'ie ...… 查看全部問答∨ |
|
void TI_CC_Wait(unsigned int cycles) 延時時間 大家好 請問以下這個函數的具體延時時間是多少 // Delay function. # of CPU cycles delayed is similar to "cycles". Specifically, // it\'s ((cycles-15) % 6) + 15. Not exact, but gives a sense of the real-time // delay. Also, ...… 查看全部問答∨ |
|
用5438A做AD試驗的時候可能是電壓過大,開發板的指示燈一下子就滅了。。。 然后就是下載不了了,想知道有沒有什么辦法確定是不是芯片燒了。。。?!? 查看全部問答∨ |
|
本帖最后由 paulhyde 于 2014-9-15 03:14 編輯 小弟用ucc28019與boost 電路設計了一個電源,卻發現調解負載后,電壓也跟著變了,請問哪位大神知道是怎么回事,還望不吝賜教!?。? … 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- STM32一文通(6) 外部中斷
- ESP32玩轉MicroPython(一) 燒入固件, 初識
- ESP32玩轉MicroPython(二) 連接WIFI網絡 webperl文件傳輸
- ESP32玩轉MicroPython(三) 延時、計時 和GPIO操作
- 玩轉 ESP32 + Arduino (一) 開發環境搭建
- 玩轉 ESP32 + Arduino (四) 電容按鍵 霍爾傳感器 外部中斷 延時 脈沖檢測
- 玩轉 ESP32 + Arduino (五) platformIO引入類庫 自開發庫 串口打印字符串
- 玩轉 ESP32 + Arduino (六) 硬件定時器, IIC, SPI
- 玩轉 ESP32 + Arduino (八) U8G2驅動OLED