47.1 初学者重要提示
F1和F407使用的是FSMC(Flexible static memory controller),跟F429和H7带的FMC区别是不支持SDRAM,也就是差在字母static,使用FMC可以动态刷新SDRAM,来保持电量。
FMC控制SRAM型存储器和NAND型存储器是异步控制,而控制SDRAM属于同步控制。同步和异步的区别是同步方式需要一个专门的时钟控制引脚。
FMC配置中未用到引脚均可以继续用作通用I/O模式或者其它复用功能,仅需不配置FMC复用即可。
STM32H7驱动32位SDRAM的写速度狂飙376MB/S,读速度189MB/S。http://www.armbbs.cn/forum.php?mod=viewthread&tid=91481 。
47.2 FMC基础知识
FMC的几个关键知识点放在开头说:
STM32H7的FMC总线是挂载64位带宽的AXI总线上,F1,F4和F7是挂在32位总线上。
使用FMC,可以用来外挂NOR/PSRAM型存储器,SRAM型存储器,NAND型存储器,SDRAM存储器等,从而可以用来驱动AD7606,OLED,DM9000等并行控制设备。
支持8位,16位和32位总线带宽控制。
每个片选下的存储器空间配置都是独立的,有专门的寄存器,互不影响。这点比较重要,要牢记。
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涉及到的知识点比较多,而且实际项目中用到的地方也比较多,望初学者熟练运用。