FSMC是什么?

摘要

众所周知,我们学习单片机不可避免的要和LCD屏幕打交道,驱动LCD屏幕不仅仅靠8080协议,还要提到FSMC,因此本文来介绍一下FSMC。

FSMC介绍

STM32单片机中有一定大小的SRAM和Flash作为内存和程序存储空间。但是其空间毕竟是有限度的,那么当程序较大的时候我们就需要在STM32的外边扩展存储器了。扩展内存时一般使用 SRAM 和 SDRAM 存储器, 但 STM32F1 系列的芯片不支持扩展SDRAM(最新的一些系列芯片支持),它仅支持使用 FSMC 外设扩展 SRAM,我们以 SRAM 为例讲解如何为 STM32 扩展内存。

SRAM的简介

我们都知道当我们电脑比较卡的时候我们可以给电脑加装内存条来改善这个问题,但是单片机我们没有办法来加装内存条。但是我们可以加装SRAM来改善合格问题,下面我们来介绍一下SRAM。 静态随机存取存储器(Static Random-Access Memory,SRAM)是随机存取存储器的一种。所谓的"静态",是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。相对之下,动态随机存取存储器(DRAM)里面所储存的数据就需要周期性地更新。然而,当电力供应停止时,SRAM储存的数据还是会消失(被称为volatile memory),这与在断电后还能储存资料的ROM闪存是不同的。 接下来我们通过一张图,来大致了解一下SRAM的结构。

通过上图我们可以看到SRAM的管脚大概分为电源线,地线,地址线,数据线,片选线,写使能线,读使能线以及数据掩码信号线。看到这些大家应该对前面的各种线很熟悉了,可能对数据掩码信号线存在一些疑惑,当然在写之前我也不太清楚具体是干什么的,接下来我给大家介绍一下数据掩码信号线。 数据掩码信号线 是一种用于控制写操作的信号线。它允许在写操作期间选择性地屏蔽(忽略)某些数据位,从而避免对不需要更新的数据位进行不必要的写入操作。其工作原理为- 当对 SRAM 进行写操作时,数据掩码信号线用于指示哪些数据位将被写入。在写操作期间,如果数据掩码信号线被激活(通常为低电平),则对应的数据位不会被写入 SRAM,而保持其原有的值。例如假设一个 16 位的 SRAM 系统中有两个数据掩码信号线(DQM0 和 DQM1),每个信号线分别控制 8 位数据。如果 DQM0 被置为低电平,而 DQM1 保持高电平,那么在写操作时,DQM0 控制的低 8 位数据不会被写入,而 DQM1 控制的高 8 位数据会被正常写入。

存储矩阵

我们在上面介绍了SRAM的信号线,但是我们还注意到了右上角的存储矩阵,下面我们来一起了解一下吧!我们先看一下矩阵图。

在上图中我们可以看待行地址总线以及列地址总线,在进行数据存取的时候我们的行地址总线以及列地址总线会分别对应给个信号,根据信号我们可以明确的指导存储数据的位置在哪个位置,因此就能取出正确位置的数据了。在结合前文中的数据掩码,当我们要访问一个16位的数据时,我们确定位置后,我们将#UB和#LB的信号都给低电平时,那么那么I/O0-I/O15线都有效,它们一起输出该地址的16位数据(或者接收16位数据到该地址);当要访问宽度为8位的数据时,使用行地址线指出地址, 然后把UB#或LB#其中一个设置为低电平,I/O会对应输出该地址的高8位和低8位数据,因此它们被称为数据掩码信号。

SRAM读写时序

上面弄两张图分别表示SRAM的读写时序,因此我们放在一起来介绍一下。

(1)主机使用地址信号线选择你要访问的地址。

(2)控制片选信号 CS1#及 CS2#使能存储器芯片;

(3)选择要进行的操作,如果是读操作使能OE要数据,如果是写操作使能WE写数据。

(4)根据信号掩码来判断数据哪些是有效的那些是无效的。

(5)若是读取过程,存储器会通过数据线向主机输出目标数据,若是写入过程,主要使用数据线向存储器传输目标数据。

FSMC

前面我们已经大概介绍了FSMC以及SRAM,如果内核要访问SRAM,内核就要生成相应的时序,但是内核无法生成相应的时序图,此时FSMC就应运而生,FSMC的作用就是负责与SRAM进行数据交流,然后以此来与SRAM交换数据。接下来我们先看看FSMC的内部框图,了解一下为什么它能够和SRAM进行数据交流。

