1. FSMC简介

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

  • FSMC框图剖析

  • 通讯引脚

  • 存储器控制器

  • 时钟控制逻辑

2.通讯引脚

​ 由于控制不同类型存储器的时候会有一些不同的引脚,看起来有非常多,其中地址线FSMC_A和数据线FSMC_D是所有控制器都共用的。

​ 其中比较特殊的FSMC_NE是用于控制SRAM芯片的控制信号线,STM32具有FSMC_NE1/2/3/4号引脚,不同的引脚对应STM32内部不同的地址区域。

​ 例如,当STM32访问0x68000000-0x6BFFFFFF地址空间时,FSMC_NE3引脚会自动设置为低电平,由于它连接到SRAM的CE#引脚,所以SRAM的片选被使能,而访问0x60000000-0x63FFFFFF地址时, FSMC_NE1会输出低电平。当使用不同的FSMC_NE引脚连接外部存储器时, STM32访问SRAM的地址不一样,从而达到控制多块SRAM芯片的目的。

3. 存储器控制器

​ 上面不同类型的引脚是连接到FSMC内部对应的存储控制器中的。NOR/PSRAM/SRAM设备使用相同的控制器, NAND/PC卡设备使用相同的控制器,不同的控制器有专用的寄存器用于配置其工作模式。控制SRAM的FSMC_BCR1/2/3/4控制寄存器、FSMC_BTR1/2/3/4片选时序寄存器以及FSMC_BWTR1/2/3/4写时序寄存器。

每种寄存器都有4个,分别对应于4个不同的存储区域,各种寄存器介绍如下:

  • FSMC_BCR控制寄存器可配置要控制的存储器类型、数据线宽度以及信号

    有效极性能参数。

  • FMC_BTR时序寄存器用于配置SRAM访问时的各种时间延迟,如数据保

    持时间、地址保持时间等。

  • FMC_BWTR写时序寄存器与FMC_BTR寄存器控制的参数类似,它专门用

    于控制写时序的时间参数。

4. 时钟控制逻辑

​ FSMC外设挂载在AHB总线上,时钟信号来自于HCLK(默认168MHz),控制器的同步时钟输出就是由它分频得到。

​ 例如, NOR控制器的FSMC_CLK引脚输出的时钟,它可用于与同步类型的SRAM芯片进行同步通讯,它的时钟频率可通过FSMC_BTR寄存器的CLKDIV位配置,可以配置为HCLK的1/2或1/3,也就是说,若它与同步类型的SRAM通讯时,同步时钟最高频率为84MHz。本示例中的SRAM为异步类型的存储器,不使用同步时钟信号,所以时钟分频配置不起作用。

5. FSMC的地址映射

FSMC连接好外部的存储器并初始化后,就可以直接通过访问地址来读写数据。

​ FSMC访问存储器的方式与I2C EEPROM、 SPI FLASH的不一样,后两种方式都需要控制I2C或SPI总线给存储器发送地址,然后获取数据;在程序里,这个地址和数据都需要分开使用不同的变量存储,并且访问时还需要使用代码控制发送读写命令。

​ 而使用FSMC外接存储器时,其存储单元是映射到STM32的内部寻址空间的;在程序里,定义一个指向这些地址的指针,然后就可以通过指针直接修改该存储单元的内容, FSMC外设会自动完成数据访问过程,读写命令之类的操作不需要程序控制。

​ 图中左侧的是Cortex-M4内核的存储空间分配,右侧是STM32FSMC外设的地址映射。可以看到FSMC的NOR/PSRAM/SRAM/NANDFLASH以及PC卡的地址都在External RAM地址空间内。

​ 正是因为存在这样的地址映射,使得访问FSMC控制的存储器时,就跟访问STM32的片上外设寄存器一样(片上外设的地址映射即图中左侧的“Peripheral”区域)。

​ 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信号线会输出控制信号。

6. FSMC控制时序

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

​ 当内核发出访问某个指向外部存储器地址时, FSMC外设会根据配置控制信号线产生时序访问存储器,上图中的是访问外部SRAM时FSMC外设的读写时序。

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

​ 写时序类似,区别是它的一个存储器操作周期仅由地址建立周期

(ADDSET)和数据建立周期(DATAST)组成,且在数据建立周期期间写使能信号线发出写信号,接着FSMC把数据通过数据线传输到存储器中。

