物联网ARM开发- 5协议 FSMC控制器外扩SRAM存储器

前言:STM32F407ZGT6 自带了 192K 字节的 SRAM,对一般应用来说,已经足够了,不过在一 些对内存要求高的场合,STM32F4 自带的这些内存就不够用了。比如跑算法或者跑 GUI 等, 就可能不太够用,所以探索者 STM32F4 开发板板载了一颗 1M 字节容量的 SRAM 芯片:XM8A51216,满足大内存使用的需求。

目录

一、常用存储器介绍

1、存储器的种类

2、RAM存储器

(1)DRAM

(2)SRAM

(3)对比DRAM与SRAM的应用场合

 3、非易失性存储器

(1)ROM存储器     

(2)FLASH存储器    

二、SRAM控制原理

1、SRAM简介

2、SRAM内部框图分析

(1)地址数据接口

(2)存储器矩阵

(3)SRAM的控制电路

(4)SRAM的读写时序

三、STM32-FSMC控制器介绍

1、FSMC简介         

(1)通讯引脚

(2)存储器控制器

(3)时钟控制逻辑

2、FSMC地址映射

3、FSMC时序控制

(1)FSMC读时序     

(2)FSMC写时序

四、FSMC外扩SRAM实例

1、实验简介:

2、硬件设计:

3、软件设计

4、实验效果

一、常用存储器介绍

1、存储器的种类

存储器是计算机结构的重要组成部分。存储器是用来存储程序代码和数据的部件,有了存储器计算机才具有记忆功能

2、RAM存储器

RAM:RAM是“Random Access Memory”的缩写,被译为随机存储器。所谓“随机存取”,指的是当存储器中的消息被读取或写入时,所需要的时间与这段信息所在的位置无关。这个词的由来是因为早期计算机曾使用磁鼓作为存储器,磁鼓是顺序读写设备,而RAM可随读取其内部任意地址的数据,时间都是相同的,因此得名。        
实际上现在RAM已经专门用于指代作为计算机内存的易失性半导体存储器。
根据RAM的存储机制,又分为动态随机存储器DRAM(Dynamic RAM)以及静态随机存储器SRAM(Static RAM)两种。

(1)DRAM


DRAM的存储单元结构:   
动态随机存储器DRAM(Dynamic RAM)
动态刷新
动态随机存储器 DRAM的存储单元以电容的电荷来表示数据,有电荷代表 1,无电荷代表 0,,代表 1 的电容会放电,代表 0的电容会吸收电荷,因此它需要定期刷新操作,这就是“动态(Dynamic)” 
DRAM以电容的电荷来表示数据

(2)SRAM

SRAM的存储单元结构          
静态随机存储器 SRAM的存储单元以锁存器来存储数据,见图 。这种电路结构不需要定时刷新充电,就能保持状态(当然,如果断电了,数据还是会丢失的),所以这种存储器被称为“静态(Static)”RAM。
同样地,SRAM 根据其通讯方式也分为同步SRAM和异步 SRAM,相对来说,异步SRAM用得较多。

(3)对比DRAM与SRAM的应用场合

 3、非易失性存储器

非易失性存储器种类非常多,半导体类的有 ROM 和 FLASH,而其它的则包括光盘、软盘及机械硬盘。

(1)ROM存储器     

ROM存储器     
ROM是“Read Only Memory”的缩写,意为只能读的存储器。由于技术的发展,后来设计出了可以方便写入数据的ROM,而这个“Read Only Memory”的名称被沿用下来了,现在一般用于指代非易失性半导体存储器,包括后面介绍的FLASH存储器,有些人也把它归到ROM类里边。

(2)FLASH存储器    

FLASH存储器又称为闪存,它也是可重复擦写的储器,部分书籍会把FLASH存储器称为FLASH ROM,但它的容量一般比EEPROM大得多,且在擦除时,一般以多个字节为单位。      
根据存储单元电路的不同,FLASH存储器又分为NOR FLASH和NAND FLASH

二、SRAM控制原理

1、SRAM简介

STM32控制器芯片内部有一定大小的SRAM及FLASH作为内存和程序存储空间,但当程序较大,内存和程序空间不足时,就需要在STM32芯片的外部扩展存储器了。STM32F407系列芯片可以扩展外部SRAM用作内存。

给STM32芯片扩展内存与给PC扩展内存的原理是一样的,只是PC上一般以内存条的形式扩展,而且内存条实质是由多个内存颗粒(即SDRAM芯片)组成的通用标准模块,而STM32扩展时,直接与SRAM芯片连接。

