首先看2440的地址線:mini2440原理圖.pdf
2440的芯片提供了27根地址線=128M。
S3c2440芯片對外提供的引腳上,只給出了27根地址線addr[0:26].這27根引腳地址線,只能訪問128M的外設(shè)空間。
為了擴(kuò)大外設(shè)的訪問范圍,S3c2440芯片又提供了8個片選信號nGCS0~nGCS7。當(dāng)某個片選信號nGCSx有效時,則可以通過27根地址線去訪問對應(yīng)這個片選的128MB空間。由于有8個片選,所以2440芯片能訪問的外設(shè)空間總共為8*128MB=1GB.而1G(0x40000000)以上的空間,則安排給了2440內(nèi)部的寄存器,訪問這些內(nèi)部的寄存器,則是通過32位的處理器內(nèi)部總線來完成的。
8個片選信號引腳:
接下來看看芯片手冊的信息:
S3C2440.pdf的5. Memory Controller
片選6和7一般是安排內(nèi)存的位置,2440也是,在片選6和7是SROM和SDRAM??梢钥吹?440內(nèi)存的起始地址是0x30000000.
存儲控制器:
由上圖可知,要去訪問內(nèi)存,NorFlash,網(wǎng)卡芯片等。是通過存儲控制器來訪問的。例如訪問內(nèi)存地址,我們知道要訪問內(nèi)存的地址需要提供L-Bank,行地址和列地址,可我們在訪問的時候只給出一個例如0x30006000的詳細(xì)地址。那處理器怎么知道所謂的L-Bank,行地址和列地址呢?這就是需要存儲控制器,他會把詳細(xì)的地址單元分解為L-Bank,行地址和列地址供CPU訪問。
要讓存儲控制器完成對外設(shè)的訪問,是通過它提供的一系列寄存器來進(jìn)行的。
第一個寄存器是:BWSCON寄存器的功能四控制總線寬度和等待狀態(tài)。
從寄存器的各個位看到,它的32位被分為8組,31-28位是控制Bank7的,以此類推。
31-28是控制bank7的,設(shè)置為0010,首先31沒有使用,所以是0,30位暫時不使用也設(shè)置為0,然后bank7內(nèi)存芯片是通過兩個16位的內(nèi)存芯片合并成一個32位的內(nèi)存芯片,所以是32位的,所28-29是10。Bank6也是一樣的,都是鏈接SDRAM的。剩下的暫時不用都是默認(rèn)值0.值為0x22000000.
然后對bank0到bank5對應(yīng)的六個寄存器,由于暫時不用,也是保持默認(rèn)值:0x07000000
接下來是Bank6和Bank7的控制寄存器:
從上面知道由于這里使用的是SDRAM,所以[16:15]的值為11;然后這里的Memory Type,我們2440是SDRAM是下面的參數(shù)值,所以[14:4]=00000000000;
然后末四位,[3:2]是控制行列信號的延時,下圖可以看到是兩個時鐘周期,所以是00.
前面知道,內(nèi)存地址很像一張表格,里面是由行地址和列地址來確定單元格的位置的。那么列地址有多少位呢?就是通過[1:0]位指定的。
在:HY57V561620.pdf文檔看到:列地址是CA 0~CA8是9位的,所以[1:0]=01.最后該寄存器的值為:11000000000000001=0x18001
所以Bank6和Bank7的值為0x00018001.
接下來的寄存器是:REFRESH寄存器:
在前面的筆記知道,SDRAM里面存儲信息是通過電容的電荷來記錄信息的,就需要定期充電的操作,否則信號失真,所以需要定期刷新。
從上面知道,[23]位是控制是否要刷新的,這里是要刷新的。所以REFEN[23]是為1的。TREFMD[22]位控制的是自動刷新還是自主刷新,這里選的是自動刷新,所以該位為0. Trp[21:20]兩位控制的是準(zhǔn)備充電的時間,下面可以看到準(zhǔn)備時間是2個時鐘,所以是00.
接著是Tsrc是,一行進(jìn)行刷新的持續(xù)時間,一般是7個時鐘,所以是11.[17:16]是不使用的是00.[15:11]五位也是一樣的00000.最后是[10:0]Refresh Counter域的大小11位,是控制多就刷新一次的,后面的公式里HCLK是提供給內(nèi)存的時鐘,在前面知道它是ARMCLK的四分之一,ARMCLK選的是533MHz,它的四分之一是133MHz。
然而下面它給出了一個例子:如果HCLK是100MHz,那么:
Refresh count=+1-100*7.8=1269.
而我們的是133MHz,所以是:
Refresh count=+1-133*7.8= 1011.6=1011=b01111110011
最后該寄存器的值是:100011000000001111110011=0x8C03F3=0x008C03F3
接下來是BANKSIZE寄存器,這個寄存器:
這個寄存器只有前面加個為:[7]是BURST_EN突發(fā)模式,所謂的突發(fā)模式就是訪問內(nèi)存數(shù)據(jù)的時候可以使用批量的數(shù)據(jù),提高訪問效率,打開是設(shè)置1。[6]位是保留位。[5]位是節(jié)電模式,設(shè)置為1.[4]位建議設(shè)置為1,就選1好了。[3]保留。[2:0]是bank6.7的大小的,知道是兩片32M的,組成64M的,所以是001.最后的值是:10110001=0x000000b1
最后一組寄存器是控制bank6和bank7的模式的,兩個是一樣的:
在這組寄存器中,只有幾個位,而且很多都是Fixed固定的,看到只需要設(shè)置[CL]位。所謂的CL就是CAS的潛伏期,什么叫CAS信號的潛伏期?看一段時序圖:
潛伏期就是從RAS信號變成低電平,到CAS變?yōu)榈碗娖?,這段之間的時鐘,從上圖知道是3,上圖知道3個時鐘對應(yīng)的是011。所以這兩個寄存器的值是0x00000030.
到這里內(nèi)存控制的寄存器都在上面的信息,接下來是2440存儲控制器代碼的編寫:
上面為了初始化儲存控制器,需要設(shè)置13寄存器,如果每一個寄存器都需要ldr指令取出,然后再置數(shù),第三在str指令存入,這樣需要39條指令。這樣感覺很是沒效率。而且代碼是差不多的,在別的編程語言,會有循環(huán)來處理。接下來也用循環(huán)來給寄存器置數(shù)。
最后實現(xiàn)的代碼是:
#define mem_contrl 0x48000000 //13個寄存器的第一個寄存器的地址
init_sdram:
ldr r0, =mem_contrl //把第一個寄存器的地址存入r0寄存器
add r3, r0, #4*13 //把最后一個寄存器的地址存入r3,總共13個寄存器。
adrl r1, data //adrl指令,把data標(biāo)號的基地址傳給r1
0: //
ldr r2, [r1], #4 //把r1寄存器指向數(shù)據(jù)表的第一個數(shù)據(jù)取出,放到r2寄存器里,r1+4指
//向數(shù)據(jù)表的下一個數(shù)據(jù)的地址。
str r2, [r0], #4 //把r2寄存器里的值傳給r0寄存器所指向的地址,然后r0+4指向寄存器
//表的下一個寄存器。
cmp r0, r3 //比較r0和r3的地址,看是否到了寄存器表的末尾。如果相等結(jié)束程序。
bne 0b //如果不相等,則bne,b是跳轉(zhuǎn),條件ne=no equal,標(biāo)識是0,b是before往
//前跳轉(zhuǎn)
mov pc, lr //返回
data:
.long 0x22000000 //.long 偽指令,指明長度。
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00018001
.long 0x00018001
.long 0x008c04f5
.long 0x000000b1
.long 0x00000030
.long 0x00000030
上面代碼的過程可以用下圖解釋:
整個過程:把要寫入寄存器的值:可以創(chuàng)建一個數(shù)據(jù)表的存儲結(jié)構(gòu)把它們存起來。這里定義了Data數(shù)據(jù)表,然后知道寄存器的地址是遞增的。所以只要定義一個標(biāo)識來存起來,標(biāo)識的地址就是數(shù)據(jù)的開始地址,寄存器的開始地址是知道的。然后就可以吧D1里的值傳給P1所指向的地址,遞增寄存器地址。循環(huán)上述操作。直到寄存器的地址表末尾就結(jié)束。這樣就在匯編里,使用了循環(huán)結(jié)構(gòu),往連續(xù)地址的寄存器里存入了指定的數(shù)據(jù)。
上一篇:31.6410內(nèi)存的知識
下一篇:29.內(nèi)存的基礎(chǔ)知識
推薦閱讀最新更新時間:2025-06-30 11:15






設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- 使用 MaxLinear, Inc 的 SPX385AN-1.2/TR 的參考設(shè)計
- LTC4089,通用鋰離子電池充電器可在僅 2cm2 的面積內(nèi)從 USB 和 6V 至 36V 輸入供電
- LTC3425 的典型應(yīng)用 - 5A、8MHz、4 相同步升壓型 DC/DC 轉(zhuǎn)換器
- LT1934ES6 3.3V降壓轉(zhuǎn)換器典型應(yīng)用電路
- 使用 Analog Devices 的 LT1764AEFE-1.5 的參考設(shè)計
- EVAL-ADUC7039QSPZ,用于汽車系統(tǒng)的 ADUC7039 集成精密電池傳感器的評估板
- ADP1612-BL1-EVZ,用于 ADP1612 升壓轉(zhuǎn)換器的空白評估板
- DI-132 - 1.75W高效率線性充電器替代品
- 使用 MaxLinear, Inc 的 XRP7618IGB-F 的參考設(shè)計
- 基于STM32的貪吃蛇游戲設(shè)計(程序、PCB)
- 正向 DCDC 巧改負(fù)壓?GM2406/GM24061反向操作指南!
- 『新品發(fā)布』共模半導(dǎo)體重磅發(fā)布40V、4A/6A低EMI車規(guī)級同步降壓穩(wěn)壓器 GM2406
- Bourns 推出專為光伏應(yīng)用設(shè)計 POWrFuse? 大功率電力保險絲系列,具備 1500 VDC 額定值
- 納芯微推出車規(guī)級自動雙向型電平轉(zhuǎn)換器NCAS0104和NCAB0104
- 瑞薩電子推出全新GaN FET,增強高密度功率轉(zhuǎn)換能力, 適用于AI數(shù)據(jù)中心、工業(yè)及電源系統(tǒng)應(yīng)用
- 芯對話 | 芯佰微CBM8605/CBM8606/CBM8608運算放大器 精密信號鏈的核心解決方案
- 物聯(lián)網(wǎng)技術(shù)促進(jìn)能量收集創(chuàng)新應(yīng)用落地
- Proximus Global旗下公司BICS與Epic Malta合作,為2G/3G網(wǎng)絡(luò)退役后保障旅行者漫游連接
- 大聯(lián)大世平集團(tuán)推出以NXP產(chǎn)品為核心的HVBMS BJB方案
- 適用于高速應(yīng)用的先進(jìn)全局快門圖像傳感器