初学 FSMC - 外扩SRAM(二)的更多相关文章

  1. stm32f103vct6外扩sram芯片

    STM32F103是一款高性价比.多功能的单片机,配备常用的32位单片机片外资源,基于ARM Cortex-M3的32位处理器芯片,片内具有256KB FLASH,48KB RAM ( 片上集成12B ...

  2. stm32 外扩SRAM使用问题

    当把外扩SRAM内存拷贝到片上SRAM内存时使用内存拷贝函数memset()或者原子定义的mymemset()函数,编译器会提示空间不足. 原因是这两个函数一个是只能对片上SRAM操作,一个是只能对外 ...

  3. STM32F407 外扩SRAM

    字节控制功能.支持高/低字节控制. 看看实现 IS62WV51216 的访问,需要对 FSMC进行哪些配置. 这里就做一个概括性的讲解.步骤如下: 1)使能 FSMC 时钟,并配置 FSMC 相关的  ...

  4. STM32 ~ 外扩SRAM

    字节控制功能.支持高/低字节控制. 看看实现 IS62WV51216 的访问,需要对 FSMC进行哪些配置. 这里就做一个概括性的讲解.步骤如下: 1)使能 FSMC 时钟,并配置 FSMC 相关的  ...

  5. Java堆外内存之二:堆外内存使用总结

    目录: <堆外内存操作类ByteBuffer> <DirectBuffer> <Unsafe(java可直接操作内存(),挂起与恢复,CAS操作)> 有时候对内存进 ...

  6. 初学后台框架总结篇二——快速了解CI框架

    一.下载CI框架并安装,这里放置一张自己的项目目录结构图 目录框架搭建好之后开始将自己的项目与框架融合 二.更改相关配置 1.用任何文本编辑器打开 application/config/config. ...

  7. 初学HTML 常见的标签(二) 列表标签

    上次介绍了一些简单的文本标签设计, 这篇介绍列表类标签, 通过列表能写出很好看的, 多元化的网络页面. ul-li 列表标签 <ul> <li>列表1</li> & ...

  8. stm32 FSMC-外扩SRAM IS62WV51216

    引脚定义 FSMC配置步骤 1.使能对应引脚GPIO时钟 2.配置GPIO引脚模式 3.使能FSMC时钟 4.FSMC初始化 5.存储器块使能 举例 #define Bank1_SRAM3_ADDR ...

  9. 初学c# -- 学习笔记(二)

    接着前面的学习,对话建立了,下面就写对话框气泡,和微信的差不多那种.尖角对话气泡网上一堆,圆尖角的修改了一个.IE8以下不能用,其他都可以用,直接上html代码,将<style>内容用到你 ...

  10. 初学swift笔记运算符(二)

    swift 中的运算符 import Foundation //字符类型 var char: Character = "a" char="b" println( ...

随机推荐

  1. SecureCRT很好用的几个快捷键

    以下是我在使用SecureCRT这个SSH工具时用到的很实用的快捷键,与大家分享: [Alt]+[Enter]:全屏 [Alt]+[B]: 快速打开新的连接 [Alt]+[1/2/3/4/5.../9 ...

  2. Divisors of the Divisors of an Integer题解

    Divisors of the Divisors of an Integer 题意:定义d[x]为x的因子个数,sndd[y]为y的因子的因子个数和. 思路:任意一个大于一的数,都可以分解为若干个质数 ...

  3. win32 - IFolderView2::GetCurrentFolderFlags的使用

    网上关于IFolderView2接口调用的示例有点少. 下面的例子是将桌面的图标隐藏起来,使用了FWF_NOICONS样式. #include <ShlObj.h> // Shell AP ...

  4. kafka学习笔记01-kafka简介和架构介绍

    一.kafka介绍 kafka 最开始是 Linkedin 用来处理海量的日志信息,后来 linkedin 于 2010 年贡献给了 Apache 基金会并成为了顶级项目. 后来开发 kafka 的一 ...

  5. TCP/IP的确认号,序列号和超时重传的学习笔记

    一:确认应答和序列号 在tcp中,发送端的数据到达主机时,接收端会返回一个已收到的通知.这个消息叫做确认应答(ACK). 当发送端发送数据后,会等待对端的确认应答.如果有确认应答,说明数据已经成功到达 ...

  6. 【libGDX】使用Mesh绘制立方体

    1 前言 ​ 本文主要介绍使用 Mesh 绘制立方体,读者如果对 Mesh 不太熟悉,请回顾以下内容: 使用Mesh绘制三角形 使用Mesh绘制矩形 使用Mesh绘制圆形 ​ 在绘制立方体的过程中,主 ...

  7. Python 潮流周刊第 39 期(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  8. 关于Image的mode属性(多图示例)

    一.总览 Image的mode是指图片裁剪.缩放的模式,共有14个合法值,分别是: /** 缩放模式,不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素 */ scaleToFill ...

  9. 【Azure App Services】多次操作App Service伸缩实例遇见限制操作记录

    问题描述 多次操作App Services,进行实例数的变化.达到限制后遇见报错: 错误的具体描述为: { "status": "Failed", " ...

  10. 从零开始写 Docker(三)---基于 cgroups 实现资源限制

    本文为从零开始写 Docker 系列第三篇,在mydocker run 基础上基于 cgroups 实现容器的资源限制. 完整代码见:https://github.com/lixd/mydocker ...