添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

关于FSMC的基本原理已经在这两篇讲解了,如果有不懂的建议先看一下,这里我们对一些基本概念会说的少一些,主要就是针对FMC的特点和FSMC跟FMC的区别做主要的阐述(区别不大)。

STM32 FSMC/FMC原理保姆级讲解(一)

STM32 FSMC/FMC原理保姆级讲解(二)

SDRAM、DRAM及DDR FLASH ROM概念详解

FSMC和FMC区别

F1 F407 使用的是 FSMC(Flexible static memory controller)“静态存储器控制器” Cortex-M3内核 的芯片专属的,STM32可以通过FSMC与静态SRAM、ROM、PSRAM、Nor Flash和NandFlash存储器的引脚相连,从而进行数据的交换。

Cortex-M4内核 的F429和 Cortex-M7内核 的F7,H7系列中,变成了 FMC(Flexible Memory Controller) 灵活存储控制器 ,支持了动态SDRAM 等设备,

其中最大的区别是什么呢?

FMC是在FSMC(Flexible Static Memory Controller)的基础上扩展了SDRAM的总线控制器,使用 FMC 可以动态刷新 SDRAM

静态RAM跟动态RAM

SRAM
SRAM,静态的随机存取存储器,又被称为静态RAM,利用双稳态电路进行存储。即使有干扰对稳态电路也没影响,所以有双稳态性, “静态”是指只要不掉电,存储在SRAM中的数据就可以一直保存 ,只要有电,SRAM中的数据就不会有变化。加电情况下,不需要一直刷新,数据不会丢失,而且,

DRAM
DRAM, 动态随机存取存储器,需要不断的刷新,才能保存数据 。主要的作用原理是利用电容内存储电荷的多寡来代表一个二进制比特(bit)是1还是0。由于在现实中电容会有漏电的现象,导致电位差不足而使记忆消失,因此除非电容经常周期性地充电,否则无法确保记忆长存。DRAM读取具有破坏性,也就是说,在读操作中会破坏内存单元行中的数据。因此,必需在该行上的读或写操作结束时,把行数据写回到同一行中。这一操作称为预充电,是行上的最后一项操作。必须完成这一操作之后,才能访问新的行,这一操作称为关闭打开的行。

SDRAM(Synchronous Dynamic Random Access Memory),同步动态随机存储器。同步的DRAM

同步和异步的区别是同步方式需要一个专门的片外时钟CLK信号引脚,所有的读写操作都是跟着这个时钟信号走的

FSMC和FMC区别总结

FSMC只能接静态SRAM,FMC可以接动态DRAM,而控制动态DRAM要复杂得多。动态RAM需要不停地进行周期性的刷新,否则RAM中的数据就会丢失,

这就产生了“管理”问题,如果您看了上面的FSMC原理,那么就会知道 存储器和STM32之间就只是进行数据读写就可以

如果用一个MCU来连接DRAM,二者之间交换的就不只是数据交换那么简单了,还包含有控制信息。跟周期性刷新DRAM内数据,这样,DRAM中除了存储数据的单元,还需要有寄存器还得有个对DRAM的“初始化”过程

这么复杂,有同学就会问为什么还要用DRAM呢?用SRAM不就行了吗?

如果您看了上面的DRAM跟SRAM区别就会知道,SRAM的容量是小于DRAM的,并且价格远大于DRAM,所以SRAM一般只用于CPU内部的存储,而像我们电脑上外接的那几个G的内存条,都是动态DRAM类型的。

FMC介绍

我们来看下官方对FMC的介绍:

FMC灵活的存储控制器。FMC可连接SRAM(异步或同步)、SDRAM、NORFLASH、PC卡、NANDFLASH.支持突发模式,可编程时钟,8位、16位、32位宽的数据总线。FMC有6个存储区域,每个区域支持256MB的寻址空间。

FMC的特点:

  1. FMC的一大特点是支持不同位宽的异步读写操作。

  2. FMC同一时刻只能控制一个存储器外设 (因为fmc配置的地址线,数据线和控制线是共享的) ;每种存储区内都有自己的bank片选信号;

  3. FMC包含三种类型的存储控制器:NOR/PSRAM/SRAM存储控制器,NAND控制器,SDRAM控制器;

  4. FMC配置中未用到引脚均可以继续用作通用I/O模式或者其它复用功能,仅需不配置FMC复用即可。

  5. 每个片选下的存储器空间配置都是独立的,有专门的寄存器,互不影响

并行总线接口FMC

FMC(Flexible memory controller,灵活动态存储器)

H7中FMC的原理框图如下图所示:
在这里插入图片描述

在框图的右侧是 FMC 外设相关的控制引脚,其中地址线 FMC_A 和数据线 FMC_D 是所有控制器都共用的。FMC_NBL数据掩码是SRAM共用的
这些 FMC不同存储器引脚具体对应的 GPIO 端口及引脚号可在《STM32H7xx 规格书》中搜索查找到,不在此列出。针对 SDRAM 控制器,以下的 FMC 与 SDRAM 引脚对应关系

