FMC


1、FMC简介

  STM32F429 使用 FMC 外设来管理扩展的存储器, FMC 是 Flexible Memory Controller的缩写,译为可变存储控制器。它可以用于驱动包括 SRAM、 SDRAM、 NOR FLASH 以及NAND FLSAH 类型的存储器。在其它系列的 STM32 控制器中,只有 FSMC 控制器(Flexible Static Memory Controller),译为可变静态存储控制器,所以它们不能驱动 SDRAM这样的动态存储器,因为驱动 SDRAM 时需要定时刷 新, STM32F429 的 FMC 外设才支持该功能,且只支持普通的 SDRAM,不支持 DDR 类型的 SDRAM。我们只讲述 FMC 的SDRAM 控制功能。

2、FMC模块框图解析

  (1)通讯引脚

  在框图的右侧是 FMC 外设相关的控制引脚,由于控制不同类型存储器的时候会有一些不同的引脚,看起来有非常多, 其中地址线 FMC_A 和数据线 FMC_D 是所有控制器都共用的。

  (2)存储器控制器

  上面不同类型的引脚是连接到 FMC 内部对应的存储控制器中的。 NOR/PSRAM/SRAM设备使用相同的控制器, NAND/PC 卡设备使用相同的控制器,而 SDRAM 存储器使用独立的控制器。不同的控制器有专用的寄存器用于配置其工作模式。

  控制 SDRAM 的有 FMC_SDCR1/FMC_SDCR2 控制寄存器、控制 SDRAM 的有 FMC_SDCR1/FMC_SDCR2 控制寄存器、刷新定时器寄存器。其中控制寄存器及时序寄存器各有 2 个,分别对应于 SDRAM 存储区域 1 和存储区域 2 的配置。

  FMC_SDCR 控制寄存器可配置 SDCLK 的同步时钟频率、突发读使能、写保护、 CAS延迟、行列地址位数以及数据总线宽度等。

  FMC_SDTR 时序寄存器用于配置 SDRAM 访问时的各种时间延迟,如 TRP 行预充电延迟、 TMRD 加载模式寄存器激活延迟等。

  FMC_SDCMR 命令模式寄存器用于存储要发送到 SDRAM 模式寄存器的配置,以及要向 SDRAM 芯片发送的命令。

  FMC_SDRTR 用于配置 SDRAM 的自动刷新周期。

  (3) 时钟控制逻辑

  FMC 外设挂载在 AHB3 总线上,时钟信号来自于 HCLK(默认 180MHz),控制器的时钟输出就是由它分频得到。如 SDRAM 控制器的 FMC_SDCLK 引脚输出的时钟,是用于与SDRAM 芯片进行同步通讯,它的时钟频率可通过 FMC_SDCR1 寄存器的 SDCLK 位配置,可以配置为 HCLK 的 1/2 或 1/3,也就是说,与 SDRAM 通讯的同步时钟最高频率为90MHz。 

  3、 FMC 的地址映射

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

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

  (1)SDRAM 的存储区域

  FMC 把 SDRAM 的存储区域分成了 Bank1 和 Bank2 两块,这里的 Bank 与 SDRAM 芯片内部的 Bank 是不一样的概念,只是 FMC 的地址区域划分而已。每个 Bank 有不一样的起始地址,且有独立的 FMC_SDCR 控制寄存器和 FMC_SDTR 时序寄存器,还有独立的FMC_SDCKE 时钟使能信号线和 FMC_SDCLK 信号线。 FMC_SDCKE0 和 FMC_SDCLK0对应的存储区域 1 的地址范围是 0xC000 0000-0xCFFF FFFF,而 FMC_SDCKE1 和FMC_SDCLK1 对应的存储区域 2 的地址范围是 0xD000 0000- 0xDFFF FFFF。 当程序里控制内核访问这些地址的存储空间时, FMC 外设会即会产生对应的时序,对它外接的SDRAM 芯片进行读写。

  (2)External RAM 与 External device 的区别

  比较遗憾的是 FMC 给 SDRAM 分配的区域不在 External RAM 区,这个区域可以直接执行代码,而 SDRAM 所在的 External device 区却不支持这个功能。这里说的可直接执行代码的特性就是在“常用存储器”章节介绍的 XIP(eXecute In Place)特性,即存储器上若存储了代码, CPU 可直接访问代码执行,无需缓存到其它设备上再运行;而且 XIP 特性还对存储器的种类有要求, SRAM/SDRAM 及 NOR Flash 都支持这种特性, 而 NAND FLASH及 PC 卡是不支持 XIP 的。结合存储器的特性和 STM32 FMC 存储器种类的地址分配,就发现它的地址规划不合理了, NAND FLASH 和 PC 卡这些不支持 XIP 的存储器却占据了External RAM 的空间,而支持 XIP 的 SDRAM 存储器的空间却被分配到了 Extern device 区。

  为了解决这个问题,通过配置“ SYSCFG_MEMRMP”寄存器的“SWP_FMC”寄存器位可用于交换 SDRAM 与 NAND/PC 卡的地址映射,使得存储在 SDRAM 中的代码能被执行,只是由于 SDRAM 的最高同步时钟是 90MHz,代码的执行速度会受影响。

  这里主要讲解当 STM32 的片内 SRAM 不够用时使用 SDRAM 扩展内存,但假如程序太大,它的程序空间 FLASH 不够用怎么办呢?首先是裁剪代码,目前 STM32F429 系列芯片内部 FLASH 空间最高可达 2MB,实际应用中只要我们把代码中的图片、字模等占据大空间的内容放到外部存储器中,纯粹的代码很难达到 2MB。如果还不够用,非要扩展程序空间的话,一种方法是使用 FMC 扩展 NOR FLASH,把程序存储到 NOR 上,程序代码能够直接在 NOR FLASH 上执行。另一种方法是把程序存储在其它外部存储器,如 SD 卡,需要时把存储在 SD 卡上的代码加载到 SRAM 或 SDRAM 上,再在 RAM 上执行代码。如果 SDRAM 不是用于存储可执行代码,只是用来保存数据的话,在 External RAM 或Exteranl device 区域都没有区别,不需要与 NAND 的映射地址交换。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM