【STM32H7教程】第47章 STM32H7的FMC总线基础知识和HAL库API

2023-04-07  

47.1 初学者重要提示

  1. F1和F407使用的是FSMC(Flexible static memory controller),跟F429和H7带的FMC区别是不支持SDRAM,也就是差在字母static,使用FMC可以动态刷新SDRAM,来保持电量。

  2. FMC控制SRAM型存储器和NAND型存储器是异步控制,而控制SDRAM属于同步控制。同步和异步的区别是同步方式需要一个专门的时钟控制引脚。

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

  4. STM32H7驱动32位SDRAM的写速度狂飙376MB/S,读速度189MB/S。armbbs.cn/forum.php? 。

47.2 FMC基础知识

FMC的几个关键知识点放在开头说:

  1. STM32H7的FMC总线是挂载64位带宽的AXI总线上,F1,F4和F7是挂在32位总线上。

  2. 使用FMC,可以用来外挂NOR/PSRAM型存储器,SRAM型存储器,NAND型存储器,SDRAM存储器等,从而可以用来驱动AD7606,OLED,DM9000等并行控制设备。

  3. 支持8位,16位和32位总线带宽控制。

  4. 每个片选下的存储器空间配置都是独立的,有专门的寄存器,互不影响。这点比较重要,要牢记。

47.2.1 FMC硬件框图

认识一个外设,最好的方式就是看他的框图,方便我们快速的了解FMC的基本功能,然后再看手册了解细节。框图如下所示:

通过这个框图,我们可以得到如下信息:

  • fmc_it to NVIC接口

用于FMC的NVIC配置,使能其中断通道。

  • fmc_hclk接口

FMC的接口时钟。

  • fmc_ker_ck接口

FMC的内核时钟。

  • SDRAM signals

驱动SDRAM独享的几个控制信号。

  • NAND signals

驱动NAND独享的几个控制信号。

  • NOR/PSRAM/SRAM shared signals

驱动NOR/PSRAM/SRAM的共享信号,主要是片选、读写控制和等待信号。

  • Shared signals

这个是驱动任何设备都要用到地址和数据线,地址线有A[0] – A[25],共计26根,能访问的地址空间是2^26 = 64MB。数据线是D[0] – D[31],共计32根,也就是说可以支持32位带宽的存储器访问模式。

  • NOR/SRAM shared signals

用于NOR/SRAM存储器的字节方式控制。

  • NOR/PSRAM signals

用于控制需要同步时钟的NOR/PSRAM类型存储器。

47.2.2 FMC时钟选择

使用FMC可以选择如下几种时钟源HCLK3,PLL1Q,PLL2R和PER_CK:

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

47.2.3 FMC地址区分配

FMC总线可操作的地址范围0x60000000到0xDFFFFFFF,具体的框图如下:

根据上面这个地址映射图,下面几个知识点要了解到:

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

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

对于NOR/PSRAM/SRAM块区。

这个块区用到的地方最多,像NAND和SDRAM块区基本只能接NAND和SDRAM,而NOR/PSRAM/SRAM区就不同了,除了能接这几种类型的存储器,还可以外接DM9000,SDRAM,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。

这里特别注意一点,每个片选控制的地址空间都是可以独立配置的,与其它片选控制的空间互不影响。也许大家会问,只有这四路片选不够用啊,而且还有片选引脚被复用做其它功能的情况,这可以通过外接地址译码器解决,V7开发板就是通过这种方式外接了多个总线设备。

使用NAND块区外接NAND的时候,务必要使用MPU将这块区域设置为Device模式。

47.2.4 NOR/PSRAM/SRAM区地址映射(重要)

FMC总线除了复用到具体引脚上的A[25:0],共计26路地址以外,还有两条内部总线ADDR[27:26]。通过这两路线才区分出了FMC_NE1,FMC_NE2,FMC_NE3和FMC_NE4。即0x60xx xxxx,0x64xx xxxx,0x68xx xxx和0x6Cxx xxxx。

这些地址都是按照字节进行访问的,如果控制8位宽度的存储设备比较方便,如果控制16位,32位宽度的存储设备,且不支持字节访问就比较麻烦了。比如16位宽度的NOR Flash,写入仅支持16位或者32位(通过写入两次16位),写入8位数据是不支持的。这个时候,为了方便操作,FMC在硬件设计上就提供了一种解决办法,将内部数据总线ADDR[25:0]措位后接到FMC_A地址引脚上。

