我板子的SDRAM是64M,從0x30000000"0x3fffffff,被BANK6選中。 //64MB // 0x30000000 " 0x30ffffff : Download Area (16MB) Cacheable // 0x31000000 " 0x33feffff : Non-Cacheable Area // 0x33ff0000 " 0x33ff47ff : Heap & RW Area // 0x33ff4800 " 0x33ff7fff : FIQ " User Stack Area // 0x33ff8000 " 0x33fffeff : Not Useed Area // 0x33ffff00 " 0x33ffffff : Exception & ISR Vector Table 我的開發板要求在0x32000000這個地址運行,也就是在Non-Cacheable Area這段內存區域。SDRAM內部是一個存儲陣列,陣列就如同表格一樣,將數據“填進去”。和表格的檢索原理一樣,先指定一個行(Row),再指定一個列(Column),就可以準確的找到所需要的存單元格,這就是SDRAM尋址的基本原理。這個單元格被成為存儲單元,這個表格就是邏輯BANK(Logic Bank,下文稱L-Bank),SDRAM一般含有4個L-Bank。SDRAM有13個控制寄存器。 BWSCON總線寬度與等待狀態控制寄存器 BANKCON0"BANKCON7,BANK控制寄存器 REFRESH,刷新控制寄存器 BANKSIZE寄存器 MRSRB6,MRSRB7,模式寄存器集寄存器 下面完成一個程序讓跑馬燈程序在0x0地址運行,如果是Nandflash啟動,也就是在steppingstone中運行,把它搬到SDRAM中運行。程序還是有問題有待于改進。 SADD EQU 0x30000000 BWSCONS EQU 0x48000000 AREA |DATA|,CODE,READONLY ENTRY IMPORT LedMain bl disableWTD bl initmem bl Copy_Sdram ldr pc,=on_sdram on_sdram ldr sp,=0x34000000 bl LedMain disableWTD mov r1,#0x53000000 mov r2,#0 str r2,[r1] mov pc,lr initmem ldr r1,=SDRAM_add ldr r2,=BWSCONS add r3,r2,#52 cp1 ldr r4,[r1],#4 str r4,[r2],#4 cmp r2,r3 bne cp1 mov pc,lr Copy_Sdram mov r1,#0 add r2,r1,#4096 ldr r4,=SADD cp2 ldr r3,[r1],#4 str r3,[r4],#4 cmp r1,r2 bne cp2 mov pc,lr ALIGN 4 SDRAM_add DCD 0x22011110 ;BWSCON DCD 0x00000700 ;BANKCON0 DCD 0x00000700 ;BANKCON1 DCD 0x00000700 ;BANKCON2 DCD 0x00000700 ;BANKCON3 DCD 0x00000700 ;BANKCON4 DCD 0x00000700 ;BANKCON5 DCD 0x00018005 ;BANKCON6 DCD 0x00018005 ;BANKCON7 DCD 0x008c07a3 ;REFRESH DCD 0x000000b1 ;BANKSIZE DCD 0x00000030 ;MRSRB6 DCD 0x00000030 ;MRSRB7 END #define GPFCON (*(volatile unsigned *)0x56000050) #define GPFDAT (*(volatile unsigned *)0x56000054) #define GPFUP (*(volatile unsigned *)0x56000058) int LedMain() { void Delay(unsigned int); unsigned char ledtab[]={0xf7,0xef,0xdf,0xbf}; int i; GPFUP&=0XFFFFFF87; //使能上拉F3-6 GPFCON&=0XC03f; GPFCON|=0X1540; //將F3-6設為輸出口 while(1) { for(i=0;i<4;i++) { GPFDAT=ledtab[ i]; Delay(670); } } return(0); } void Delay(unsigned int x ) { unsigned int i,j,k; for(i=0;i<=x;i++) for(j=0;j<=0xff;j++) for(k=0;k<=0xff;k++); } 李萬鵬 |