實驗目的:
由於開發板(jz2440 v3)上電後從nand flash啟動cpu時,cpu會通過內部的硬體將nand flash的前4k資料複製到稱為「steppingstone」的4k內部sram中(起始位址為0),然後跳到位址0開始執行。
這個實驗我們先用組合語言設定好s3c2440晶元內部的儲存控制器,使外接的sdram可以操作使用:然後把程式本身從「steppingstone」(即晶元內部的4k sram)複製到sdram處,最後跳到sdram中執行。
知識預備:
儲存控制器(memory controller):它為cpu提供了訪問外部裝置所需的訊號,這是一種通過匯流排方式來訪問拓展的外設,在嵌入式中,這些拓展的外設可能不僅僅是記憶體,也包括網絡卡、nor flash、nand flash等等。(這裡我們可以把它想像成是cpu與拓展外設溝通的橋梁!)
s3c2440晶元對外引出了27根位址線addr0~addr26,那麼它的訪問範圍即2^7*2^20=128mb。但是這個晶元可以達到1gb的訪問空間,怎麼達到的?因為cpu還對外引出了8根片選訊號:ngcs0~ngcs7,對應於bank0~bank7。當訪問bankx的位址空間時,ngcsx引腳輸出低電平用來選中外界的裝置,故:這個晶元最多8個拓展外設,因為只有8個bank,想用相應的外設直接讓相應的ngcsx輸出低電平即可 ^~^ 看來也不是很難,就是這麼個理。
那麼問題來了,如果我們想通過cpu訪問乙個晶元需要哪些條件呢?
1.位址線(我們需要知道晶元的訪問位址)
2.資料線(我們需要知道一次傳輸多少資料,8bit/16bit/32bit 即我們常說的資料寬度)
3.時鐘/頻率(我們需要cpu與外設約定好傳輸的速率,不能太快,不能太慢,必須能滿足雙方的要求)
4.晶元相關的一些要求(比如說我們這裡是訪問sdram,那麼就得知道它的行位址,列位址,哪個l_bank,這樣我們就可以具體確定訪問晶元的哪個儲存單元了)
現在我們實驗的是通過cpu訪問sdram,那麼我們就大概的想象一下,我們可以大致的分為4個步驟:
①cpu發出的片選訊號ngcs6有效,它選中sdram晶元。(從v3原理圖可得)
②sdram中有4個l-bank,需要兩根位址訊號線選中哪乙個l-bank。(從v3原理圖我們可以知道 cpu的addr24、addr25作為l-bank的選擇訊號)
③對sdram進行統一的 行/列 定址。(這樣我們就可以確定具體訪問晶元內部哪乙個儲存單元了)
④找到儲存單元後,就要對sdram進行資料傳輸了。(這裡我們就需要知道資料寬度等等)
如果你開始沒有了解過sdram,也許上面這四個步驟你有些不大明白,沒關係啊,現在我就來穿插一下,大概的說一下這個sdram內部的儲存結構到底是個什麼鬼:
(這裡你可以先天馬行空一下,你眼前現在應該浮現出乙個長方體的蛋糕,然後你拿刀切切切,切成四塊,一塊你給它想成是乙個面,然後乙個面你就給它看成是excel**)
sdram的內部是乙個個儲存陣列,陣列就如同**一樣,將資料「填」進去。和**的檢索原理一樣,先指定乙個行(row)和乙個列(column),就可以準確的找到所需要的單元格,這就是sdram定址的基本原理,這個單元格被稱為儲存單元,這個**(儲存陣列)就是邏輯bank(logical bank,簡稱l-bank)。sdram一般分為4個l-bank。ps:這回上面的那4個步驟你就應該明白了,接下來我們就看看具體怎麼操作。
對於①,我就不廢話了。
對於②,[addr25:addr24]=0b00/0b01/0b10/0b11,就正好對應四個l-bank了。
對於③,(這個我們就得sdram的晶元手冊和原理圖結合看一下了)根據sdram的列位址線數目設定cpu相關的暫存器後,cpu就會從32位的位址中自動分出l-bank選擇訊號、行位址訊號、列位址訊號,然後先後
發出行位址訊號,列位址訊號。l-bank選擇訊號在發出行位址訊號的同時發出,並維持到列位址訊號結束。
在我們這個實驗中,行位址、列位址共用addr2~addr14,然後使用nsras、nscas來區分它們(bank6的位寬是32,也就是cpu訪問sdram,一次訪問4個位元組。而cpu的單位是byte,eg:cpu記憶體位址0x00000000、0x00000001、0x00000002、0x00000003其實訪問的都是sdram的0x00000000,即cpu真正有效的位址位是從addr2開始的,所以addr0和addr1沒用)。
通過原理圖我們可以看出,這個開發板的兩根位址線addr24、addr25作為l-bank的選擇訊號,行位址數為13,列位址數為9。當nsras訊號有效時,addr2~addr14發出的是行位址訊號,它對應32bit位址空間的
bit[23:11]。當nscas訊號有效時,addr2~addr14發出的是列位址訊號,它對應32bit位址空間的bit[10:2]。addr0、addr1恒為0,不參與解碼。
這個圖是sdram晶元手冊上的
所以此時訪問sdram的記憶體位址範圍為 0x30000000~0x30000000+0x03ffffff 即 0x30000000~0x33ffffff。
共64mb。為什麼是64mb? (2^13*2^9*4)*32bit/8 = 2^26 byte=64mb
對於④,看開發板原理圖可以得到,我們使用了倆片16位的sdram晶元併聯組成32位的位寬,與cpu的32根資料線(data0~data31)相連。
完成這個實驗的預備知識就還剩最後乙個問題了,大家想一下,我們通過cpu訪問sdram,上面我們已經把關於sdram部分的操作說完了,接下來自然而然就剩下那個「橋梁」————配置cpu內部的儲存控制器。
怎麼配置?很簡單,就是往一堆暫存器
裡寫我們需要的配置就好。而通過s3c2440晶元手冊我們可以了解到,cpu內部儲存控制器相關暫存器位址為0x48000000~0x48000030(一共13個)。
ARM 儲存控制器
初入領悟 1 bank l bank的概念 2 s3c2440內部管理sdram暫存器配置 frist part 原理分析 s3c2440為32位微處理器,其可訪問空間為4g 但其中提供1g外設訪問空間,這1g空間有8個bank組成 及平均每個bank有128m的訪問空間 其中8bank的特性為 1...
嵌入式實驗 之 DMA控制器實驗
實驗環境 實驗步驟 思考題 附錄 dma 庫函式 dma direct memory access 直接儲存器訪問,是一種可以大大減輕cpu 工作量的資料訪問方式,因而被廣泛地使用。外設工作的時候,除了轉移資料,實質上是不需要核心進行干預的,而如果資料轉移的工作現在也交給了另乙個外設,那麼在該外設進...
嵌入式ARM處理器
嵌人式多核處理器的結構包括同構 symmetric 和異構 asymmetric 兩種。同構是指內部核的結構是相同的,這種結構目前廣泛應用在pc多核處理器 而異構是指內部核的結構是不同的,這種結構常常在嵌入式領域使用,常見的是通用嵌入式處理器 dsp核。在目前嵌入式領域中,使用最為廣泛的為arm 處...