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

2021-01-11 電子產品世界

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

本文引用地址:http://www.eepw.com.cn/article/201612/341119.htm

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

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

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

  一、SDRAM:

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

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

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

  二、存儲控制器的寄存器:

  ★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比較特殊,如下圖所示:

  '700')this.width='700';if(this.offsetHeight>'700')this.height='700';" src="http://www.arm79.com/attachment/Mon_1005/73_67_39515ea9d909f2c.jpg" onclick="if(this.width>=700) window.open('http://www.arm79.com/attachment/Mon_1005/73_67_39515ea9d909f2c.jpg');" border="0" width="700">

  '700')this.width='700';if(this.offsetHeight>'700')this.height='700';" src="http://www.arm79.com/attachment/Mon_1005/73_67_03cf877c1a65f25.jpg" onclick="if(this.width>=700) window.open('http://www.arm79.com/attachment/Mon_1005/73_67_03cf877c1a65f25.jpg');" border="0" width="700">

  ★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:BANK6、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。

  ★MRSRB6、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

相關焦點

  • ARM-Linux開發與MCU開發的差別是什麼
    今天我們來看看ARM-Linux開發和MCU開發的不同點,以及ARM-Linux的基本開發環境。 1. ARM-Linux應用開發和單片機開發的不同 這裡先要做一個說明,對於ARM的應用開發主要有兩種方式:一種是直接在ARM晶片上進行應用開發,不採用作業系統,也稱為裸機編程,這種開發方式主要應用於一些低端的ARM晶片上,其開發過程非常類似單片機,這裡不多敘述。
  • 樂高深度掃盲之編程系列
    EV3 玩具版 31313的5個官方示例模型玩具版和教育版編程說到這才說到重點,搭建完模型的機械結構,只完成了第一步,你還需要通過編程來驅動你的模型。MindStorms官方推薦的編程方式,是使用基於NI的LabView平臺開發的圖形化編程軟體進行編程(因為定位青少年,所以要降低門檻),使用的程式語言是被稱作G語言的一種基於流程圖的可視化程式語言。
  • S3C2440-SDRAM
    0x30000000BWSCONS EQU 0x48000000 AREA |DATA|,CODE,READONLY ENTRY IMPORT LedMain bl disableWTD bl initmem bl Copy_Sdram ldr pc,=on_sdram
  • 6本最佳的Excel VBA編程書籍
    如果學習VBA編程,則可以將電子表格技術推向新的高度。有許多可用的Excel VBA編程書籍,在本文中,您將獲得有關6本最佳Excel VBA編程書籍的詳盡信息。1. Excel 2016 Power Programming With VBA這是一本了不起的書,涵蓋了所有新功能,訣竅和工具。
  • 最新ARM Development Studio開發工具介紹及各版本區別
    Arm Development Studio的組成ARM Development Studio解決了開發人員從系統設計到軟體開發的複雜挑戰。由如下套件組成,一套綜合編譯器工具組件、調試器、性能分析器、圖形開發工具以及虛擬平臺。
  • 編程貓與深圳大學合作《圖形化的人工智慧編程課程的設計與開發...
    2020年10月26日上午,教育部產學合作協同育人項目——圖形化的人工智慧編程課程的設計與開發(項目編號:201802283001)項目結題評審會在深圳大學師範學院國際會議廳順利召開。  在國家大力推進中小學人工智慧課程的大環境下,深圳大學與編程貓進行合作,利用雙方各自的優勢,設計並開發基於信息技術核心素養的人工智慧編程課程。該課程面向高校中的師範生,以期為中小學培養更加適應人工智慧大環境信息技術老師。  結題報告會上,李冰老師從項目概況、研究背景、研究內容、研究成果等方面對項目做了全面詳盡匯報。
  • 開發人員生態系統現狀,首選的程式語言有哪些?
    開發人員生態系統現狀,首選的程式語言有哪些? 接下來,我們將從 JetBrains 最新發布的《2019 開發人員生態系統現狀》報告中一窺究竟。 JetBrains 通過調查全球 7000 名開發者,解析出開發者們在日常軟體開發中最常使用的語言、框架,從而探索各種編程技術的最新趨勢,希望可以幫助更多的開發者獲取適合自己的技能。 過去一年,哪些程式語言被使用?
  • 2020十大編程博客:私藏的寶藏程式語言博客大放送
    他們的團隊經常為軟體開發人員發布有趣的教程和信息指南,比如移動和web開發框架、Java項目、軟體測試、面試問題等方面的內容。但需注意,他們每次發表的文章主題都截然不同。因此,如果只對某種特定的程式語言感興趣,它可能不是最好的選擇。Better Programming
  • 手機遊戲開發的編程軟體
    手機遊戲開發,說白了,也是經過編程軟體不斷地敲代碼敲出來的,但是呢,大家對於這門行業一直保持著好奇又疑惑地心理。對於一直從事軟體編程的人來說,這確實小兒科,但也不僅僅是小兒科,有時也相當於一座小山一般。因為,這既是一次很艱難的任務也是一件很輕鬆地旅程。
  • 2020 年七大 AI 程式語言大盤點
    隨著近年來的發展,人工智慧促進企業的發展,這該歸功於底層程式語言核心的改進。隨著人工智慧的蓬勃發展和程式語言的持續改進,對高效、熟練的程式設計師和工程師的需求激增。雖然有很多程式語言可以讓你在人工智慧上開發領域輕鬆起步,但是沒有一種程式語言可以成為人工智慧編程的「一站式」解決方案,因為每種程式語言都有自己的獨特之處。目的不同,對語言的要求也會不同。
  • 深入拆解編程貓教育,看少兒編程市場格局
    少兒編程教育並不等同於傳統意義上的編程,它並不是一上來就開始寫代碼。少兒編程教育分為三個階段:第一階段為編程啟蒙階段,通過遊戲化編程吸引孩子學習興趣;第二階段為圖形化編程階段,通過完成小小圖形化編程項目給孩子帶來成就感,第三階段為進行編程階段,可以開發孩子的創造性。PEST分析是指宏觀環境分析,適用於受宏觀環境影響大的行業分析。因此,為什麼少兒編程教育備受資本青睞?
  • 九邊形AI少兒編程線上編程課意外火爆,好評不斷,是高課程品質還是...
    芬蘭的前教育部長曾經說過在那些會編程的孩子將會是未來世界的創造者,而那些不會編程的孩子只是消費者和使用者。也有一些業內專業人士認為,在未來那些沒有掌握編程技能的孩子就會像現在不會英語的孩子一樣讓人擔心。隨著第五屆網際網路大會的召開,人工智慧成為全球矚望的焦點,而「編程學習」作為通向人工智慧不可或缺的「基礎能力」也一再成為熱門關注。
  • 和大家分享JS編程知識之JS的異常捕獲、事件實例詳解
    JS編程知識之JS的異常捕獲異常的概念什麼是異常呢?異常的拋出異常捕獲好的錯誤處理方式可以讓JS的開發、測試和部署更流暢。示例代碼如下:示例代碼如下:好了,今天的知識就分享到此,想學習更多的編程知識,請關註標標老師。
  • 資料|深入理解Python特性
    from=leiphonecolumn_res0721內容簡介 · · · · · ·本書致力於幫助Python開發人員挖掘這門語言及相關程序庫的優秀特性,避免重複勞動,同時寫出簡潔、流暢、易讀、易維護的代碼。
  • 少兒遊戲編程:孩子學習遊戲編程有哪些好處?
    因為,我個人就是從小學開始學的編程。雖然我大學沒學計算機專業,畢業後也沒有從事計算機行業,但是,我自己是有能力編寫電腦遊戲的。而且我發現,從小學習計算機編程好處非常多,不僅能提高思維能力,提高專注力,還能有效避免沉迷遊戲。那麼,一個小孩或者說是少年,學習遊戲編程具體有哪些好處呢?
  • 關於編程,系列書籍
    1、《深入理解計算機系統》本書從程式設計師的視角詳細闡述計算機系統的本質概念,並展示這些概念如何實實在在地影響應用程式的正確性、性能和實用性。全書共12章,主要內容包括信息的表示和處理、程序的機器級表示、處理器體系結構、優化程序性能、存儲器層次結構、連結、異常控制流、虛擬存儲器、系統級I/O、網絡編程、並發編程等。書中提供大量的例子和練習,並給出部分答案,有助於讀者加深對正文所述概念和知識的理解。
  • 國內外免費自學編程網站,讓你在家也能學習!
    想學編程的你可能會有這些苦惱:想學,可是沒人教;想問,又害怕別人說自己是伸手黨;想開發項目,卻不知道從何下手……如果您想要在程式設計師生涯裡有更高的成就的話,儘可能的是想著要提升編程能力,也就是多敲打代碼多動腦。
  • C sharp編程基礎之for循環實例詳解
    程式語言提供了允許更為複雜的執行路徑的多種控制結構。循環語句允許我們多次執行一個語句或語句組。執行過程四、示例代碼演示:1、用for循環向控制臺列印10次Hello World實例,代碼如下:代碼示例代碼示例
  • 從逃離到成為遊戲開發,40歲了我才學會編程
    關鍵是他給我看了一種叫做 BASIC 的語言,當時的我以為 BASIC 是世界上唯一的程式語言。我開始學習這門程式語言,並跟著讀了像《銀山之謎》(Mystery of Silver Mountain)和《捕獲獅頭象》(Hunt the Wumpus)這樣的書,很快就學會了如何編程。我開始根據 Steve Jackson 的《巫術!》(Sorcery!)