FSMC控制SRAM

【声明:本文是参考B站野火老师讲的FSMC所总结的】
FSMC和FMC的区别

它们是两种不同的存储器控制器,常见于一些现代的微处理器或微控制器中。它们之间的主要区别在于所控制的存储器类型和功能上:

  1. FSMC(Flexible Static Memory Controller):

    • FSMC主要用于控制静态存储器,如SRAM(Static Random Access Memory)等。不能扩展SDRAM。
    • FSMC提供了与静态存储器进行接口通信的功能,包括读取和写入数据,控制地址线和数据线的操作等。
    • FSMC通常用于需要快速访问速度和低延迟的应用场景,例如高性能嵌入式系统中。
  2. FMC(Flexible Memory Controller):

    • FMC则更加灵活,可以用于控制各种类型的存储器,包括SDRAM(Synchronous Dynamic Random Access Memory)、NOR Flash、NAND Flash等。
    • FMC支持更多种类的存储器接口标准和协议,使其在连接各种存储器时更具通用性和灵活性。
    • FMC通常用于需要较大存储容量或者对存储器种类要求较多样化的系统中。

总的来说,FSMC主要用于控制静态存储器,而FMC则更灵活,可以适用于多种类型的存储器控制,提供更广泛的应用范围。【可以把S理解成静态的,好记一些】

SRAM内部结构

存储器矩阵是存储数据的存储单元 SRAM是易失性存储器 读取速度快 可以输入地址给地址译码器 然后在存储器矩阵里寻址 之后通过IO电路返回数据

地址译码器把N根地址线换成了2的N次方根信号线,每根信号线对应一行或一列的存储单元
本次例子里的SRAM比较小,没有列地址线,它的数据宽度是16位(一行对应两字节)
A1-18是行址信号,18根地址线可以表示2的18次方=2的8次方×1024=512k行存储单元,能访问512k×16bits的大小空间
UB和LB是用来控制写入,读取的是第一个字节还是第二个字节(由上面可知,一行有两个字节

读写时序图可以在数据手册查看 里面的持续时间也可以查看

如读的时序图如下

【注:掩码信号决定获取16还是8位的数据,高字节还是低字节。

数据信号通过16根数据线将数据传递出来】

读写发生时,FSMC自动会根据我们配的时序,图上的T那些,帮我们完成时序的产生

SRAM没有用到时钟线,是异步传输

SRAM的读写流程

读写时序的流程很类似,过程如下:
(1)主机使用地址信号线发出要访问的存储器目标地址;

(2)控制片选信号CS1#及CS2#使能存储器芯片;【如果只用了一块存储器就可以忽略此步】
(3)若是要进行读操作,则控制读使能信号OE#表示要读数据,若进行写操作则控制写使能信号WE#表示要写数据;
(4)使用掩码信号LB#与UB#指示要访问目标地址的高、低字节部分;

(5)若是读取过程,存储器会通过数据线向主机输出目标数据,若是写入过程,主要使用数据线向存储器传输目标数据。
注:以上时序不需要死记硬背,使用STM32只需配置好FSMC控制器,FSMC控制器会自动构建数据读取时序,我们时序将关键的时序参数配置到FSMC控制器中即可。

FSMC框图

右边部分是一些信号线,不同的存储设备会用到不同信号线

第二部分我们重点关注配置寄存器部分

通讯引脚

比较特殊的是NE线,不同的NE脚是控制不同的地址的,当STM32访问某个地址的时候,对应的NE引脚会被自动控制设成低电平,此时由于一个NE引脚连接到一个SRAM的CE引脚,所以SRAM的片选被使能。

FSMC的地址映射

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

上图里右边不同的区域划分给不同的存储器使用

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

FSMC控制SRAM的时序

FSMC外设支持输出多种不同的时序以便于控制不同的存储器,对应着FSMC的ABCD四种模式,下面我们仅针对控制SRAM使用的模式A进行讲解

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

怎么使用FSMC

1.初始化FSMC外设:配置好FSMC控制器中的NOR/PSRAM 控制寄存器即可。

2.访问拓展出来的内存:使用指针操作访问拓展处理的内存。

HAL库实战

先配好基本的配置如时钟,串口(用于调试)等

之后点开FSMC模块

我们看图可以知道几点:

1.FSMC可以支持NOR FLASH/PSRAM/SRAM/ROM/LCD 1/NAND FLASH/COMPACT FLASH

2.刚刚提到的对应四个区域在图里也有体现(即前四个选项,对应NE[4:1])

那怎么知道具体是NE几?可以去看原理图里的SRAM 对应的是GPIO 几,之后打开数据手册去看具体哪个GPIO对应哪个NE

点开后配置这些

片选NE几可以按刚刚我们上面的说的去配

存储器类型选择SRAM

地址是按几根线去选的,比如我们这个实例一共19根线(A0-A18)

data是按每行多少个数据位配的(数据宽度,可以去存储器对应手册看)

最下面的字节使能 勾选后会以一字节形式发送、接收 勾选后就可以用UB/LB去控制高位、低位了

之后下面会出现这些配置

由上面的表可以得知选择BANK1

关于Extended Mode 假如读、写的时间要求差不多,就可以不配置

如果不太一样就enable,之后会出现读写时序的分别配置

下面时间的配置可以去数据手册查看要求

比如地址建立时间的要求是不低于0ns,所以我们按默认配置就行

数据读取时间不能低于25ns 我们经过计算可以得出默认的255个时钟周期是大于25ns的【主频72M情况下】

最后一个要配置的是总线周转持续时间

配置完之后生成代码

之后在main文件里定义

之后在main函数里写下

编译运行后,我们进入debug模式查看

断点打在第2条代码的时候有

第3条时

所以证明写入正确

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值