在上图中我们看到很多信号线,相信大家一定很迷惑,接下来,我们通过一张表来介绍一下这些信号线的具体作用。

我们可以看到上图有一部分打码的内容,那些是PSRAM的接口,在这里我们不必理会,只用看没有打码的部分就好了。从图片中我们可以看到FSMC各种信号的线的功能。我们将这个图片和上面SRAM的图片结合一下,我们就可以清楚的看到两者的结构基本相同。接下来我们通过一张图来看清楚他们之间的对应关系。

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

由上图我们可以看到FSMC将内核的地址映射为了四部分,Bank1为NOR/PSRAM区域,Bank2和Bank3为NAND Flash区域,Bank4为PC Card区域。因此我们可以知道不同的Bank区域可以用来管理不同的外部设备。同时我们也看到每个区域被分成了4小块,那么我们如何选中某以小块呢?根据上面的表格我们可以看到FSMC有FSMC_NE[1:4]这几个引脚,这个引脚连接哪个块就代表选中了哪个块。FSMC bank1 NOR/PSRAM3,相应的FSMC_NE3信号线会输出控制信号(即片选信号),如果这个时候FSMC_NE3处刚好接上IS62WV51216的CS端,那么IS62WV51216就可以任由我们摆布啦。

根据上图的表186下边,我们可以看到三行字,如果外部存储器的宽度为16位HADDR[25:1]作为对外部存储器器寻址地址FSMC_Awda[24:0]。在这里我一直困惑很久,接下来我们举个例子来详细解释一下这个。先举内核访问地址 0x60000000 的例子,这是外部存储器的起始地址,最能直观地展示映射关系和数据存储方式。在这个例子中,FSMC_A[24:0] 就是 0x000000,从低到高位依次对应 HADDR[25:1] 的每一位。接着,我考虑内核访问地址 0x60000002 的情况,这个地址是起始地址加2,能体现映射时跳过低位地址的特点。在这个例子中,FSMC_A[24:0] 是 0x000001,这样用户就能看到,即使内核访问的地址不是起始地址,FSMC也能正确映射到外部存储器的相应位置,获取到正确的数据。

FSMC控制SRAM的时序

在上面我们了解到了地址的映射,那么在的地址映射后我们如何读取和写入对应的数据呢?接下来我们了解一下吧!

以第一个读时序为例,该图表示一个存储器操作周期由地址建立周期、数据建立周期以及2个HCLK周期组成。在地址建立周期中,地址线发出要访问的地址, 数据掩码信号线指示出要读取地址的高、低字节部分,片选信号使能存储器芯片;地址建立周期结束后读使能信号线发出读使能信号, 接着存储器通过数据信号线把目标数据传输给FSMC,FSMC把它交给内核。 写时序的话类似,在这里我们就不一一说明。

到这里,FSMC是什么东西我们就大概介绍完了,也是第一次学这个,有什么错误欢迎大家批评指正!

相关推荐
时序数据说2 小时前
时序数据库双存储引擎技术解析
大数据·数据库·物联网·开源·时序数据库·iotdb
根号三加载成功8 小时前
物联网控制器:一台顶N台!路由器、PLC控制器、网关、工控机……
物联网·云计算·智能家居·工业自动化
Jason_zhao_MR14 小时前
多协议物联网关的方案测试-基于米尔全志T536开发板
arm开发·嵌入式硬件·mcu·物联网·嵌入式
ctrlworks1 天前
技术革新赋能楼宇自控:物联网云计算推动应用前景深度拓展
物联网·ba系统厂商·康沃思物联·楼宇自控系统厂家·ibms系统厂家·建筑管理系统厂家·能耗监测系统厂家
脾气超好的钢铁侠1 天前
tlmqtt:如何基于责任链模式的高效认证
物联网
TDengine (老段)1 天前
TDengine 与开源可视化编程工具 Node-RED 集成
大数据·物联网·开源·node.js·时序数据库·tdengine·涛思数据
TDengine (老段)2 天前
Kafka 向 TDengine 写入数据
数据库·物联网·kafka·linq·时序数据库·tdengine·涛思数据
国科安芯2 天前
AS32A601与ASM1042芯片在电力系统自动化监控中的应用效能分析
单片机·物联网·自动化
深圳市尚想信息技术有限公司2 天前
LTC3130EMSE#TRPBF ADI电子元器件深度解析 物联网/工业传感器首选!
物联网·转换器·adi