外部SRAM
文章目錄
- IS62WV51216
- 特點
- 框圖
- FSMC
- 驅動原理
- NOR PSRAM外設接口
- 存儲塊1操作簡介
- 寄存器介紹
- SRAM/NOR閃存片選控制寄存器(FSMC_BCRx)
- SRAM/NOR閃存片選時序寄存器(FSMC_BTRx)
- 寄存器組合說明
- 寫時序
- IS62WV51216寫時序
- 硬件連接
- 源碼
- 驅動代碼
- main函數
IS62WV51216
16位寬512K容量的CMOS靜態SRAM芯片
特點
高速;低功耗;兼容TTL電平;全靜態操作;三態輸出;字節控制功能。
框圖
A0~18地址線 總共19根地址線
I/00~15數據線 總共16根數據線
CS2 CS1片選信號 CS2高電平有效 CS1低電平有效
OE輸出使能信號 WE寫使能信號 UB高字節控制 LB低字節控制信號
FSMC
靈活靜態存儲控制器 可同步或異步存儲器和16位PC存儲器卡連接
驅動原理
FSMC驅動外部SRAM時,外部SRAM的控制一般有:地址線 數據線 寫信號 讀信號 片選信號 支持字節控制的UB/LB信號
NOR PSRAM外設接口
FSMC支持8/16位數據寬度
存儲塊1操作簡介
FSMCBank1 用于驅動NOR FLASH/SRAM/PSRAM 被分為四個區 每個區管理64M字節空間 每個區有獨立的寄存器對連接的存儲器進行配置 共有28根地址線尋址
內部AHB地址總線HADDR25:0對來自外部存儲器地址FSMC_A[15:0] 26:27對4個區進行尋址
不論外部接8位/16位寬設備 FSMC_A[0】永遠接外部設備地址A【0】
FSMC存儲塊1支持異步突發訪問模式:模式1 模式A-D等多種時序模型 驅動SRAM一般用模式1或者模式A
寄存器介紹
有FSMC_BCRx、FSMC_BTRx、FSMC_BWTRx寄存器
設置FSMC訪問外部存儲器時序參數 拓寬了可選用的外部存儲器的速度范圍
SRAM/NOR閃存片選控制寄存器(FSMC_BCRx)
SRAM/NOR閃存片選時序寄存器(FSMC_BTRx)
通過設置EXTMOD位,讀寫時序共用這個時序寄存器
寄存器組合說明
寫時序
IS62WV51216寫時序
IS62WV51216芯片8080并口寫時序
重點時序:寫周期時間 地址建立時間 WE脈寬(tPWE)
我們使用55ns的IS62WV51216 TWC=55ns tSA=0ns tPWE=45ns(min)
硬件連接
IS62WV51216 與STM32F407ZGT6的連接原理
源碼
驅動代碼
//FSMC_SRAM_Init函數 void FSMC_SRAM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;FSMC_NORSRAMTimingInitTypeDef readWriteTiming; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//使能PD,PE,PF,PG時鐘RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);//使能FSMC時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;//PB15 推挽輸出 控制背光GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通輸出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化//PB15 推挽輸出 控制背光GPIO_InitStructure.GPIO_Pin = (3<<0)|(3<<4)|(0XFF<<8);//PD0,1,4,5,8~15 AF OUTGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復用輸出GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIO_InitStructure.GPIO_Pin = (3<<0)|(0X1FF<<7);//PE0,1,7~15,AF OUTGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//?復用輸出GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIO_InitStructure.GPIO_Pin = (0X3F<<0)|(0XF<<12); //PF0~5,12~15GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復用輸出GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIO_InitStructure.GPIO_Pin =(0X3F<<0)| GPIO_Pin_10;//PG0~5,10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復用輸出GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化 GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);//PD0,AF12GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);//PD1,AF12GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);//PD15,AF12GPIO_PinAFConfig(GPIOE,GPIO_PinSource0,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource1,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);//PE7,AF12GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);//PE15,AF12GPIO_PinAFConfig(GPIOF,GPIO_PinSource0,GPIO_AF_FSMC);//PF0,AF12GPIO_PinAFConfig(GPIOF,GPIO_PinSource1,GPIO_AF_FSMC);//PF1,AF12GPIO_PinAFConfig(GPIOF,GPIO_PinSource2,GPIO_AF_FSMC);//PF2,AF12GPIO_PinAFConfig(GPIOF,GPIO_PinSource3,GPIO_AF_FSMC);//PF3,AF12GPIO_PinAFConfig(GPIOF,GPIO_PinSource4,GPIO_AF_FSMC);//PF4,AF12GPIO_PinAFConfig(GPIOF,GPIO_PinSource5,GPIO_AF_FSMC);//PF5,AF12GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FSMC);//PF12,AF12GPIO_PinAFConfig(GPIOF,GPIO_PinSource13,GPIO_AF_FSMC);//PF13,AF12GPIO_PinAFConfig(GPIOF,GPIO_PinSource14,GPIO_AF_FSMC);//PF14,AF12GPIO_PinAFConfig(GPIOF,GPIO_PinSource15,GPIO_AF_FSMC);//PF15,AF12GPIO_PinAFConfig(GPIOG,GPIO_PinSource0,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOG,GPIO_PinSource1,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOG,GPIO_PinSource2,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOG,GPIO_PinSource3,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOG,GPIO_PinSource4,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOG,GPIO_PinSource5,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOG,GPIO_PinSource10,GPIO_AF_FSMC);readWriteTiming.FSMC_AddressSetupTime = 0x00; //地址建立時間 ADDSET HCLK 1/36M=27nsreadWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持時間ADDHLD 模式 A 未用到 readWriteTiming.FSMC_DataSetupTime = 0x08; 數據保持時間DATAST 9個HCLK 6*9=54ns readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;readWriteTiming.FSMC_CLKDivision = 0x00;readWriteTiming.FSMC_DataLatency = 0x00;readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式AFSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;// 使用NE3 對應BTCR[4],[5]。FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; //SRAM FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存儲器數據寬度為16bit FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; //存儲器寫使能FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; // 讀寫使用相同的時序FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming; //讀寫同樣時序FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); // 使能BANK1區域3 }//FSMC_SRAM_WriteBuffer 函數 //在指定地址開始 連續寫入n個字節 //pBuffer字節指針 //WriteAddr:要寫入的地址 //n:要寫入的字節數 void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n) {for(;n!=0;n--) { *(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer; WriteAddr++;pBuffer++;} } //FSMC_SRAM_ReadBuffer函數 //在指定地址開始讀出n個字節 //pBuffer字節指針 //ReadAddr:要讀出的起始地址 //n:要寫入的字節數 void FSMC_SRAM_ReadBuffer(u8* pBuffer,u32 ReadAddr,u32 n) {for(;n!=0;n--) { *pBuffer++=*(vu8*)(Bank1_SRAM3_ADDR+ReadAddr); ReadAddr++;} }main函數
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;}} }總結
- 上一篇: easy_x是实现钟表
- 下一篇: 天空之城简谱用计算机,原神天空之城曲谱是