2、SRAM内部框图分析

(1)地址数据接口

SRAM的控制比较简单,只要控制信号线使能了访问,从地址线输入要访问的地址,即可从I/O数据线写入或读出数据。

(2)存储器矩阵

SRAM存储矩阵       
SRAM内部包含的存储阵列,可以把它理解成一张表格,数据就填在这张表格上。和表格查找一样,指定一个行地址和列地址,就可以精确地找到目标单元格而这样的表则被称为存储矩阵。

(3)SRAM的控制电路

控制电路主要包含了片选、读写使能以及上面提到的宽度控制信号UB#和LB#。利用CE#片选信号,可以把多个SRAM芯片组成一个大容量的内存条。OE#和WE#可以控制读写使能,防止误操作。

数据访问    
当选中一个数据单元后,可以通过UB#或 LB#其中一个设置为低电平,I/O会对应输出该地址的高 8位和低 8位数据,因此它们被称为数据掩码信号。

(4)SRAM的读写时序


重点时序:读周期时间(tRC)
地址建立时间(tAA)
OE建立时间(tDOE)


重点时序:写周期时间(tWC)
地址建立时间(tSA)
WE脉宽(tPWE)

 SRAM的读写流程

三、STM32-FSMC控制器介绍

1、FSMC简介         

STM32F4系列芯片使用FSMC外设来管理扩展的存储器,FSMC是Flexible Static Memory Controller的缩写,译为灵活的静态存储控制器。它可以用于驱动包括SRAM、NOR FLASH以及NAND FLSAH类型的存储器,不能驱动如SDRAM这种动态的存储器。而在STM32F429系列的控制器中,它具有FMC外设,支持控制SDRAM存储器。

FSMC控制器功能框图分析

(1)通讯引脚

由于控制不同类型存储器的时候会有一些不同的引脚,看起来有非常多,其中地址线FSMC_A和数据线FSMC_D是所有控制器都共用的
注:其中比较特殊的FSMC_NE是用于控制SRAM芯片的控制信号线,STM32具有FSMC_NE1/2/3/4号引脚,不同的引脚对应STM32内部不同的地址区域

(2)存储器控制器

上面不同类型的引脚是连接到FSMC内部对应的存储控制器中的NOR/PSRAM/SRAM设备使用相同的控制器,NAND/PC卡设备使用相同的控制器,不同的控制器有专用的寄存器用于配置其工作模式。
相关控制寄存器    
控制SRAM的有FSMC_ BCR 、FSMC_ BTR以及FSMC_BWTR寄存器。每种寄存器都有4个,分别对应于4个不同的存储区域,各种寄存器介绍如下:

  • -FSMC_BCR控制寄存器:可配置要控制的存储器类型、数据线宽度以及信号有效极性能参数。
  • -FMC_BTR时序寄存器:用于配置SRAM访问时的各种时间延迟,如数据保持时间、地址保持时间等。
  • -FMC_BWTR写时序寄存器:与FMC_BTR寄存器控制的参数类似,它专门用于控制写时序的时间参数。

(3)时钟控制逻辑

FSMC外设挂载在AHB总线上,时钟信号来自于HCLK(默认168MHz),控制器的同步时钟输出就是由它分频得到。
例如,NOR控制器的FSMC_CLK引脚输出的时钟,它可用于与同步类型的SRAM芯片进行同步通讯,它的时钟频率可通过FSMC_BTR寄存器的CLKDIV位配置,可以配置为HCLK的1/2或1/3,也就是说,若它与同步类型的SRAM通讯时,同步时钟最高频率为84MHz
后面示例中的SRAM为异步类型的存储器,不使用同步时钟信号,所以时钟分频配置不起作用。

2、FSMC地址映射

FSMC连接好外部的存储器并初始化后,就可以直接通过访问地址来读写数据。
FSMC访问存储器的方式与I2C EEPROM、SPI FLASH的不一样,后两种方式都需要控制I2C或SPI总线给存储器发送地址,然后获取数据;在程序里,这个地址和数据都需要分开使用不同的变量存储,并且访问时还需要使用代码控制发送读写命令
而使用FSMC外接存储器时,其存储单元是映射到STM32的内部寻址空间的;在程序里,定义一个指向这些地址的指针,然后就可以通过指针直接修改该存储单元的内容,FSMC外设会自动完成数据访问过程,读写命令之类的操作不需要程序控制。

  • FSMC的NOR/PSRAM/SRAM/NAND FLASH以及PC卡的地址被映射到了External RAM地址空间内,使得访问FSMC控制的存储器时,就跟访问STM32的片上外设寄存器一样
  • FSMC把整个External RAM存储区域分成了4个Bank区域,并分配了地址范围及适用的存储器类型,如NOR及SRAM存储器只能使用Bank1的地址

 在NOR及SRAM区域,每个Bank的内部又分成了4个小块,每个小块有相应的控制引脚用于连接片选信号,如FSMC_NE[4:1]信号线可用于选择BANK1内部的4小块地址区域,当STM32访问0x68000000-0x6BFFFFFF地址空间时,会访问到Bank1的第3小块区域,相应的FSMC_NE3信号线会输出控制信号。