FMC 的地址映射

图中左侧的是 Cortex-M7 内核的存储空间分配,右侧是 STM32 FMC 外设的地址映射。可以看到
FMC 的 NOR/PSRAM/SRAM/NAND FLASH 以及 PC 卡的地址都在 External RAM 地址空间内,而
SDRAM 的地址是分配到 External device 区域的。正是因为存在这样的地址映射,使得访问 FMC
控制的存储器时,就跟访问 STM32 的片上外设寄存器一样 (片上外设的地址映射即图中左侧的
“Peripheral”区域)。
在这里插入图片描述
FMC可以分为6个区域,每个子区域有各自连接的存储器类型

  • 第一个区域用于NORFLASH、PSRAM、SRAM,可分为4个子区域,每个子区域有各自的片选信号,可连接4个器件

  • 区域2和3 用于NAND Flash,每个区域只能连接1个器件

  • 区域 4 用于连接PC卡

  • 区域5和6 用于SDRAM,每个区域只能连接1个器件

FMC重映射

与 F1 和 F4 不同,H7 系列的 FMC 总线接口支持重映射,也就是可以设置这几块存储器的位置。

在这里插入图片描述
根据 BMAP[0:1]设置的数值 00,01 或者 10,支持三种分配方式。默认情况下,使用 BMAP[0:1] = 00
的分配方式即可,也就是上面截图中的分配方式。

FMC时钟

FMC 外设挂载在 AHB3 总线上,时钟信号来自于 HCLK(默认 200MHz),控制器的时钟输出就是
由它分频得到。还可以可以选择如下几种时钟源 HCLK3,PLL1Q,PLL2R 和 PER_CK

我们这里直接使用 HCLK3,配置 STM32H7 的主频为 400MHz 的时候,HCLK3 输出的 200MHz,这个速度是 FMC 支持的最高时钟

在SDRAM中,SDRAM 控制器的 FMC_SDCLK 引脚输出时钟频率,用于与 SDRAM 芯片进
行同步通讯,它的时钟频率可通过 FMC_SDCR1 寄存器的 SDCLK 位配置,可以配置为 HCLK 的
1/2 或 1/3,也就是说,与 SDRAM 通讯的同步时钟最高频率为 100MHz。

NOR/PSRAM/SRAM 块区。

这个块区用到的地方最多,像 NAND 和 SDRAM 块区基本只能接 NAND 和 SDRAM,而NOR/PSRAM/SRAM 区就不同了,除了能接这几种类型的存储器,还可以外接 TFTLCD,OLED,AD7606 等总线外设。这个块区有 4 路片选,分别是 FMC_NE1,FMC_NE2,FMC_NE3 和 FMC_NE4,这几个片选在芯片上都有对应的引脚,每个片选可以管理 64MB 的访问空间,这个是由 FMC 引出的 26路地址线 FMC_A[0:25]决定的,2^26 = 64MB。

FMC_NE1:首地址 0x6000 0000,可以管理的地址范围 0x6000 0000 到 0x63FF FFFF。
FMC_NE2:首地址 0x6400 0000,可以管理的地址范围 0x6400 0000 到 0x67FF FFFF。
FMC_NE3:首地址 0x6800 0000,可以管理的地址范围 0x6800 0000 到 0x6BFF FFFF。
FMC_NE4:首地址 0x6C00 0000,可以管理的地址范围 0x6C00 0000 到 0x6FFF FFFF。

STM32 FSMC/FMC原理保姆级讲解(一)

这一部分我们在这一篇已经讲解的很详细了,如果有不懂得请再看一下

这里我们再说一下SDRAM的存储配置

通过FMC地址框图我们可以看到STM32对于SDRAM分配了两个bank空间 Bank1 和 Bank2 ,这里的 Bank 与 SDRAM 芯片内部的Bank 是不一样的,这是FMC内部有2个物理Bank地址的意思,每个BANK都可以接一个SDRAM,可以理解为FMC支持连接2个SDRAM芯片, 实际使用的时候看下具体的接线选择是BANK1还是BANK2,

MCU通过不同的片选信号SDNE0和SDNE1来选择具体使用哪个片外RAM 通过SDCKE0和SDCKE1来确定使能那个BANK的时钟

BANK0对应的存储区域 1 的地址范围是 0xC000 0000-0xCFFF FFFF,
而BANK1 对应的存储区域 2 的地址范围是 0xD000 0000- 0xDFFF FFFF。

当程序里控制内核访问这些地址的存储空间时,FMC 外设会即会产生对应的时序,对它外接的 SDRAM 芯片进行读写
在这里插入图片描述
请添加图片描述
请添加图片描述

