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

 

posted @ 2020-08-29 15:49  caesura_k  阅读(4984)  评论(0编辑  收藏  举报