44_外部SRAM实验

news/2024/12/22 2:08:51/

目录

IS62WV51216简介

IS62WV51216框图

IS62WV51216读时序

IS62WV51216写时序

FSMC简介

FSMC寄存器介绍

硬件连接图

实验源码


IS62WV51216简介

IS62WV51216ISSi (Integrated Silicon Solution,Inc)公司生产的一颗16位宽512K (512*16,即1M字节)容量的CMOS静态内存(SRAM)芯片。

高速。具有45ns/55ns访问速度。

低功耗。操作时: 36mW;待机时: 12uW。

兼容TTL电平。

全静态操作。不需要刷新和时钟电路。

三态输出

字节控制功能。支持高/低字节控制。

IS62WV51216框图

 图中A0~18为地址线,总共19根地址线(即219=512K, 1K-1024)و1/00~15为数据线,总共16根数据线。CS2和CS1都是片选信号,不过CS2是高电平有效CS1是低电平有效OE是输出使能信号(读信号); WE为写使能信号; UB和LB分别是高字节控制和低字节控制信号;

IS62WV51216读时序

读周期时间(tRC)

地址建立时间(tAA)

OE建立时间(tDOE)

开发板使用55ns的IS62WV51216, tRC=55nstAA=55ns (Max) , tDOE=25ns (Max)

IS62WV51216写时序

写周期时间(tWC)

地址建立时间(tSA)

WE脉宽(tPWE)

开发板使用55ns的IS62WV51216, tWC=55nstSA=Ons, 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的信号,包括: 1/00-1/015、A0-A18、OE、WE、CS、UB、LB等,我们将这些信号依次连接STM32 FSMC接口的DO-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,其他模式说明详见: STM32中文参考手册-FSMC章节。

 NBL0对应UB NBL1对应LB

FSMC寄存器介绍

对于NORFLASH/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表示NORFLASH: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来说,其实就是OEWE低电平持续时间,最大为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,FSMĞ_BWTRx等这个单独的寄存器,而是将他们进行了一些组合。规律如下:

FSMC_BCRx和FSMC_BTRx,组合成BTCR[8]寄存器组,他们的对应关系如下:

BTCR[O]对应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[O]对应FSMC_BWTR1, BWTR[2]对应FSMC_BWTR2,

BWTR[4]对应FSMC_BWTR3. BWTR[6]对应FSMC_BWTR4

.BWTR[1], BWTR[3]和BWTR[5]保留,没有用到,

硬件连接图

A[0:18]接FMSC_A[0:18]

D[0:15]接FSMC_D[0:15]

UB接FSMC_NBL1

LB接FSMC_NBL0

OE接FSMC_OE

WE接FSMC_WE

CS接FSMC NE3

实验源码

