当前位置 博文首页 > 文章内容

    STM32:FMC灵活存储控制器

    作者: 栏目:未分类 时间:2020-08-29 16:01:11

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    前言: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

      单片机源码:

      fpga源码: