【FSMC】扩展外部 SRAM(2)
文章目录
- 前言
- 一、FSMC是什么?
- 二、FSMC框图剖析
- 1.通讯引脚
- 2.存储器控制器
- 3.时钟控制逻辑
- 三、FSMC 的地址映射
- 四、FSMC 控制 SRAM 的时序
- 读
- 写
- 五、 SRAM 时序结构体
- 六、 SRAM 初始化结构体
前言
第一篇文章主要讲了SRAM的原理,内部结构以及读写过程,接下来本文讲解有关FSMC相关知识,让读者对于这一名词有深入了解。
一、FSMC是什么?
- FSMC(Flexible Static Memory Controller,灵活静态存储控制器)是 STM32 系列芯片中用于扩展外部存储的专用接口。
- 核心功能:它通过并行总线连接,为主控芯片提供对各类外部静态存储器的访问能力,包括 SRAM、NOR Flash、EEPROM 等。
- 芯片兼容性:需要注意的是,F407 系列的 FSMC 仅支持静态存储器,无法驱动 SDRAM 这类需要动态刷新的存储器;而更高规格的 STM32F429 等型号则在 FSMC 基础上增加了对 SDRAM 的支持。
- 优势:作为并行接口,FSMC 的传输速率远高于 SPI、I2C 等串行接口,因此非常适合对带宽要求较高的场景,比如需要扩展大容量 SRAM 来缓存图像数据。
二、FSMC框图剖析

1.通讯引脚
- FSMC_NL[1:0]:对应 SRAM 的字节掩码信号 LB# 和 UB#,用于控制低字节和高字节的访问,实现 8 位 / 16 位数据宽度的切换。
- FSMC_A[18:0]:对应外部存储器的地址线,共 19 根地址线,可支持最大 512K(2¹⁹)个存储单元的寻址,适配你使用的 512K×16bit SRAM。
- FSMC_D[15:0]:16 位宽度的数据总线,直接连接 SRAM 的 I/O0–I/O15,一次可传输完整的 16 位数据。
- FSMC_NOE:对应 SRAM 的输出使能信号 OE#,低电平有效,控制存储器输出数据到总线上。
- FSMC_NWE:对应 SRAM 的写入使能信号 WE#,低电平有效,控制主机向存储器写入数据。
- FSMC_NE[4:1]:共 4 个片选信号,每个信号对应一个独立的存储块,可连接多片外部存储器来扩展总容量。通过为不同芯片分配独立的片选信号,系统可以将它们映射到不同的地址空间,实现无缝的大容量存储扩展。
2.存储器控制器
从架构图可明确,FSMC 内部按外设类型划分了专属的存储控制器,不同功能的外部信号对应接入匹配的控制器:其中 NOR Flash、PSRAM 等静态存储器共用NOR 存储控制器;NAND Flash、PC 卡则接入NAND/PC 卡存储控制器,分类驱动让接口控制更精准高效。
这些控制器的工作模式、时序参数均通过寄存器配置实现精准调控,针对 SRAM 扩展的常用核心寄存器如下:
- FSMC_BCR [4:1](存储块控制寄存器):核心配置寄存器,用于定义接口的基础工作属性,包括信号类型匹配、数据总线宽度(8/16 位)、控制信号的有效电平(高低电平定义)、存储块使能等关键参数;
- FSMC_BTR [4:1](存储块时序寄存器):读时序专用配置寄存器,用于设定各类读操作的延迟时间,如地址建立时间、地址保持时间、数据保持时间、总线周转时间等;
- FSMC_BWTR [4:1](存储块写时序寄存器):写时序专用配置寄存器,独立配置写操作的时序参数,与读时序分开调控,适配 SRAM 读写操作的不同时序要求,保证读写传输的稳定性。
3.时钟控制逻辑
- FSMC 外设挂载在 AHB 总线 上,核心时钟来自 HCLK(STM32F407 默认 168MHz)。
- 同步时钟输出 FSMC_CLK 是对 HCLK 进行分频得到的,分频比例可通过 FSMC_BTR 寄存器的 CLKDIV 位配置为 1/2 或 1/3,因此最高同步时钟频率为 84MHz(168MHz ÷ 2)。
- 本次实验使用的是异步SRAM,所以无需配置此位
三、FSMC 的地址映射
这里主要探究它与I2C EEPROM和SPI Flash的访问方式的区别。
-
FSMC 将外部存储器纳入 STM32 的内存地址空间,CPU 可直接寻址;I2C/SPI 外设拥有独立地址空间,需通过总线协议发送地址和指令才能访问。
-
FSMC 访问像操作内部 RAM 一样简单(直接地址操作);I2C/SPI 需要严格遵循通信协议,分步发送指令、地址、数据。

