外部 SRAM 实验
?IS62WV51216是ISSI(Integrated Silicon Solution, Inc)公司生產的一顆16位寬512K(512*16,即1M字節)容量的CMOS靜態內存(SRAM)芯片。
IS62WV51216特點:
①高速。具有45ns/55ns訪問速度。
②低功耗。操作時:36mW;待機時:12uW。
③兼容TTL電平。
④全靜態操作。不需要刷新和時鐘電路。
⑤三態輸出。
⑥字節控制功能。支持高/低字節控制。
圖中A0~18為地址線,總共19根地址線(即2^19=512K,1K=1024);I/O0~15為數據線,總共16根數據線。CS2和CS1都是片選信號,不過CS2是高電平有效CS1是低電平有效;OE是輸出使能信號(讀信號);WE為寫使能信號;UB和LB分別是高字節控制和低字節控制信號;
IS62WV51216讀時序
重點時序: 讀周期時間(tRC) 、地址建立時間(tAA) 、OE建立時間(tDOE)?
我們開發板使用55ns的IS62WV51216,tRC=55ns tAA=55ns(Max),tDOE=25ns(Max)
IS62WV51216寫時序
?重點時序: 寫周期時間(tWC) 、地址建立時間(tSA) 、WE脈寬(tPWE)
開發板使用55ns的IS62WV51216,tWC=55ns tSA=0ns,tPWE=45ns(min)
FSMC介紹
?FSMC,即靈活的靜態存儲控制器,能夠與同步或異步存儲器和16位PC存儲器卡連接,STM32的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存儲器。FSMC的框圖如下圖所示:
FSMC驅動外部SRAM時,外部SRAM的控制一般有:地址線(如A0~A25)、數據線(如D0~D15)、寫信號(WE,即WR)、讀信號(OE,即RD)、片選信號(CS),如果SRAM支持字節控制,那么還有UB/LB信號。 ? ? ?
而IS62WV51216的信號包括:I/O0~I/O15、A0~A18、OE、WE、CS、UB、LB等,我們將這些信號依次連接STM32 FSMC接口的D0~D15、A0~A18、OE、WE、CS、UB、LB等信號即可。?
STM32的FSMC支持8/16位數據寬度,我們這里用到的SRAM是16位寬度的,所以在設置的時候,選擇16位寬就OK了。FSMC的外部設備地址映像,STM32的FSMC將外部存儲器劃分為固定大小為256M字節的四個存儲塊
STM32的FSMC存儲塊1(Bank1)用于驅動NOR FLASH/SRAM/PSRAM,被分為4個區,每個區管理64M字節空間,每個區都有獨立的寄存器對所連接的存儲器進行配置。Bank1的256M字節空間由28根地址線(HADDR[27:0])尋址。 ? ? 這里HADDR,是內部AHB地址總線,其中,HADDR[25:0]來自外部存儲器地址FSMC_A[25:0],而HADDR[26:27]對4個區進行尋址。如下表所示:
當Bank1接的是16位寬度存儲器的時候:HADDR[25:1]->FSMC_A[24:0]
當Bank1接的是8位寬度存儲器的時候:HADDR[25:0]->FSMC_A[25:0]
不論外部接8位/16位寬設備,FSMC_A[0]永遠接在外部設備地址A[0]?
STM32的FSMC存儲塊1 支持的異步突發訪問模式包括:模式1、模式A~D等多種時序模型,驅動SRAM時一般使用模式1或者模式 A,這里我們使用模式A來驅動SRAM
?對于NOR FLASH/PSRAM控制器(存儲塊1),通過FSMC_BCRx、FSMC_BTRx和FSMC_BWTRx寄存器設置(其中x=1~4,對應4個區)。通過這3個寄存器,可以設置FSMC訪問外部存儲器的時序參數,拓寬了可選用的外部存儲器的速度范圍。
SRAM/NOR閃存片選控制寄存器(FSMC_BCRx)
EXTMOD:擴展模式使能位,控制是否允許讀寫不同的時序,設置為0
WREN:寫使能位。我們需要向SRAM寫數據,故該位必須設置為1
MWID[1:0]:存儲器數據總線寬度。00,表示8位數據模式;01表示16位數據模式;10和11保留。我們的SRAM是16位數據線,所以設置WMID[1:0]=01。
MTYP[1:0]:存儲器類型。00表示SRAM、ROM;01表示PSRAM;10表示NOR FLASH;11保留。我們驅動的芯片為SRAM,所以需要設置MTYP[1:0]=00。
MBKEN:存儲塊使能位。需設置為1?。
SRAM/NOR閃存片選時序寄存器(FSMC_BTRx)
ACCMOD[1:0]:訪問模式。00:模式A;01:模式B;10:模式C;11:模式D。 DATAST[7:0]:數據保持時間,等于: DATAST(+1)個HCLK時鐘周期,DATAST最大為255。對IS62WV51216來說,其實就是OE/WE低電平持續時間,最大為55ns。對STM32F1,一個HCLK=13.8ns (1/72M),設置為3;對STM32F4,一個HCLK=6ns(1/168M) ,設置為8。 ADDSET[3:0]:地址建立時間。表示:ADDSET (+1)個HCLK周期,ADDSET最大為15。對IS62WV51216來說,訪問周期最快位55ns,而我們前面的設置,已經可以保證訪問周期不小于55ns,因此這個地址建立時間,我們可以直接設置為0即可。?
因為設置了EXTMOD位,所以讀寫時序共用這個時序寄存器!
寄存器組合說明
在ST官方庫提供的的寄存器定義里面,并沒有定義FSMC_BCRx、FSMC_BTRx、FSMC_BWTRx等這個單獨的寄存器,而是將他們進行了一些組合。規律如下: ?? ?
FSMC_BCRx和FSMC_BTRx,組合成BTCR[8]寄存器組,他們的對應關系如下:
BTCR[0]對應FSMC_BCR1,BTCR[1]對應FSMC_BTR1
BTCR[2]對應FSMC_BCR2,BTCR[3]對應FSMC_BTR2
BTCR[4]對應FSMC_BCR3,BTCR[5]對應FSMC_BTR3
BTCR[6]對應FSMC_BCR4,BTCR[7]對應FSMC_BTR4
FSMC_BWTRx則組合成BWTR[7],他們的對應關系如下:
BWTR[0]對應FSMC_BWTR1,BWTR[2]對應FSMC_BWTR2,
BWTR[4]對應FSMC_BWTR3,BWTR[6]對應FSMC_BWTR4,
BWTR[1]、BWTR[3]和BWTR[5]保留,沒有用到。
硬件連接
?代碼講解:
sram.c 文件:此部分代碼包含 3 個函數,FSMC_SRAM_Init 函數用于初始化,包括 FSMC 相關 IO 口的 初始化以及 FSMC 配置;FSMC_SRAM_WriteBuffer 和 FSMC_SRAM_ReadBuffer 這兩個函數分 別用于在外部 SRAM 的指定地址寫入和讀取指定長度的數據(字節數)。 這里需要注意的是:FSMC 當位寬為 16 位的時候,HADDR 右移一位同地址對其,但是 ReadAddr 我們這里卻沒有加 2,而是加 1,是因為我們這里用的數據為寬是 8 位,通過 UB 和 LB 來控制高低字節位,所以地址在這里是可以只加 1 的。另外,因為我們使用的是 BANK1, 區域 3,所以外部 SRAM 的基址為:0x68000000。
main.c文件
u32 testsram[250000] __attribute__((at(0X68000000)));//測試用數組 //外部內存測試(最大支持1M字節內存測試) void fsmc_sram_test(u16 x,u16 y) { u32 i=0; u8 temp=0; u8 sval=0; //在地址0讀到的數據 LCD_ShowString(x,y,239,y+16,16,"Ex Memory Test: 0KB"); //每隔4K字節,寫入一個數據,總共寫入256個數據,剛好是1M字節for(i=0;i<1024*1024;i+=4096){FSMC_SRAM_WriteBuffer(&temp,i,1);temp++;}//依次讀出之前寫入的數據,進行校驗 for(i=0;i<1024*1024;i+=4096) {FSMC_SRAM_ReadBuffer(&temp,i,1);if(i==0)sval=temp;else if(temp<=sval)break;//后面讀出的數據一定要比第一次讀到的數據大. LCD_ShowxNum(x+15*8,y,(u16)(temp-sval+1)*4,4,16,0);//顯示內存容量 } } int main(void) { u8 key; u8 i=0; u32 ts=0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2delay_init(168); //初始化延時函數uart_init(115200); //初始化串口波特率為115200LED_Init(); //初始化LEDLCD_Init(); //LCD初始化KEY_Init(); //按鍵初始化 FSMC_SRAM_Init(); //初始化外部SRAM POINT_COLOR=RED;//設置字體為紅色 LCD_ShowString(30,50,200,16,16,"Explorer STM32F4"); LCD_ShowString(30,70,200,16,16,"SRAM TEST"); LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,110,200,16,16,"2014/5/14"); LCD_ShowString(30,130,200,16,16,"KEY0:Test Sram");LCD_ShowString(30,150,200,16,16,"KEY1:TEST Data");POINT_COLOR=BLUE;//設置字體為藍色 for(ts=0;ts<250000;ts++)testsram[ts]=ts;//預存測試數據 while(1){ key=KEY_Scan(0);//不支持連按 if(key==KEY0_PRES)fsmc_sram_test(60,170);//測試SRAM容量else if(key==KEY1_PRES)//打印預存測試數據{for(ts=0;ts<250000;ts++)LCD_ShowxNum(60,190,testsram[ts],6,16,0);//顯示測試數據 }else delay_ms(10); i++;if(i==20)//DS0閃爍.{i=0;LED0=!LED0;}} }此段代碼,我們定義了一個超大數組 testsram,我們指定該數組定義在外部 sram 起始地址 (__attribute__((at(0X68000000)))),該數組用來測試外部 SRAM 數據的讀寫。注意該數組的定 義方法,是我們推薦的使用外部 SRAM 的方法。如果想用 MDK 自動分配,那么需要用到分散 加載還需要添加匯編的 FSMC 初始化代碼,相對來說比較麻煩。而且外部 SRAM 訪問速度又遠 不如內部 SRAM,如果將一些需要快速訪問的 SRAM 定義到了外部 SRAM,將會嚴重拖慢程序 運行速度。而如果以我們推薦的方式來分配外部 SRAM,那么就可以控制 SRAM 的分配,可以 針對性的選擇放外部還是放內部,有利于提高程序運行速度,使用起來也比較方便。
總結
以上是生活随笔為你收集整理的外部 SRAM 实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python摄像头动作捕捉_OpenMM
- 下一篇: SRAM和SDRAM的简单介绍