/********************************************************************************* @file           : user_rcc_config.c* @brief          : V1.00******************************************************************************* @attention********************************************************************************//* Include 包含---------------------------------------------------------------*/
#include "user_rcc_config.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define  定义----------------------------------------------------------------*/
/* Macro   宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/
/* Constants 常量--------------------------------------------------------------*/
/* Function  函数--------------------------------------------------------------*//*!\brief		RCC配置\param[in]	none\param[out]	none\retval 	none
*/
void Rcc_config(void)
{	/*使能GPIOA时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/*使能UART1时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);/*使能GPIO*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG,ENABLE);/*使能FSMC时钟*/RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);}/************************************************************** END OF FILE ****/
/********************************************************************************* @file           : user_gpio.c* @brief          : V1.00******************************************************************************* @attention********************************************************************************//* Include 包含---------------------------------------------------------------*/
#include "user_gpio.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define  定义----------------------------------------------------------------*/
/* Macro   宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/
/* Constants 常量--------------------------------------------------------------*/
/* Function  函数--------------------------------------------------------------*//*!\brief		GPIO初始化函数\param[in]	none\param[out]	none\retval 	none
*/
void Gpio_Init(void)
{	/*GPIO结构体*/GPIO_InitTypeDef GPIO_InitTypeDefstruct;/*UART1发送引脚配置*/GPIO_InitTypeDefstruct.GPIO_Mode  = GPIO_Mode_AF_PP;//推挽复用输出GPIO_InitTypeDefstruct.GPIO_Pin   = GPIO_Pin_9;GPIO_InitTypeDefstruct.GPIO_Speed =	GPIO_Speed_10MHz;/*写入结构体到GPIOA*/GPIO_Init(GPIOA,&GPIO_InitTypeDefstruct);/*UART1接收引脚配置*/GPIO_InitTypeDefstruct.GPIO_Mode  = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_InitTypeDefstruct.GPIO_Pin   = GPIO_Pin_10;GPIO_InitTypeDefstruct.GPIO_Speed =	GPIO_Speed_10MHz;/*写入结构体到GPIOA*/	GPIO_Init(GPIOA,&GPIO_InitTypeDefstruct);/*配置FSMC引脚*/GPIO_InitTypeDefstruct.GPIO_Pin = 0xFF33; 			 	 GPIO_InitTypeDefstruct.GPIO_Mode = GPIO_Mode_AF_PP; 		 GPIO_InitTypeDefstruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOD, &GPIO_InitTypeDefstruct);	GPIO_InitTypeDefstruct.GPIO_Pin = 0xFF83; 			 	GPIO_Init(GPIOE, &GPIO_InitTypeDefstruct);GPIO_InitTypeDefstruct.GPIO_Pin = 0xF03F; 			 	 GPIO_Init(GPIOF, &GPIO_InitTypeDefstruct);GPIO_InitTypeDefstruct.GPIO_Pin = 0x043F; 			 	GPIO_Init(GPIOG, &GPIO_InitTypeDefstruct);}/************************************************************** END OF FILE ****/
/********************************************************************************* @file           : user_uart.c* @brief          : V1.00******************************************************************************* @attention********************************************************************************//* Include 包含---------------------------------------------------------------*/
#include "user_uart.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define  定义----------------------------------------------------------------*/
/* Macro   宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/extern uint16_t USART_RX_STA;
extern uint8_t USART_RX_BUF[200];/* Constants 常量--------------------------------------------------------------*/
/* Function  函数--------------------------------------------------------------*/
#if 1
#pragma import(__use_no_semihosting)  
/*实现Printf代码*/
struct __FILE 
{ int handle; }; 
FILE __stdout;       void _sys_exit(int x) 
{ x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   USART1->DR = (u8) ch;      return ch;
}
#endif /*!\brief		UART1初始化\param[in]	none\param[out]	none\retval 	none
*/void Uart1_Init(u32 bound)
{/*UART结构体*/USART_InitTypeDef USART_InitTypeDefstruct;/*UART结构体配置*/USART_InitTypeDefstruct.USART_BaudRate = bound; //波特率USART_InitTypeDefstruct.USART_HardwareFlowControl =USART_HardwareFlowControl_None; //不使用硬件流USART_InitTypeDefstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//发送接收使能USART_InitTypeDefstruct.USART_Parity = USART_Parity_No; //不使用奇偶校验USART_InitTypeDefstruct.USART_StopBits = USART_StopBits_1; //1个停止位USART_InitTypeDefstruct.USART_WordLength = USART_WordLength_8b; //8个数据位/*写入USART1*/USART_Init(USART1,&USART_InitTypeDefstruct);/*使能串口1*/USART_Cmd(USART1,ENABLE);}/*!\brief		UART1中断服务函数\param[in]	none\param[out]	none\retval 	none
*/void USART1_IRQHandler(void)
{}/************************************************************** END OF FILE ****/
/********************************************************************************* @file           : user_fsmc.c* @brief          : V1.00******************************************************************************* @attention********************************************************************************//* Include 包含---------------------------------------------------------------*/
#include "user_fsmc.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define  定义----------------------------------------------------------------*/
/* Macro   宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/
/* Constants 常量--------------------------------------------------------------*/
/* Function  函数--------------------------------------------------------------*//*!\brief		FSMC初始化\param[in]	none\param[out]	none\retval 	none
*/
void FSMC_Init(void)
{	/*FSMC初始化结构体*/FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;/*FSMC时序结构体*/FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;/*初始化*/readWriteTiming.FSMC_AddressSetupTime = 0x00;	 //地址建立时间(ADDSET)为1个HCLK 1/36M=27nsreadWriteTiming.FSMC_AddressHoldTime = 0x00;	 //地址保持时间(ADDHLD)模式A未用到	readWriteTiming.FSMC_DataSetupTime = 0x03;		 //数据保持时间(DATAST)为3个HCLK 4/72M=55ns(对EM的SRAM芯片)	 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);  // 使能BANK3
}/*!\brief		写数据函数\param[in]	none\param[out]	none\retval 	none
*/
void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
{for(;n!=0;n--)  {										    *(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;	  WriteAddr++; pBuffer++;}   
}/*!\brief		读数据函数\param[in]	none\param[out]	none\retval 	none
*/
void FSMC_SRAM_ReadBuffer(u8* pBuffer,u32 ReadAddr,u32 n)
{for(;n!=0;n--)  {											    *pBuffer++=*(vu8*)(Bank1_SRAM3_ADDR+ReadAddr);    ReadAddr++; }  
}
/************************************************************** END OF FILE ****/
/********************************************************************************* @file           : user_mian.h* @brief          : V1.00******************************************************************************* @attention********************************************************************************//* Include 包含---------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdbool.h>
#include "user_gpio.h"
#include "user_delay.h"
#include "user_rcc_config.h"
#include "user_uart.h"
#include "user_fsmc.h"/* Typedef 类型----------------------------------------------------------------*/
/* Define  定义----------------------------------------------------------------*/
/* Macro   宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/	 
u32 testsram[250000] __attribute__((at(0X68000000)));//创建数组SRAM地址为0x68000000
/* Constants 常量--------------------------------------------------------------*/
/* Function  函数--------------------------------------------------------------*/int main(void){	u32 i=0;  	  u8 temp=0;u8 sval=0;/*配置系统中断分组为2位抢占2位响应*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/*延时函数初始化*/delay_init();/*RCC配置*/Rcc_config();/*GPIO初始化*/ Gpio_Init();/*USART1初始化*/Uart1_Init(9600);/*初始化FSMC*/FSMC_Init();/*测试*///每隔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;//后面读出的数据一定要比第一次读到的数据大.	   		   }/*死循环*/ while(1){}}/************************************************************** END OF FILE ****/


http://www.ppmy.cn/news/4969.html

相关文章

Shell编程

目录 一、实验目的 二、实验软硬件要求 三、实验预习 四、实验内容&#xff08;实验步骤、测试数据等&#xff09; 1、编写shell程序&#xff0c;实现用户自定义输入十个整数&#xff0c;计算从第3个到第7个整数的和 2、编写shell程序&#xff0c;实现创建一个以学号命名的新…

【lssvm回归预测】基于灰狼算法优化最小支持向量机GWO-LSSVM数据预测模型含Matlab源码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

MR案例(2):学生排序(单字段排序、多字段排序)

文章目录一、任务目标1. 准备数据二、实行任务1. 创建Maven项目2. 添加相关依赖3. 创建日志属性文件4. 创建学生实体类5. 创建学生映射器类6. 创建学生归并器类7. 创建学生驱动类8. 启动学生驱动器类&#xff0c;查看结果一、任务目标 MR案例&#xff1a;学生排序&#xff08;…

物联网开发笔记(64)- 使用Micropython开发ESP32开发板之控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:控件显示

一、目的 这一节我们学习如何使用我们的ESP32开发板来控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程&#xff1a;控件显示。 二、环境 ESP32 ILI9341 3.2寸TFT-LCD触摸屏 Thonny IDE 几根杜邦线 接线方法&#xff1a;见前面文章。 三、滑杆代码 import lvgl as lv i…

【Mitigating Voltage Attacks in Multi-Tenant FPGAs 论文笔记】

减轻多租户FPGA中的电压攻击摘要引言内容背景和相关工作INTEL STRATIX 10 FPGA上的PDN攻击Stratix 10 PDN特性定位电压下降片上监控和攻击抑制结论和未来工作结论&#xff1a;未来工作作者&#xff1a;GEORGE PROVELENGIOS, University of Massachusetts Amherst, MA, USADANIE…

华为OD机试真题 Python 实现【预订酒店】【2022.11 Q4 新题】

目录 题目 思路 考点 Code 题目 放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为n的 数组A),他的心理价位是x元,请帮他筛选出k个最接近x元的酒店 (n>=k>0) ,并由低到高打印酒店的价格输入描述 第一行: n,k,x 第二行: A[o] A[1] A[2].…

Java项目:基于jsp+mysql+Spring+mybatis的SSM在线网络图书商城

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台&#xff0c;有管理员与用户两种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,商品分类管理,商品管理,商…

Linux c编程之IO复用机制

一、说明 在实际网络程序中,比如服务器程序,需要使用IO复用机制来处理多个客户端的连接和数据收发。Linux系统下常用的IO复用机制有三种:select、poll、epoll。   poll是Linux中的字符设备驱动中的一个函数。Linux 2.5.44版本后,poll被epoll取代。   select用于监视文件…