左边是内核的地址映射,右边是四个存储区,存储区内部还有4个小块,我可以操作EN位进行选中多个小块。

四、FSMC 控制 SRAM 的时序
读

读时序的一个控制周期主要包括地址建立周期和数据建立周期和两个HCLK时钟,地址建立周期主要进行:地址线发送要操作的存储器的地址,数据掩码确定对应地址的高八位/低八位数据,片选使能;数据建立周期主要负责读使能,数据通过数据线从存储器到电脑的过程。
写

写时序类似,只不过一个写时序的控制周期包括地址建立周期和数据建立周期。使能的是写,数据流向是主机通过数据线向存储器传输数据。
五、 SRAM 时序结构体
控制FSMC来控制SRAM主要是配置时序寄存器和控制寄存器
/**
* @brief Timing parameters For NOR/SRAM Banks
*/
typedef struct
{
uint32_t FSMC_AddressSetupTime; /*!< Defines the number of HCLK cycles to configure
the duration of the address setup time.
This parameter can be a value between 0 and 0xF.
@note This parameter is not used with synchronous NOR Flash memories. */
uint32_t FSMC_AddressHoldTime; /*!< Defines the number of HCLK cycles to configure
the duration of the address hold time.
This parameter can be a value between 0 and 0xF.
@note This parameter is not used with synchronous NOR Flash memories.*/
uint32_t FSMC_DataSetupTime; /*!< Defines the number of HCLK cycles to configure
the duration of the data setup time.
This parameter can be a value between 0 and 0xFF.
@note This parameter is used for SRAMs, ROMs and asynchronous multiplexed NOR Flash memories. */
uint32_t FSMC_BusTurnAroundDuration; /*!< Defines the number of HCLK cycles to configure
the duration of the bus turnaround.
This parameter can be a value between 0 and 0xF.
@note This parameter is only used for multiplexed NOR Flash memories. */
uint32_t FSMC_CLKDivision; /*!< Defines the period of CLK clock output signal, expressed in number of HCLK cycles.
This parameter can be a value between 1 and 0xF.
@note This parameter is not used for asynchronous NOR Flash, SRAM or ROM accesses. */
uint32_t FSMC_DataLatency; /*!< Defines the number of memory clock cycles to issue
to the memory before getting the first data.
The parameter value depends on the memory type as shown below:
- It must be set to 0 in case of a CRAM
- It is don't care in asynchronous NOR, SRAM or ROM accesses
- It may assume a value between 0 and 0xF in NOR Flash memories
with synchronous burst mode enable */
uint32_t FSMC_AccessMode; /*!< Specifies the asynchronous access mode.
This parameter can be a value of @ref FSMC_Access_Mode */
}FSMC_NORSRAMTimingInitTypeDef;
- (1) FSMC_AddressSetupTime
本成员设置地址建立时间,即 FSMC 读写时序图 FSMC 模式 A 的读时序 中的 ADDSET
值,它可以被设置为 0-0xF 个 HCLK 周期数,按 STM32 标准库的默认配置, HCLK 的
时钟频率为 168MHz,即一个 HCLK 周期为 1/168 微秒。 - (2) FSMC_AddressHoldTime
本成员设置地址保持时间,它可以被设置为 0-0xF 个 HCLK 周期数。 - (3) FSMC_DataSetupTime本成员设置数据建立时间,即 FSMC 读写时序图 FSMC 模式 A 的写时序 中的 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_AccessMode_A/B/C/D 模式。一般来说控制 SRAM 时使用 A 模式。
这个 FSMC_NORSRAMTimingInitTypeDef 时序结构体配置的延时参数,将作为下一节的 FSMC
SRAM 初始化结构体的一个成员
六、 SRAM 初始化结构体
/**
* @brief FSMC NOR/SRAM Init structure definition
*/
typedef struct
{
uint32_t FSMC_Bank; /*!< Specifies the NOR/SRAM memory bank that will be used.
This parameter can be a value of @ref FSMC_NORSRAM_Bank */
uint32_t FSMC_DataAddressMux; /*!< Specifies whether the address and data values are
multiplexed on the data bus or not.
This parameter can be a value of @ref FSMC_Data_Address_Bus_Multiplexing */
uint32_t FSMC_MemoryType; /*!< Specifies the type of external memory attached to
the corresponding memory bank.
This parameter can be a value of @ref FSMC_Memory_Type */
uint32_t FSMC_MemoryDataWidth; /*!< Specifies the external memory device width.
This parameter can be a value of @ref FSMC_Data_Width */
uint32_t FSMC_BurstAccessMode; /*!< Enables or disables the burst access mode for Flash memory,
valid only with synchronous burst Flash memories.
This parameter can be a value of @ref FSMC_Burst_Access_Mode */
uint32_t FSMC_AsynchronousWait; /*!< Enables or disables wait signal during asynchronous transfers,
valid only with asynchronous Flash memories.
This parameter can be a value of @ref FSMC_AsynchronousWait */
uint32_t FSMC_WaitSignalPolarity; /*!< Specifies the wait signal polarity, valid only when accessing
the Flash memory in burst mode.
This parameter can be a value of @ref FSMC_Wait_Signal_Polarity */
uint32_t FSMC_WrapMode; /*!< Enables or disables the Wrapped burst access mode for Flash
memory, valid only when accessing Flash memories in burst mode.
This parameter can be a value of @ref FSMC_Wrap_Mode */
uint32_t FSMC_WaitSignalActive; /*!< Specifies if the wait signal is asserted by the memory one
clock cycle before the wait state or during the wait state,
valid only when accessing memories in burst mode.
This parameter can be a value of @ref FSMC_Wait_Timing */
uint32_t FSMC_WriteOperation; /*!< Enables or disables the write operation in the selected bank by the FSMC.
This parameter can be a value of @ref FSMC_Write_Operation */
uint32_t FSMC_WaitSignal; /*!< Enables or disables the wait state insertion via wait
signal, valid for Flash memory access in burst mode.
This parameter can be a value of @ref FSMC_Wait_Signal */
uint32_t FSMC_ExtendedMode; /*!< Enables or disables the extended mode.
This parameter can be a value of @ref FSMC_Extended_Mode */
uint32_t FSMC_WriteBurst; /*!< Enables or disables the write burst operation.
This parameter can be a value of @ref FSMC_Write_Burst */
FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct; /*!< Timing Parameters for write and read access if the Extended Mode is not used*/
FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct; /*!< Timing Parameters for write access if the Extended Mode is used*/
}FSMC_NORSRAMInitTypeDef;
-
(1) FSMC_Bank
本成员用于选择 FSMC 映射的存储区域,它的可选参数以及相应的内核地址映射范围见表可以选择的存储器区域及区域对应的地址范围。