配置外部存储器的宽度为16位, FMC将使用内部的ADDR[25:1]地址来作为对外部存储器的寻址地址FMC_A[24:0]。如果存储器宽度为32位, FMC将使用内部的ADDR[25:2]地址进行外部寻址。

但是不管存储器的宽度是多少, FMC_A[0]都应连接到外部存储器地址A[0]。

这里有一点要补充下,如果外接SDRAM/SRAM配置为16位或者32位带宽的时候,如何实现字节方式的读写。针对这个问题,SDRAM/SRAM都有专门的字节控制引脚,所以操作起来比较方便。

47.2.5 NOR/PSRAM/SRAM时序控制

F103和F407仅支持16位总线访问,等到F429,H7已经支持32位总线访问。以驱动SRAM为例,需要用到下面的数据,地址和控制引脚。配置完毕后,就可以像使用内部SRAM一样进行读写了,使用比较方便。

FMC支持以下四种时序模式:

/** @defgroup FMC_Access_Mode FMC Access Mode * @{ */ #define FMC_ACCESS_MODE_A ((uint32_t)0x00000000U) #define FMC_ACCESS_MODE_B ((uint32_t)0x10000000U) #define FMC_ACCESS_MODE_C ((uint32_t)0x20000000U) #define FMC_ACCESS_MODE_D ((uint32_t)0x30000000)
复制

每个模式的时序略有不同,我们这里以常用的模式A为例进行说明:

先来认识如下几个关键参数:

了解了这几个参数后再来看模式A的读时序:

通过读时序图,我们要了解到以下几点知识:

  • NBL[x:0]高低字节控制信号,NEx片选信号,NOE读使能信号和NWE写使能前面的字母N(Ngative)示这几个信号低电平有效。

  • 地址信号A[25:0],NBL[x:0]高低字节控制信号,要在NEx片选信号使能前准备就绪。整个读取过程中,NWE写使能信号是不起作用的,被设置为高电平。

  • NEx片选后,NOE要保持一段时间的高电平,这个时间就是ADDSET地址建立时间(通过寄存器FMC_BTRx可配置)。之后NOE变为低电平,读使能。低电平保持的时间由DATAST数据建立时间(通过寄存器FMC_BTRx可配置)决定。

  • 读取完毕数据后,NOE变成高电平,NEx变成高电平。

这里主要一点,A模式读时序没有用到地址保持时间(Address Hold)。

模式A的写时序:

通过写时序图,我们要了解到以下几点知识:

  • NBL[x:0]高低字节控制信号,NEx片选信号,NOE读使能信号和NWE写使能前面的字母N(Ngative)示这几个信号低电平有效。

  • 地址信号A[25:0],NBL[x:0]高低字节控制信号,要在NEx片选信号使能前准备就绪。整个写入过程中,NOE读使能信号是不起作用的,被设置为高电平。

  • NEx片选后,NWE要保持一段时间的高电平,这个时间就是ADDSET地址建立时间(通过寄存器FMC_BTRx可配置)。之后NWE变为低电平,写使能。低电平保持的时间由DATAST数据建立时间(通过寄存器FMC_BTRx可配置)决定。

  • 写入完毕数据后,等待NWE置高1个FMC时钟周期后,NOE变成低电平,NEx变成高电平。

这里主要一点,A模式写时序没有用到地址保持时间(Address Hold)。

47.2.6 NOR/PSRAM/SRAM的不同位宽通信问题

FMC是外挂在64位带宽的AXI总线上,可以8位,16位,32位或者64位方式操作。如果FMC外接设备是16位带宽,H7参考手册给出了不同位宽设置的支持情况:

根据上面表格,操作并口NOR Flash时,比如8位数据写入是不支持的,而读取是支持的,这是因为可以读取一个16位数据,放弃高字节或者低字节。

根据上面表格,操作SRAM就比较方便了,各种数据位宽都可以正常操作SRAM,因为SRAM有专门的,NBL[x:0]高低字节控制引脚。

47.3 FMC的HAL库用法

FMC的HAL库用法其实就是几个结构体变量成员的配置和使用,然后配置GPIO、时钟,并根据需要配置NVIC、中断和DMA。

总结

本章节就为大家讲解这么多,FMC涉及到的知识点比较多,而且实际项目中用到的地方也比较多,望初学者熟练运用。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。