新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S3C2410 SDRAM寄存器初始化設置

        S3C2410 SDRAM寄存器初始化設置

        作者: 時間:2016-11-25 來源:網絡 收藏
        幾天前看初始化SDRAM代碼時覺得比較困難,主要是因為之前沒有接觸過這方面,毫無經驗,現在看來不難,麻煩在需要根據datasheet進行設置,好在是移植,很多強人的文章可參考。自己很容易忘事,就記錄下來吧。


        我的板子是s3c2410,使用兩片容量為32MB、位寬16bit的HY57V561620CT-H芯片拼成容量為64M、32bit的SDRAM存儲器。根據2410datasheet,要使用SDRAM需配置13個寄存器,以下逐個來看:

        本文引用地址:http://www.104case.com/article/201611/321523.htm

        1、 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的位寬,又板上的跳線決定,只讀的。我這板子BWSCON可設置為0x22111110。其實只需將BANK6對應的4位設為0010即可。

        2、 BANKCON0 – BANKCON7

        用來分別配置8個BANK的時序等參數。SDRAM是映射到BANK6和BANK7上的(內存只能映射到這兩個BANK,具體映射多大的空間,可用BANKSIZE寄存器設置),所以只需參照SDRAM芯片的datasheet配置好BANK6和BANK7,BANKCON0 – BANKCON5使用默認值0x00000700即可。

        對于BANKCON6和BANKCON7中的各個位的描述:

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

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

        (3)SCAN(bit[1:0]):Column address number(00 = 8-bit,01 = 9-bit,10= 10-bit),SDRAM列地址位數。查閱HY57V561620CT-H芯片手冊得知此值是9,所以SCAN=0b01。

        綜合以上各值,BANKCON6 – 7設為0x00018005。

        3、 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。

        4、 BANKSIZE:設置SDRAM的一些參數。其中BK76MAP(bit[2:0])配置BANK6/7映射的大小,可設置為010 = 128MB/128MB或001 = 64MB/64MB,只要比實際RAM大都行,因為bootloader和linux內核都可以檢測可用空間的。BANKSIZE=0x000000b2。

        5、 MRSRB6、MRSRB7:Mode register set register bank6/7

        可以修改的只有CL[6:4](CAS latency,000 = 1 clock, 010 = 2 clocks, 011=3 clocks),其他的全部是固定的(fixed),故值為0x00000030。這個CAS在BIOS中應該也設置過吧,對PC的速度提升很明顯哦J

        至此,13個寄存器全部配置好了,下面就可以把代碼復制到SDRAM中執行了,同樣的程序速度要比片內SRAM運行的慢不少。

        ————————————————————

        1。關于CPU和SDRAM的硬件連接參考s3c2410datasheet的“MEMORY (SROM/SDRAM) ADDRESS PIN CONNECTIONS”可以得知,那么復制4K以后的代碼需要使用NANDFLASH控制器來讀取NANDFLASH,以后的實驗中將列舉,本實驗系統啟動后將NANDFLASH開始的4K數據復制到SRAM中,然后跳轉到0地址開始執行,然后初始化存儲控制器,把程序本身從SRAM中復制到SDRAM中,最后跳轉到SDRAM中運行,程序的標號:on_sdram,這個地址在連接程序時被確定為30000010,這個是SDRAM的地址,通過ldr pc,on_sdram,程序就可以跳轉到SDRAM去了。那么on_sdram的值為什么等于31000010呢?原因在于Makefile中連接程序的命令為arm-softfloat-linux-gnu-ld -Ttext 30000000 head_yoyo.o leds_yoyo.o -o sdram_elf,意思就是代碼段的起始地址為30000000,即程序的第一條指令( bl disable_watchdog)的連接地址為30000000,其他類推,其程序標號為on_sdram的值為30000010,雖然 bl disable_watchdog,bl memsetup, bl copy_steppingstone_to_sdram,的連接地址都在SDRAM中,但是由于他們都是位置無關的相對跳轉指令,所以可以在SRAM中運行。

        @**********************************************************
        2 @ File : head_yoyo.S
        3 @ 功能 : 設置SDRAM,將程序復制到SDRAM中,并跳轉到SDRAM中運行
        4 @**********************************************************
        5
        6 .equ MEM_CTL_BASE, 0x48000000
        7 .equ SDRAM_BASE, 0x30000000
        8 .text
        9 .global _start
        10 _start:
        11 bl disable_watchdog @關閉看門狗,否則CPU不斷重啟
        12 bl memsetup @初始化SDRAM控制器
        13 bl copy_steppingstone_to_sdram @復制代碼到SDRAM
        14 ldr pc,=on_sdram
        15
        16
        17 @*********************************************************
        18 @ 子函數說明:跳轉到SDRAM中運行
        19 @*********************************************************
        20
        21 on_sdram:
        22 ldr sp,=0x34000000 @設置棧,由于棧是向下增長,實際的使用為0x340 00000-4(棧在使用之前要減4)
        bl main @跳轉到C語言
        24
        25
        26 halt_loop:
        27 b halt_loop @死循環
        28
        29 @*********************************************************
        30 @ 子函數說明:關閉看門狗
        31 @*********************************************************
        32
        33 disable_watchdog:
        34 ldr r0,=0x53000000
        35 mov r1,#0x0
        36 str r1,[r0]
        37 mov pc,lr
        38
        39 @*********************************************************
        40 @子函數說明:初始化內存控制器
        41 @*********************************************************
        42
        43 memsetup:
        mov r1,#MEM_CTL_BASE
        45 adrl r2,mem_cfg_val
        46 add r3,r1,#52
        47 1:
        48 ldr r4,[r2],#4 @將地址為R2的內存單元數據讀取到R4中,然后r2=r2 +4
        49 str r4,[r1],#4 @將r4的數據寫入到r1的內存單元,然后r1=r1+4
        50 cmp r1,r3 @比較R1,R3是否設置完所有的13個寄存器。
        51 bne 1b @如果沒有復制完,就繼續
        52 mov pc,lr @復制完后返回,b指令則不行。區別bl。
        53
        54
        55 @*****************************************************************
        56 @子函數說明:復制代碼到SDRAM,將SRAM中的4K數據全部復制到SDRAM,
        57 @ SRAM起始地址為0x00000000,SDRAM的起始地址為0x30000000
        58 @*****************************************************************
        59
        60 copy_steppingstone_to_sdram:
        61 mov r1,#0 @設置R1為SRAM的起始地址為0x00000000
        62 ldr r2,=SDRAM_BASE @設置R2為SDRAM的起始地址為0設置R1為0X300 00000
        63 mov r3 ,#4*1024 @設置R3為4K
        1:
        65 ldr r4,[r1],#4 @從SRAM中讀取4字節的數據到R4中,然后r1=r 1+4
        66 str r4,[r2],#4 @將r4中的4字節數據復制到SDRAM中,然后r2= r2+4
        67 cmp r1,r3 @判斷是否完成:SRAM的地址是否等于末地址>
        68 bne 1b @若沒有完成,繼續復制
        69 mov pc,lr @返回
        70
        71 .align 4
        72
        73 @******************************************************
        74 @存儲控制器13個寄存器的設置值
        75 @******************************************************
        76 mem_cfg_val:
        77 .long 0x22011110 @BWSCON :
        78 .long 0x00000700 @BANKCON0
        79 .long 0x00000700 @BANKCON1
        80 .long 0x00000700 @BANKCON2
        81 .long 0x00000700 @BANKCON3
        82 .long 0x00000700 @BANKCON4
        .long 0x00000700 @BANKCON5
        84 .long 0x00018005 @BANKCON6
        85 .long 0x00018005 @BANKCON7
        86 .long 0x008e07a3 @REFRESH
        87 .long 0x000000b1 @BANKSIZE
        88 .long 0x00000030 @MRSRB6
        89 .long 0x00000030 @MRSRB7
        說明:
        BWSCON:對應BANK0-BANK7,每BANK使用4位。這4位分別表示:
        a.STx:啟動/禁止SDRAM的數據掩碼引腳,對于SDRAM,此位為0;對于SRAM,此位為1。有原理圖可知Not using UB/LB (The pins are dedicated nWBE[3:0])。
        b.WSx:是否使用存儲器的WAIT信號,通常設為0
        c.DWx:使用兩位來設置存儲器的位寬:00-8位,01-16位,10-32位,11-保留。
        d.比較特殊的是BANK0對應的4位,它們由硬件跳線決定,只讀。
        對于本開發板,使用兩片容量為32Mbyte、位寬為16的SDRAM組成容量為64Mbyte、位寬為32的存儲器,所以其BWSCON相應位為: 0010。對于本開發板,BWSCON可設為0x22111110:其實我們只需要將BANK6對應的4位設為0010即可,其它的是什么值沒什么影響,這個值是參考手冊上給出的。

        BANKCON0-BANKCON5:我們沒用到,使用默認值0x00000700;

        BANKCON6-BANKCON7:設為0x00018005 在8個BANK中,只有BANK6和BANK7可以使用SRAM或SDRAM,所以BANKCON6-7與BANKCON0-5有點不同:
        a.MT([16:15]):用于設置本BANK外接的是SRAM還是SDRAM:SRAM-0b00,SDRAM-0b11
        b.當MT=0b11時,還需要設置兩個參數:
        Trcd([3:2]):RAS to CAS delay(00=2 clocks,01=3 clocks,10=4 clocks),由于使用的是HY57V561620(L)T-H,查看其手冊具體在“DEVICE OPERATING OPTION TABLE”,在100M的工作頻率下的推薦值為3clocks,所以設為推薦值0b01。
        SCAN([1:0]):SDRAM的列地址位數,(00 = 8-bit,01 = 9-bit,10= 10-bit)對于本開發板使用的SDRAM HY57V561620(L)T-H(Column Address : CA0 ~ CA8),列地址位數為9,所以SCAN=0b01。
        如果使用其他型號的SDRAM,您需要查看它的數據手冊來決定SCAN的取值:00-8位,01-9位,10-10位.

        REFRESH:設為0x008e0000+ R_CNT 其中R_CNT用于控制SDRAM的刷新周期,占用REFRESH寄存器的[10:0]位,它的取值可如下計算(SDRAM時鐘頻率就是HCLK):
        R_CNT = 2^11 + 1 – SDRAM時鐘頻率(MHz) * SDRAM刷新周期(uS)
        在未使用PLL時,SDRAM時鐘頻率等于晶振頻率12MHz;
        SDRAM 的刷新周期在SDRAM的數據手冊上有標明,在本開發板使用的SDRAM HY57V561620(L)-H的數據手冊上,可看見這么一行“8192 refresh cycles / 64ms”:所以,刷新周期=64ms/8192 = 7.8125 uS。
        對于本實驗,R_CNT = 2^11 + 1 – 12 * 7.8125 = 1955, REFRESH=0x008e0000 + 1955 = 0x008e07a3
        Trp([21:20]):設置為0即可
        Tsrc([19:18]):設置默認值即可。

        BANKSIZE:
        位[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。但是BANK7的起始地址是可變的,您可以從S3C2410數據手冊第5章“Table 5-1. Bank 6/7 Addresses”中了解到BANK6、7的地址范圍與地址空間的關系。本開發板僅使用BANK6的64M空間,我們可以令位 [2:1]=010(128M/128M)或001(64M/64M):這沒關系,多出來的空間程序會檢測出來,不會發生使用不存在的內存的情況——后面介紹到的bootloader和linux內核都會作內存檢測。
        位[6]、位[3]沒有使用。

        MRSRBx:
        能讓我們修改的只有位[6:4](CL=CAS latency,查看SDRAM的DATASHEET)這是SDRAM時序的一個時間參數,SDRAM 不支持CL=1的情況,所以位[6:4]取值為010(CL=2)或011(CL=3)。開發板保守的值為0b11。

        NOTE:
        In Power_OFF mode, SDRAM has to enter SDRAM self-refresh mode.


        1
        18
        19 #define rGPFCON (*(volatile unsigned long *)0x56000050)
        20 #define rGPFDAT (*(volatile unsigned long *)0x56000054)

        #define GPF4_OUTP (0x01<<8)
        23 #define GPF5_OUTP (0x01<<10)
        24 #define GPF6_OUTP (0x01<<12)
        25 #define GPF7_OUTP (0x01<<14)
        26
        27 void wait(unsigned long time)
        28 {
        29 for(;time>0;time--);
        30 }
        31
        32 int main()
        33 {
        34
        35 rGPFCON = GPF4_OUTP|GPF5_OUTP|GPF6_OUTP|GPF7_OUTP;
        36
        37 while(1)
        38 {
        39 wait(30000);
        40 rGPFDAT = (~1<<4);
        41 wait(30000);
        42 rGPFDAT = (~1<<5);
        43 wait(30000);
        44 rGPFDAT = (~1<<6);
        45 wait(30000);
        46 rGPFDAT = (~1<<7);
        47
        48 }
        49 }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 亳州市| 临沂市| 台安县| 汉寿县| 柳林县| 中阳县| 钟祥市| 井研县| 南通市| 牟定县| 上饶市| 德令哈市| 长葛市| 黔江区| 敦化市| 棋牌| 株洲市| 阳西县| 岐山县| 盖州市| 杭州市| 临颍县| 东海县| 远安县| 临沂市| 土默特左旗| 龙川县| 丰都县| 慈溪市| 贡山| 舟山市| 固阳县| 泾阳县| 莱阳市| 镇巴县| 泗洪县| 宣城市| 禄丰县| 图木舒克市| 宾阳县| 天柱县|