STM32:FMC_h7xx
前言:FMC(Flexible Memory Controller) 灵活存储控制器,是STM32针对各种存储器外设,所推出的一种总线控制器;可以配置多种存储器接口用来通信;
那么FMC和FSMC有什么区别呢?FMC是在FSMC(Flexible Static Memory Controller)的基础上扩展了SDRAM的总线控制器;没什么区别;
1 灵活存储控制器类型
fmc控制器用来配置单片机与各种存储器的通信配置;不同存储器类型的配置不同;
fmc同一时刻只能控制一个存储器外设 (因为fmc配置的地址线,数据线和控制线是共享的) ;每种存储区内都有自己的bank片选信号;
fmc包含三种类型的存储控制器:NOR/PSRAM/SRAM存储控制器,NAND控制器,SDRAM控制器;
下图给出了三种存储控制器的默认地址,以及地址重映射配置参数;还给出了NOR/PSRAM部分地址相关配置参数;
可知控制器内部总线的寻址范围为2^26线;寻址的最小单位为byte;
如果寻址单位为16bits数据时,则内部总线的地址线bit0不使用;比如当fmc_addr[23:16]连接到单片机,内部总线stm_addr对应地址应该为[24:17];
概括而言,就是代码中操作的地址是fmc内部地址总线的地址;而单片机接口接出的地址对应的是存储器的地址;
AHB 时钟 (fmc_hclk) 是 FMC 寄存器访问的参考时钟单位;
2 NOR/PSRAM/SRAM存储控制器
2.1 引脚说明
A[25:0]引脚: 地址总线,为共享信号;为外部存储器的地址总线,不是内部fmc寻址时的地址总线;
D[31:0]引脚: 数据总线,为共享信号;可以配置数据位为8bits/16bits/32bits;
NE[4:1]引脚: fmc控制的nor/psram/sram存储器的默认地址为0x6000_0000到0x6fff_ffff;分为4个bank;每个bank都有唯一的片选信号NE[4:1];
FMC_CLK引脚: FMC在驱动NOR/PSRAM/SRAM存储器时,通常工作于异步模式下,不需要使用FMC_CLK信号线;
FMC在驱动NOR/PSRAM存储器时,只有工作在同步访问的突发模式下时,才会需要使用FMC_CLK信号线;
FMC_CLK信号是fmc_ker_ck分频得到的信号,通过配置CCLKEN位来决定是否启用;
NOE引脚: 读数据信号;单片机读取数据;
NWE引脚: 写数据信号;单片机发送数据;
NL(NADV)引脚: 锁存使能,nor flash的地址有效信号;
NWAIT引脚: nor flash输入到单片机的信号,表示nor flash准备好了,等待输入;
NBL[3:0]引脚: PSRAM/SRAM的字节输出通道输出引脚,控制字节0到字节3的使能;
信号引脚"N"为前缀,表示该信号低电平有效;
2.2 参数配置:nor flash举例
许多参数用不到,并没有了解的十分深入,具体配置如下;
//nor 参数配置 hnor.Instance=FMC_NORSRAM_DEVICE; //存储器选择 hnor.Extended=FMC_NORSRAM_EXTENDED_DEVICE; //扩展寄存器地址 读写可不同时序 hnor.Init.NSBank=FMC_NORSRAM_BANK1; //选择FMC SRAM Bank1区 hnor.Init.DataAddressMux=FMC_DATA_ADDRESS_MUX_DISABLE; //使能数据地址不复用 hnor.Init.MemoryType=FMC_MEMORY_TYPE_NOR; //选择存储器类型 hnor.Init.MemoryDataWidth=FMC_NORSRAM_MEM_BUS_WIDTH_16; //数据位宽为16位 hnor.Init.BurstAccessMode=FMC_BURST_ACCESS_MODE_DISABLE;//禁止读突发访问 读操作工作在异步模式 hnor.Init.WaitSignal=FMC_WAIT_SIGNAL_DISABLE; hnor.Init.WaitSignalPolarity=FMC_WAIT_SIGNAL_POLARITY_LOW; hnor.Init.WaitSignalActive=FMC_WAIT_TIMING_BEFORE_WS; hnor.Init.AsynchronousWait=FMC_ASYNCHRONOUS_WAIT_DISABLE; hnor.Init.WriteOperation=FMC_WRITE_OPERATION_ENABLE; hnor.Init.ExtendedMode=FMC_EXTENDED_MODE_DISABLE; //禁止扩展模式 此时读写按照模式2进行 hnor.Init.WriteBurst=FMC_WRITE_BURST_DISABLE; //禁止写突发访问 写操作工作在异步模式 //hnor.Init.ContinuousClock=FMC_CONTINUOUS_CLOCK_SYNC_ASYNC; hnor.Init.WriteFifo=FMC_WRITE_FIFO_ENABLE; //读写数据应该底层是按位操作先的,然后再字节操作;所以要fifo; hnor.Init.PageSize=FMC_PAGE_SIZE_NONE;
2.3 时序说明
同步时序配置:具体看中文参考手册的各个模式的时序;
异步时序配置:概括来说,可以将异步时序配置成 "使能扩展模式" 和 "禁止扩展模式" 两种模式;
(1)使能扩展模式:fmc的时序可以混合使用A,B,C,D模式;比如使用模式A读取,而在模式B写入;
(2)禁止扩展模式:当fmc配置为SRAM/PSRAM 存储器类型时,默认使用模式1时序 (FMC_BCRx 寄存器中MTYP = 0x0 或 0x01);
当fmc配置为 NOR 存储器类型时,默认使用模式2时序 (FMC_BCRx 寄存器中MTYP = 0x10);
2.3.1 nor flash时序说明
nor flash可以工作在同步或异步模式,以工作在异步模式下的nor flash为例;nor flash的时序通过如下结构体配置:
/*nor时序的单位时钟来自AHB_HCLK,假设配置为了100MHz*/ /*NADV高电平(ADDSET) = AddressSetupTime + AddressHoldTime;*/ /*NADV低电平 = DataSetupTime + 1hclk时钟周期; */ Timing.AddressSetupTime=8; Timing.AddressHoldTime=2; Timing.DataSetupTime=7; //DATAST //Timing.BusTurnAroundDuration=0; //读写转换插入时间周期为0 //Timing.CLKDivision=0; //FMC输出时钟分频系数 在异步操作时无效 //Timing.DataLatency=0; //数据延迟 在异步操作时无效 //Timing.AccessMode=FMC_ACCESS_MODE_A; //时序操作模式A 在FMC_BCRx寄存器的ExtMode位为0时此设置无效
默认nor flash工作在模式2时序下,模式2的时序如下所示:
对于写入数据而言,在fpga端,可以简化为NWE使能的时候写入数据就行;
对于读取数据而言,在fpga端,可以简化为NOE使能的时候把数据放入数据线就行;
3 源码github
单片机源码:https://gitee.com/caesura/stm32h7_demo
fpga源码:https://gitee.com/caesura/fpga_demo