STM32 HAL库开发:FSMC扩展外部SRAM应用详解

SRAM读写时序

对SRAM进行读写数据时,它各个信号线的时序流程如下图

(图一)SRAM的读时序


(图二)SRAM的写时序

流程解释
  • 主机使用地址信号线发出要访问的存储器目标地址;
  • 控制片选信号CS1#及CS2#使能存储器芯片;
  • 若是要进行读操作,则控制读使能信号OE#表示要读数据,若进行写操作则控制写使能信号WE#表示要写数据;
  • 使用掩码信号B#与UB#指示要访问目标地址的高、低字节部分;
  • 若是读取过程,存储器会通过数据线向主机输出目标数据,若是写入过程,主要使用数据线向存储器传输目标数据。
  • 参数介绍

    在读写时序中,有几个比较重要的时间参数,在使用STM32 控制的时候需要参考,它们的介绍见下表。

    SRAM时序结构体

    控制FSMC使用SRAM存储器时主要是配置时序寄存器以及控制寄存器,利用HAL库的SRAM时序结构体以及初始化结构体可以很方便地写入参数。

    typedef struct
    {
       uint32_t FSMC_AddressSetupTime;       /*地址建立时间,0-0xF个HCLK周期*/
       uint32_t FSMC_AddressHoldTime;        /*地址保持时间,0-0xF个HCLK周期*/
       uint32_t FSMC_DataSetupTime;           /*地址建立时间,0-0xF个HCLK周期*/
       uint32_t FSMC_BusTurnAroundDuration;/*总线转换周期,0-0xF个HCLK周期,在NOR FLASH */
       uint32_t FSMC_CLKDivision;/*时钟分频因子,1-0xF,若控制异步存储器,本参数无效 */
       uint32_t FSMC_DataLatency;    /*数据延迟时间,若控制异步存储器,本参数无效 */
       uint32_t FSMC_AccessMode;             /*设置访问模式 */
    }FSMC_NORSRAMTimingInitTypeDef;
    

    这个结构体成员定义的都是SRAM读写时序中的各项时间参数,这些成员的的参数都与FSMC_BRT及FSMC_BWTR寄存器配置对应,各个成员介绍如下:

    1. FSMC_AddressSetupTime
      本成员设置地址建立时间,即FSMC读写时序中的ADDSET值,它可以被设置为0-0xF个HCLK周期数,按STM32HAL库的默认配置,HCLK的时钟频率为168MHz,即一个HCLK周期为1/168微秒。
    2. FSMC_AddressHoldTime
      3本成员设置地址保持时间,它可以被设置为0-0xF个HCLK周期数。
    3. FSMC_DataSetupTime
      本成员设置数据建立时间,即FSMC读写时序 图26_10 中的DATAST值,它可以被设置为0-0xF个HCLK周期数。
    4. FSMC_BusTurnAroundDuration
      本成员设置总线转换周期,在NOR FLASH存储器中,地址线与数据线可以分时复用,总线转换周期就是指总线在这两种状态间切换需要的延时, 防止冲突。控制其它存储器时这个参数无效,配置为0即可。
    5. FSMC_CLKDivision
      本成员用于设置时钟分频,它以HCLK时钟作为输入,经过FSMC_CLKDivision分频后输出到FSMC_CLK引脚作为通讯使用的同步时钟。控制其它异步通讯的存储器时这个参数无效,配置为0即可。
    6. FSMC_DataLatency
      本成员设置数据保持时间,它表示在读取第一个数据之前要等待的周期数,该周期指同步时钟的周期,本参数仅用于同步NOR FLASH类型的存储器,控制其它类型的存储器时,本参数无效。
    7. FSMC_AccessMode
      本成员设置存储器访问模式,不同的模式下FSMC访问存储器地址时引脚输出的时序不一样,可选FSMC_ACCESS_MODE_A/B/C/D模式。一般来说控制SRAM时使用A模式。

    这个FSMC_NORSRAM_TimingTypeDef时序结构体配置的延时参数,将作为下一节的FSMC SRAM初始化结构体的一个成员。

    FSMC控制SRAM的时序

    FSMC外设支持输出多种不同的时序以便于控制不同的存储器,它具有ABCD四种模式,下面我们仅针对控制SRAM使用的模式A进行讲解。

    (图三)FSMC模式A的读时序

    (图四)FSMC模式A的写时序

    流程解释
  • 当内核发出访问某个指向外部存储器地址时,FSMC外设会根据配置控制信号线产生时序访问存储器,上图中的是访问外部SRAM时FSMC外设的读写时序。
  • 以读时序为例,该图表示一个存储器操作周期由地址建立周期(ADDSET)、数据建立周期(DATAST)以及2个HCLK周期组成。在地址建立周期中,地址线发出要访问的地址,数据掩码信号线指示出要读取地址的高、低字节部分,片选信号使能存储器芯片;地址建立周期结束后读使能信号线发出读使能信号,接着存储器通过数据信号线把目标数据传输给FSMC,FSMC把它交给内核。
  • 写时序类似,区别是它的一个存储器操作周期仅由地址建立周期(ADDSET)和数据建立周期(DATAST)组成,且在数据建立周期期间写使能信号线发出写信号,接着FSMC把数据通过数据线传输到存储器中。
  • FSMC-SRAM初始化结构体

    /**
     1. @brief  FSMC NOR/SRAM Init structure definition
    */
    typedef struct
    {
       uint32_t NSBank;                /*设置要控制的Bank区域 */
       uint32_t DataAddressMux;        /*设置地址总线与数据总线是否复用 */
       uint32_t MemoryType;          /*设置存储器的类型 */
       uint32_t MemoryDataWidth;     /*设置存储器的数据宽度*/
       uint32_t BurstAccessMode;        /*设置是否支持突发访问模式,只支持同步类型的存储器 */
       uint32_t WaitSignalPolarity;  /*设置等待信号的极性*/
       uint32_t WrapMode;            /*设置是否支持对齐的突发模式 */
       uint32_t WaitSignalActive;    /*配置等待信号在等待前有效还是等待期间有效 */
       uint32_t WriteOperation;      /*设置是否写使能 */
       uint32_t WaitSignal;          /*设置是否使能等待状态插入 */
       uint32_t ExtendedMode;        /*设置是否使能扩展模式 */
       uint32_t WriteBurst;          /*设置是否使能写突发操作*/
       uint32_t AsynchronousWait;    /*设置是否使能等待信号*/
       uint32_t ContinuousClock;     /*设置是否使能FMC时钟输出到外部存储设备*/
       uint32_t WriteFifo;           /*设置是否使能FIFO*/
       uint32_t PageSize;            /*指定页的大小*/
       /*当不使用扩展模式时,本参数用于配置读写时序,否则用于配置读时序*/
       FSMC_NORSRAM_TimingTypeDef* FSMC_ReadWriteTimingStruct;
       /*当使用扩展模式时,本参数用于配置写时序*/
       FSMC_NORSRAM_TimingTypeDef * FSMC_WriteTimingStruct;
    } FSMC_NORSRAM_InitTypeDef;
    

    这个结构体,除最后两个成员是上一小节讲解的时序配置外,其它结构体成员的配置都对应到FSMC_BCR中的寄存器位。各个成员意义介绍如下,括号中的是STM32HAL库定义的宏:

    1. NSBank
      本成员用于选择FSMC映射的存储区域,它的可选参数以及相应的内核地址映射范围见表

    2. DataAddressMux
      本成员用于设置地址总线与数据总线是否复用(FSMC_DATA_ADDRESS_MUX_DISABLE/DISABLE),在控制NOR FLASH时,可以地址总线与数据总线可以分时复用,以减少使用STM32信号线的数量。

    3. MemoryType
      本成员用于设置要控制的存储器类型,它支持控制的存储器类型为SRAM、PSRAM以及NOR FLASH(FSMC_MEMORY_TYPE_SRAM/PSRAM/NOR)。

    4. MemoryDataWidth
      本成员用于设置要控制的存储器的数据宽度,可选择设置成8或16位(FSMC_NORSRAM_MEM_BUS_WIDTH_8/16/32)。

    5. BurstAccessMode
      本成员用于设置是否使用突发访问模式(FSMC_BURST_ACCESS_MODE_DISABLE /DISABLE),突发访问模式是指发送一个地址后连续访问多个数据,非突发模式下每访问一个数据都需要输入一个地址,仅在控制同步类型的存储器时才能使用突发模式。

    6. AsynchronousWait
      本成员用于设置是否使能在同步传输时使用的等待信号(FSMC_ASYNCHRONOUS_WAIT_DISABLE /DISABLE),在控制同步类型的NOR或PSRAM时,存储器可以使用FSMC_NWAIT引脚通知STM32需要等待。

    7. WaitSignalPolarity
      本成员用于设置等待信号的有效极性,即要求等待时,使用高电平还是低电平(FSMC_WAIT_SIGNAL_POLARITY_LOW /HIGH)。

    8. FSMC_WrapMode
      本成员用于设置是否支持把非对齐的AHB突发操作分割成2次线性操作(FSMC_WRAP_MODE_DISABLE /ENABLE),该配置仅在突发模式下有效。

    9. WaitSignalActive
      本成员用于配置在突发传输模式时,决定存储器是在等待状态之前的一个数据周期有效还是在等待状态期间有效(FSMC_WAIT_TIMING_BEFORE_WS / FSMC_WAIT_TIMING_DURING_WS)。

    10. WriteOperation
      这个成员用于设置是否写使能(FSMC_WRITE_OPERATION_DISABLE /ENABLE),禁止写使能的话FSMC只能从存储器中读取数据,不能写入。

    11. WaitSignal
      本成员用于设置当存储器处于突发传输模式时,是否允许通过NWAIT信号插入等待状态(FSMC_WAIT_SIGNAL_ENABLE /DISABLE)。

    12. ExtendedMode
      本成员用于设置是否使用扩展模式(FSMC_EXTENDED_MODE_ENABLE /DISABLE),在非扩展模式下,对存储器读写的时序都只使用FSMC_BCR寄存器中的配置,即下面的FSMC_ReadWriteTimingStruct结构体成员;在扩展模式下,对存储器的读写时序可以分开配置,读时序使用FSMC_BCR寄存器,写时序使用FSMC_BWTR寄存器的配置,即下面的FSMC_WriteTimingStruct结构体。

    对本结构体赋值完成后,调用FSMC_NORSRAMInit库函数即可把配置参数写入到FSMC_BCR及FSMC_BTR/BWTR寄存器中。

    作者:zhoutanooi

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 HAL库开发:FSMC扩展外部SRAM应用详解

    发表回复