【ARM裸板】內存控制器、SDRAM基礎與代碼重定位

示例代碼下載

1.CPU如何控制外設?

  • CPU控制相應外設的寄存器,有外設控制器發出特定的波形

2.CPU如何選擇寄存器?

  • CPU通過內存控制器選擇
發出地址addr
根據地址選擇不同的模塊
CPU
內存控制器
讀寫數據

3.外設共用地址、數據總線,如何互不干擾?

  • 通過片選CS引腳,選擇不同的外設

4.誰控制片選引腳

發出地址addr
根據地址發出片選信號
CPU
內存控制器
使能相應的外設

  • 由芯片手冊得知:當CPU發出地址是0x00000000時 nGCS0爲低電平選擇(有效)
    在這裏插入圖片描述

5.CPU如何讀寫數據的方向?

  • 通過外設芯片的讀寫引腳控制

6.CPU不同位寬設備如何連接並讀取數據【內存控制器】

6.1 連接方式

  • 8bit ROM (從A0開始對應連接)
    在這裏插入圖片描述

  • 16bit ROM (A0不接,從A1開始)
    在這裏插入圖片描述

  • 32bit ROM(A0、A1不接,從A2開始)
    在這裏插入圖片描述

6.2 CPU讀取ROM數據1個字節

  • 例如在 地址3上讀取一個字節數據
mov R0.#3
LDRB R1,[R0]

過程 CPU發出的地址 ROM接收到的地址 ROM返回的數據 內存控制器挑出指定字節送給CPU
8bit 000011 000011 第3個byte 第3個byte
16bit 000011 00001 第1個16bit 根據A0=1,挑出16bit中的第1個byte給CPU(從0byte開始)
32bit 000011 00000 第0個32bit 根據A0 A1=11挑出第3個byte給CPU(從0byte開始)
  • 綜上,也就是所有的地址線都會用到,內存控制器根據未接的地址線狀態判斷挑出指定的byte

6.3 CPU讀取ROM數據4個字節

mov R0,#4
LDR R1,[R0]  ;從地址4上取出4個字節

過程 CPU發出的地址 內存控制器轉發給ROM的地址 ROM返回的數據 內存控制器組裝數據返回給CPU
8bit 000100 000100、000101、000110、000111(共四次) 得到地址4、5、6、7上的byte 組裝給一個32bit數據給CPU
16bit 000100 00010、00011(共兩次) 得到第2、3個16bit 組裝給一個32bit數據給CPU
32bit 000100 0001(共一次) 得到第1個32bit 直接發送給CPU

7.如何根據原理圖確定芯片訪問地址

7.1 方法

7.2 Nor Flash確定訪問地址

  • 例如Nor Flash芯片:用到A20~A021條線
  • 地址線21:即可訪問2M內存,0x1FFFFF
  • 根據它片選信號爲nGCS0可以得到基地址BASE = 0x00000000
  • 其範圍爲BASE+0x0000 0000 ~ BASE+0x001F FFFF,即0x0000 0000 ~ 0x001F FFFF

在這裏插入圖片描述

7.3 Net芯片確定訪問地址

  • 例如網卡net芯片:只連接了A2,但是其A0是用來確定16bit(網卡數據線爲16位)中的高8位還是低8位,因此A2 A0
  • 根據其片選引腳爲nGCS4,可以得到基地址BASE = 0x2000 0000
  • 其範圍爲BASE+0x0000 0000 ~ BASE+0x0000 0101,即0x2000 0000 ~ 0x2000 0005
    在這裏插入圖片描述

8. Nor Flash時序分析

8.1 MX29LV160 讀數據時序

在這裏插入圖片描述

在這裏插入圖片描述

  • Taa:發出地址信號之後多長時間數據有效
  • Tce:發出片選信號之後多長時間數據有效
  • Toe:發出讀信號之後多長時間數據有效
  • Toh:數據保持時間
  • Tdf:數據浮動時間
  • Trc:讀取週期時間(70ns,即讀取速率最大爲70ns)

8.2 S3C2440 可編程訪問週期時序

  • 爲了方便,使得Addr、CS、OE信號同時拉低使能,然後確保Tacc>=70ns,即可滿足Nor Flash的時序
  • 則當HCLK=100M,內存控制器週期爲T=10ns,Tacc = 8T即可
    在這裏插入圖片描述

在這裏插入圖片描述

9.代碼重定位

1.Nand啓動時,一上電,硬件會把前4K數據複製到SRAM
2.CPU從0地址運行

如果程序大於4K,前4K的代碼需要把整個程序讀取出來放到SDRAM重定位:重新確定程序地址】

9.1 Nor Flash特點

  • 可以像內存一樣的讀取
  • 不可以像內存一樣直接寫入(寫入有保護)

9.2 Nor直接寫入的結果

  • 程序中含有需要修改(寫入)的變量,寫在Nor上,直接修改變量是無效的
  • 因此需要重定位,放到SDRAM上

9.3 實驗

  • 以Nor Flash 啓動,修改一變量,改變量並不會被修改,即無效

  • 以Nand Flash 啓動,修改一變量,改變量會被修改

9.4 程序包含哪幾部分

代碼段text 代碼
數據段data (一般的全局變量)
只讀數據段rodata const 全局變量
bss 初值爲0或無初值的全局變量 不保存在bin文件中
comment 註釋 不保存在bin文件中
  • bss:是“Block Started bySymbol”的縮寫,意爲“以符號開始的塊”。 BSS是Unix鏈接器產生的未初始化數據段。
    • bss段與註釋段不保存在bin文件中
char g_Char = 'A'; //定義全局變量
const char g_Char2 = 'B'; //只讀全局變量
int g_A = 0; //初值爲0的全局變量
int g_B; //未定義初值的全局變量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章