ARM開發步步深刻之SDRAM編程示例

實驗目的:改變「點燈大法」的執行地點,從NandFlash的Steppingstone轉到SDRAM中執行,藉此掌握存儲控制器的使用。

  實驗環境及說明:恆頤S3C2410開發板H2410。H2410核心板擴展有64MB的SDRAM,用於設置程序堆棧和存放各類變量。SDRAM選用了兩片三星公司的K4S561632(4M*16bit*4BANK),兩片拼成32位數據寬度的SDRAM存儲系統,並映射到S3C2410的SROM/SDRAM的BANK6,地址範圍是0x30000000~0x33FFFFFF。oop

  實驗思路:開發板上電啓動後,自動將NandFlash開始的4K數據複製到SRAM中,而後跳轉到0地址開始 執行,而後初始化存儲控制器,把程序自己從SRAM中複製到SDRAM中,最後跳轉到SDRAM中運行。故問題的關鍵是SDRAM的初始化,根據 S3C2410的Datasheet,要使用SDRAM,就需配置存儲控制器的13個寄存器。spa

  知識掌握:SDRAM和13個存儲控制器的寄存器。內存

  1、SDRAM:開發

  CPU提供了一組用於SDRAM的信號:SDRAM時鐘有效信號SCKE;SDRAM時鐘信號 SCLK0/SCLK1;數據掩碼信號DQM0/DQM1/DQM2/DQM3;SDRAM片選信號nGCS0(與nGCS6是同一引腳的兩個功 能);SDRAM行地址選通脈衝信號nSRAS;SDRAM列地址選通脈衝信號nSCAS;寫容許信號nWE(不是SDRAM專用的);get

  ★SDRAM結構:SDRAM的內部是一個存儲陣列,檢索時先指定一個行,再指定一個列,就能夠準確地找到所須要的單元格,這就是SDRAM尋址的基本原理;單元格被稱爲存儲單元,表格就是邏輯BANK,SDRAM通常含有4個邏輯BANK。it

  ★SDRAM的訪問:SDRAM片選信號nGCS0有效;邏輯BANK選擇;對選中的芯片進行統一的行/列尋 址;CPU會從32位的地址中自動分出 邏輯BANK選擇信號、行地址信號、列地址信號,而後前後發出行地址信號、列地址信號,邏輯BANK選擇信號在發出行地址信號的同時發出,並維持到列地址 信號結束;找到了存儲單元后,被選中的芯片就要進行統一的數據傳輸了。io

  2、存儲控制器的寄存器:變量

  ★BWSCON(Bus width & wait status control register,總線位寬和等待狀態控制寄存器):此寄存器用於配置BANK0~BANK7的位寬和狀態控制,每一個BANK用4位來配置,分別是:原理

  ● ST(啓動/禁止SDRAM的數據掩碼引腳。對於SDRAM,此位置0;對於SRAM,此位置1)擴展

  ● WS(是否使用存儲器的WAIT信號,一般置0爲不使用)

  ● DW(兩位,設置位寬。此板子的SDRAM是32位,故將DW6設爲10)

  特殊的是bit[2:1],即DW0,設置BANK0的位寬,由板上的跳線決定,只讀的。其實只需將BANK6 對應的4位設爲0010便可,在此處BWSCON先設置爲0x02000000。SDRAM接BANK6對應的[27:24]位,同時注意BANK0比較 特殊,以下圖所示:

  

  ★BANKCON0~BANKCON7:用來分別配置8個BANK的時序等參數。SDRAM是映射到BANK6 和BANK7上的(內存只能映射到這兩個BANK,具體映射多大的空間,可用BANKSIZE寄存器設置),因此只需參照SDRAM芯片的 Datasheet配置好BANK6和BANK7,BANKCON0~BANKCON5使用默認值0x00000700便可。對於BANKCON6和 BANKCON7中的各個位的描述:

  ●MT(bit[16:15]):設置本BANK映射的物理內存是SRAM仍是SDRAM,後面的低位就根據此MT的選擇而分開設置。本板子應置0b11,因此只須要再設置下面兩個參數

  ●Trcd(bit[3:2]):RAS to CAS delay(00=2 clocks,01=3 clocks,10=4 clocks),推2410手冊上的薦值是0b01。咱們PC的BIOS裏也能夠調節的,應該玩過吧。

  ●SCAN(bit[1:0]):Column address number(00 = 8-bit,01 = 9-bit,10= 10-bit),SDRAM列地址位數。查閱K4S561632芯片手冊得知此值是9,因此SCAN=0b01。若是使用其餘型號的SDRAM,您須要查 看它的數據手冊來決定SCAN的取值:00-8位、01-9位、10-10位。綜合以上各值,BANKCON6~BANKCON7設爲 0x00018005。

  ★REFRESH(刷新控制寄存器):此寄存器的bit[23:11]可參考默認值,或本身根據經驗修改,這裏 用0x008e0000,關鍵是最後的Refresh Counter(簡稱R_CNT,bit[10:0])的設置,2410手冊上給出了公式計算方法。SDRAM手冊上「8192 refresh cycles/64ms」的描述,獲得刷新週期爲64ms/8192=7.8125us,結合公式,R_CNT=2^11 + 1 – 12 * 7.8125 = 1955。因此可得REFRESH=0x008e0000+1995=0x008e07a3。

  ●Trp([21:20]):設置爲0便可。