-
(2) FSMC_DataAddressMux
本成员用于设置地址总线与数据总线是否复用 (FSMC_DataAddressMux_Enable /Disable),在控制 NOR FLASH 时,可以地址总线与数据总线可以分时复用,以减少使用
STM32 信号线的数量。 -
(3) FSMC_MemoryType
本成员用于设置要控制的存储器类型,它支持控制的存储器类型为 SRAM、 PSRAM
以及 NOR FLASH(FSMC_MemoryType_SRAM/PSRAM/NOR)。 -
(4) FSMC_MemoryDataWidth
本 成 员 用 于 设 置 要 控 制 的 存 储 器 的 数 据 宽 度, 可 选 择 设 置 成 8 或 16 位
(FSMC_MemoryDataWidth_8b /16b)。 -
(5) FSMC_BurstAccessMode
本成员用于设置是否使用突发访问模式 (FSMC_BurstAccessMode_Enable/Disable),突
发访问模式是指发送一个地址后连续访问多个数据,非突发模式下每访问一个数据
都需要输入一个地址,仅在控制同步类型的存储器时才能使用突发模式。 -
(6) FSMC_AsynchronousWait
本 成 员 用 于 设 置 是 否 使 能 在 同 步 传 输 时 使 用 的 等 待 信 号
(FSMC_AsynchronousWait_Enable/Disable), 在 控 制 同 步 类 型 的 NOR 或 PSRAM
时,存储器可以使用 FSMC_NWAIT 引脚通知 STM32 需要等待。 -
(7) FSMC_WaitSignalPolarity本成员用于设置等待信号的有效极性,即要求等待时,使用高电平还是低电平
(FSMC_WaitSignalPolarity_High/Low)。 -
(8) FSMC_WrapMode
本成员用于设置是否支持把非对齐的 AHB 突发操作分割成 2 次线性操作
(FSMC_WrapMode_Enable/Disable),该配置仅在突发模式下有效。 -
(9) FSMC_WaitSignalActive
本 成 员 用 于 配 置 在 突 发 传 输 模 式 时, 决 定 存 储 器 是 在 等 待
状 态 之 前 的 一 个 数 据 周 期 有 效 还 是 在 等 待 状 态 期 间 有 效
(FSMC_WaitSignalActive_BeforeWaitState/DuringWaitState)。 -
(10) FSMC_WriteOperation
这个成员用于设置是否写使能 (FSMC_WriteOperation_ Enable /Disable),禁止写使能的
话 FSMC 只能从存储器中读取数据,不能写入。 -
(11) FSMC_WaitSignal
本成员用于设置当存储器处于突发传输模式时,是否允许通过 NWAIT 信号插入等待
状态 (FSMC_WaitSignal_Enable/Disable)。 -
(12) FSMC_ExtendedMode
本成员用于设置是否使用扩展模式 (FSMC_ExtendedMode_Enable/Disable),在非扩
展模式下,对存储器读写的时序都只使用 FSMC_BCR 寄存器中的配置,即下面的
FSMC_ReadWriteTimingStruct 结构体成员;在扩展模式下,对存储器的读写时序可以
分开配置,读时序使用 FSMC_BCR 寄存器,写时序使用 FSMC_BWTR 寄存器的配置,
即下面的 FSMC_WriteTimingStruct 结构体。 -
(13) FSMC_ReadWriteTimingStruct
本 成 员 是 一 个 指 针, 赋 值 时 使 用 上 一 小 节 中 讲 解 的 时 序 结 构 体
FSMC_NORSRAMInitTypeDef 设置,当不使用扩展模式时,读写时序都使用本
成员的参数配置。 -
(14) FSMC_WriteTimingStruct同样地,本成员也是一个时序结构体的指针,只有当使用扩展模式时,本配置才有效,
它是写操作使用的时序。
对本结构体赋值完成后,调用 FSMC_NORSRAMInit 库函数即可把配置参数写入到 FSMC_BCR及 FSMC_BTR/BWTR 寄存器中
本文地址:https://www.yitenyun.com/6900.html










