单片机FMC外设详细使用方法1【超级详细教程】
单片机的FMC
1 FMC是什么,有什么用
FMC是存储器控制器,它能自动产生控制存储器的逻辑时序,有了它就不用自己去写复杂的控制时序。
FSMC和FMC的区别是什么?
FSMC的功能比FMC少了一个功能,就是FSMC只支持静态,不支持动态。
FMC是一个片上外设,类似I2C,SPI之类的外设,所以要用它就要知道它的引脚分布,哪些引脚有FMC功能。
下面以都STM32F407为例
FMC能产生时序的控制器
如下所示的FSMC的地址线,数据线,控制线。
2 FMC引脚说明
FSMC驱动不同的外设需要不同的引脚功能,如下所示:
在SDRAM控制器的FMC如下:
FSMC控制不同的存储器要用到不同的引脚,其中:
FSMC_A 是地址线,所有器件公用
FSMC_D 是数据线,所有器件公用
NOR/PSRAM 是NOR和PSRAM类型的控制信号。
NAND/PC 是NAND和PC卡类型的控制信号。
注意: 前缀“N”表示相关的信号为低电平有效。
NOR Flash信号:
PSRAM/SRAM信号:
NOR Flash ,PSRAM存储器采用 16 位字寻址。最大容量为 512 Mb( 26 个地址线)
3 FMC外部器件地址映射
外部存储器被划分为 4 个固定大小的存储区域Bank,每个存储区域的大小为256 MB
代SDRAM控制器的FMC如下,有两个专用bank:
3.1 NOR FLASH 和 PSRAM的地址映射
NOR flash和PSRAM这两种都带有SRAM的接口,使用方法相同。
例如要控制一个NOR或者SRAM存储器,就要选择Bank1的存储区域,而每个Bank区域内部又分了4个小块,每一个小块的片选信号连接着对应的片选引脚FSMC_NE1/2/3/4。
当 STM32 访问0x60000000-0x63FFFFFF 地址空间时,FSMC_NE1 引脚会自动设置为低电平。
Bank1的256M字节空间由(ADDR[27:0])寻址28根地址线
。这里ADDR 是内部AHB地址总线,其中ADDR[25:0]
对应外部存储器地址FSMC_A[25:0]
,而HADDR[26:27]对内部4个小块进行寻址:
向地址线上发送的地址数据对应这外部存储器内的地址,Bank1的一小块大小是64MB。
而26根地址总线正好是64MB,即2^26=67 108 864=65 536KB = 64MB,这样FSMC的64MB每个bit位映射着存储器64MB的每个字节。可以这样理解,地址线上发的地址数据每变化一个bit位(或者地址数据每曾加一次),对应存储器内的一个字节地址。^(也可以这样理解,读数据时发送的地址增加了1,它返回了1个8bit位数据。 ) 这样能访问的bit位就是64MB*8=512Mbit。
由于HADDR 为单字节地址,所以存储器寻址是8bit位宽时就很操作, 当存储器只能按16bit位寻址或者按字寻址时就很麻烦了。为了方便操作,FSMC输出地址时将地址数值右移了一位,从FSMC的bit1开始计数。
当存储器是双字节寻址时,向FSMC地址线上发送的地址数据会被自动右移一位,变成了偶数,实际输出到地址线的数据就是偶数。
虽然是从FSMC_A[1]开始计数的,单FSMC_A[0]不能省略,必须链接到存储器的A[0]上。因为地址依然是16bit位的,只是只计偶数,地址线A[0]上一直是0。
当存储器是按字寻址(32位)时,按照上面的方法地址数据会被自动右移两位,实际输出到地址线的数据就是4的倍数。
3.2 NAND FLASH和PC卡地址映射
NAND FLASH和PC卡使用的接口相同,这里FSMC的使用方法也相同。
NAND/PC卡的FSMC地址映射区域有三个bank2,bank3,bank4。
对于控制NAND Flash的Bank2,Bank3区域,其中的每个特性区,通用区又分为三个部分,数据区域,命令区域,地址区域。
4 FMC寄存器
控制NOR Flash的寄存器有:
寄存器 | 名称 | 功能 |
---|---|---|
FSMC_BCR1/2/3/4 | 控制寄存器 | 存储器类型,数据宽度,信号极性 |
FSMC_BTR11/2/3/4 | 片选时序寄存器 | 数据时序,信号保持时间 |
FSMC_BWTR1/2/3/4 | 写时序寄存器 | 专用于写时序的时间控制 |
5 FMC时钟
FSMC挂在在AHB总线上,时钟信号来自于HCLK(stm32f407 默认168MHz),FMC控制存储器的同步时钟输出由此分频得到。
5.1 FSMC控制异步存储器的时序规则:
同步模式(读或写),所有输出信号均在HCLK的上升沿变化。
NOEL NWEL NEL NADVL NADVH NBLL 地址有效输出在 FMC_CLK 时钟的下降沿变化。
NOEH NWEH NEH NOEH NBLH 地址有效输出在 FMC_CLK 时钟的上升沿变化。
当存储器为异步类型时,不使用同步时钟信号,所以时钟分频配置不起作用。
根据异步存储器的特点,FSMC又扩展了四种时序模式,模式A,模式B,模式C,模式D。也可以使用混合模式来操作,例如模式A读,模式B写。
如果禁用扩展模式,FSMC可以在两种模式下工作,模式1和模式2
如果选择的存储类型是SRAM、PSRAM类型的,模式1为默认模式,
如果选择的存储类型是NOR存储器类型的,模式2为默认模式
比较以上模式时序
时序模式类型 | 特性描述 | 与其它模式的异同 |
---|---|---|
模式1 | 适用于SRAM/PSRAM (CRAM) | 访问阶段需要两个持续时间 |
模式A | 适用于SRAM/PSRAM (CRAM) NOE在读数据时在第二个保持时间为低电平 (数据线由存储器控制发出数据时NOE为低) |
访问阶段需要两个持续时间 |
模式2(B) | 适用于NOR Flash 时序, 有NADV信号,没有NBL信号。 模式2和模式B的读取访问相同,写入访问不同, 模式1FSMC向数据线发数据时NWE为低。 模式B的FSMC向数据线发数据时为高。 |
访问阶段需要两个持续时间 |
模式C | 适用于NOR Flash 时序,写入访问和和模式2相同。 读取访问与模式2不同的是在两个持续时间之间 NOE发生了切换(由高向的跳变) |
访问阶段需要两个持续时间 |
模式D | 和模式C相同, 就是在第一和第二保持时间之间多了一个中间时间 |
访问阶段需要三个持续时间 |
再理解一下上面的地址映射:
Bank是大区域,每个Bank内又分了4个小区域
不同的存储器类型对应着不同的,例如这个寄存器BankFMC_BCR[1……4],后面的数字对应着4个Bank,库函数里是根据存储器类型来选择对应的Bank的。
而HADDR[26:27]选择是每个Bank中的小区域,同时也对应着MCU外部的4个FSMC_NE引脚。