●Tsrc([19:18]):設置默認值便可。

  ★BANKSIZE:設置SDRAM的一些參數。位[7]=1:Enable burst operation(0=ARM核禁止突發傳輸,1=arm核 支持突發傳輸);位[5]=1:SDRAM power down mode enable(0=不使用SCKE信號令SDRAM進入省電模式,1=使用SCKE信號令SDRAM進入省電模式);位[4]=1:SCLK is active only during the access (recommended);位[2:1]=010:BANK六、BANK7對應的地址空間與BANK0-5不一樣。BANK0-5的地址空間都是固定的 128M,地址範圍是(x*128M)到(x+1)*128M-1,x表示0到5。可是BANK6-7的起始地址是可變的,您能夠從S3C2410數據手 冊第5章"Table 5-1. BANK6-7 Addresses"中瞭解到BANK6-7的地址範圍與地址空間的關係。本開發板僅使用BANK6的64M空間,其中 BK76MAP(bit[2:0])配置BANK6/7映射的大小,可設置爲010 = 128MB/128MB或001 = 64MB/64MB,只要比實際RAM大都行,多出來的空間程序會檢測出來,不會發生使用不存在的內存的狀況(Bootloader和Linux內核都會 做內存檢測)。BANKSIZE=0x000000b2。

  ★MRSRB六、MRSRB7(Mode register set register BANK6/7,SDRAM模式設置寄存器):能夠修改的只有CL[6:4](CAS latency,000 = 1 clock, 010 = 2 clocks, 011=3 clocks),其餘的所有是固定的(fixed),故值爲0x00000030。SDRAM 不支持CL=1的狀況,因此位[6:4]取值爲010(CL=2)或011(CL=3),開發板保守的值爲0b11。

  至此,13個存儲控制器的寄存器所有介紹完了,下面就能夠配置各寄存器的值,完成SDRAM初始化,實現代碼複製到SDRAM中執行的操做(注:一樣的程序速度要比片內SRAM運行的慢)。

  存儲控制器13個寄存器的設置值:

  mem_cfg_val:

  .long 0x02000000    @BWSCON;此處只用到BANK6對應的[27:24],其它位沒理會,想理論上應該能夠?

  .long 0x00000700    @BANKCON0;BANKCON0~BANKCON5沒用到,使用默認值0x00000700

  .long 0x00000700    @BANKCON1

  .long 0x00000700    @BANKCON2

  .long 0x00000700    @BANKCON3

  .long 0x00000700    @BANKCON4

  .long 0x00000700    @BANKCON5

  .long 0x00018005    @BANKCON6

  .long 0x00018005    @BANKCON7

  .long 0x008e07a3    @REFRESH

  .long 0x000000b1    @BANKSIZE

  .long 0x00000030    @MRSRB6

  .long 0x00000030    @MRSRB7

  彙編過程主要代碼:

  .equ        MEM_CTL_BASE,       0x48000000        @ 定義存儲控制器寄存器基址

  .equ        SDRAM_BASE,         0x30000000           @ 定義SDRAM起始地址

  .text

  .global _start

  _start:

  bl  disable_watch_dog                                         @ 去關門喂狗

  bl  mem_control_setup                                        @ 去設置存儲控制器

  bl  copy_steppingstone_to_sdram                    @ 複製代碼到SDRAM中

  ldr pc, =on_sdram                                                 @ 跳到SDRAM中繼續執行

  on_sdram:

  ldr sp, =0x34000000                                             @ 設置堆棧,執行C點燈代碼

  bl  main

  halt_loop:

  b   halt_loop

相關文章
相關標籤/搜索