3、FSMC时序控制

(1)FSMC读时序     

FSMC外设支持输出多种不同的时序以便于控制不同的存储器,它具有ABCD四种模式,下面我们仅针对控制SRAM使用的模式A进行讲解
注:内核发出访问某个指向外部存储器地址时,FSMC外设会根据配置控制信号线产生时序访问存储器

(2)FSMC写时序

 内核发出访问某个指向外部存储器地址时,FSMC外设会根据配置控制信号线产生时序访问存储器

四、FSMC外扩SRAM实例

1、实验简介:

驱动SRAM

2、硬件设计:

ALIENTEK 探索者 STM32F4 开发板外扩了 1M 字节的 SRAM 芯片,如图 2.1.5.1 所示,注
意图中的地址线标号,是以 XM8A51216 为模版的,但是和 XM8A51216 的 datasheet 标号有出
入,不过,因为地址的唯一性,这并不会影响我们使用 XM8A51216(特别提醒:地址线可以
乱,但是数据线必须一致!!),因此,该原理图对这两个芯片都是可以正常使用的

cubmx配置

(1)RCC时钟168mhz,串口通信,FSMC外扩SRAM

(2)FSMC配置(对比读写时序、芯片手册)

这里不适用扩展模式,如果使用extended mode,写读同一个时序调整一下就行,否则是分开的时序。

配置地址建立时间ADDSET(通过下面分析得出):1(11 HCLK 1/168M=6ns)

配置数据建立时间DATAST(通过下面分析得出):3 (数据保存时间为 3 HCLK =6*3=18ns)

我们根据FSMC和SRAM读时序对比

我们读写时序用同一个,因为他们读写时序很接近,管脚也一一对应,只不过对时序进行调整配置。(备注:我们用读写不同的时序来操作 TFTLCD 模块 ,因为 TFTLCD 模块读的速度比写的速度慢很多)

比如当我们要去读sram:

  • FSMC通过A[25:0]去发送一个地址,对应SRAM是ADDRESS
  • 发送完地址后去片选,选中sram芯片。FSMC的NEx管脚对应SRAM的CE管脚
  • 当我们读的时候,我们需要拉低sram的OE管脚,对应FSMC的NOE管脚,这里控制时序就完成了
  • SRAM的LB、UB对应FSMC的NBL的两根信号,可以控制高低字节了。
  • 最后我们去读数据了,D[15:0]对应Dout

整个时间:tRC = ADDSET + DATAST(这个是SRAM的芯片需求,我们可以查数据手册大于这个值)

读使能信号拉低到出现有效数据的出现当中的这段时间:tDOE = DATASET(对应FSMC的数据采样时间)

ADDSET在FSMC当中可以配置的,这段时间对于SRAM未作要求,我们FSMC配置的时候大于0就行。

datasheet:

trc=(1+3)*6 =24ns(这里与本芯片有点出入,只要大于taa就行) 

taa =6ns <55 

tdoe(DATASET)=18ns<25

3、软件设计

读写SRAM

/* USER CODE BEGIN 0 */
int fputc(int ch,FILE *p)
{
	while(!(USART1->SR & (1<<7)));
	USART1->DR = (uint8_t) ch;
	return ch;
}

#define SRAM_BANK_ADDR ((uint32_t)0x68000000)

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
	uint8_t *p = (uint8_t *) SRAM_BANK_ADDR;
	uint8_t i;
	
  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_FSMC_Init();
  /* USER CODE BEGIN 2 */
	printf("this is fsmc sram test\r\n");
	
	//写内存
	for(i=1; i<=10; i++)
	{
		p[i] = i;
	}
	
	//读内存
	for(i=1; i<=10; i++)
	{
		printf("p[%d] = %d\r\n",i, p[i] );
	}
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

4、实验效果

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

4IOT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值