1.4、NAND FLASH难点二、 FMC -NAND FLASH接口介绍 2.1、 FMC -NAND FLASH控制器简介 2.2、 FMC -NAND FLASH访问参数介绍 2.3、 STM32 FMC 控制器硬件ECC 2.4、 FMC -NAND FLASH控制器相关寄存器介绍 2.5、 FMC -NAND FLASH控制器相关HAL库函数介绍三、NAND FLASH驱动步骤 FSMC 连接好外部的存储器并初始化后,就可以直接通过访问地址来读写数据 其中这部分在内存中有着固定的存储地址,存储单元是映射到 STM32 的内部寻址空间的;在程序里,定义一个指向这些地址的指针,然后就可以通过指针直接修改该存储单元的内容,FSMC 外设会自动完成数据访问过程,读写命令之类的操作不需要程序控制。 Liquid Crystal Display,即液晶显示器,由:玻璃基板、背光、驱动IC等组成全彩LCD,是一种全彩显示屏(RGB565、RGB888),可以显示各种颜色1,低成本:低至几块钱的价格2,高解析度 :可高达500ppi的解析度,显示细腻PPI(Pixels Per Inch)[4],从字面意思理解就是每英寸像素,也可以理解为屏幕像素密度,因为像素并没有固定的大小,所以,PPI 越高,像素大小越小,也就越清晰。 单片机使用 STM32 F103ZET6,触发源选择信号发生器,该信号发生器产生4us脉冲,触发DMA。本文同时使用信号发生器的信号触发 FMC 的计数脉冲计数,使用ACTEL 的型号为ProASIC A3P250 VQG100的FPGA产生 FMC 计数脉冲( FMC 传输数据的宽度),本文使用了一个三位计数器产生0-7计数(使用到3位 FMC 数据线)。 同步/异步静态存储器-------SRAM、DRAMSDRAM存储器---------------SDRAM所有外部存储器共享地址、数据和控制信号,但有自己的片选信号。 FMC 一次只能访问一个外部器件。 总结起来, STM32 FMC 允许每个片选下的存储器空间配置是独立的,这意味着每个片选都有自己的配置寄存器,用于定义和控制与该片选相关的存储器设备。寄存器独立性: FMC 提供了一组专门的寄存器,用于配置每个片选下的存储器设备。这些寄存器包括配置寄存器、计时寄存器、数据寄存器等等。每个片选都有自己的一组寄存器,用于存储与其相关的配置信息,这些寄存器互不影响。在 FMC 中,每个片选(Chip Select)下的存储器空间配置是独立的,这意味着每个片选都有自己的配置寄存器,用于定义和控制与该片选相关的存储器设备。 FSMC全称“静态存储器控制器”, STM32 可以通过FSMC与SRAM、ROM、PSRAM、Nor Flash和NandFlash存储器的引脚相连,从而进行数据的交换。 FSMC的特点: 1、 FSMC的一大特点是支持不同位宽的异步读写操作。 2、 FSMC的映射地址空间中,不同的BANK是独立的,可用于扩展不同类型的存储器。当FSMC同时使用多个外部存储器时,FSMC会通过总线悬空延时时间参数,来防止访问冲突发生。 3、 支持代码从FSMC扩展的外部存储器中直接运行。不需要首先调入内部SRAM。 通常情况下,可以通过指定基地址和存储器大小来确定外部SDRAM的地址范围,并将其映射到MCU的内部地址空间中,以便MCU可以直接访问外部SDRAM的数据。然后,MCU在访问外部存储器时,会将内部地址转换为外部存储器的物理地址,从而实现对外部存储器的访问。在刷新期间,SDRAM会按照一定的规则,重新读取存储单元中的数据,并重新写入以维持电荷的状态,以防止数据丢失。总的来说, FMC 外部器件地址映射是通过配置 FMC 参数和寄存器来实现的,确保外部存储器的地址范围能够被正确地映射到 STM32 的内部地址空间中。 参考资料:《 STM32 F4xx 参考手册 2》、《 STM32 F4xx 规格书》、库帮助文档《 stm32 f4xx_dsp_stdperiph_lib_um.chm》。关于 SDRAM 存储器,请参考前面的“常用存储器介绍”,实验中 SDRAM 芯片的具体参数,请参考其规格书《IS42-45S16400J》来了解。1、 SDRAM 控制 原理 STM32 控制器芯片内部有一定大小的 SRAM 及 FL... 当行有效命令确定后,紧接着就需要进行列寻址,读命令与写命令的时序基本一致,通过共用地址线A[11:0]发送列地址,同时WE#引脚表示读/写方向,WE#为低电平时,表示写,高电平时表示读。同时读写数据时,用DQM#线来确定有效的数据线。在实际对SDRAM的读写中,我们一般不会对存储器一个一个存储单元的去读写,这样有耗时又耗力,需要不停的发送列地址与读写命令,虽然读写延迟相同可以让数据的传输在I/O端是连续的,但是会消耗大量的内存/控制资源,而且数据在传输过程中,也无法接收新的命令,因此效率比较低下。 FMC STM32 F429/439专有的,而FSMC存在于F1和F4中我们常用的芯片中。 他们的全称为: Flexible static memory controller (FSMC)柔性静态存储器控制器 Flexible memory controller ( FMC )灵活的存储控制器 先以 FMC 具体介绍: 有地址引脚和数据引脚还有控制引脚 从图中可以看出 STM32 内部总线是