在 STM32 微控制器中配置和使用 FSMC (Flexible Static Memory Controller) 或其后继者 FMC (Flexible Memory Controller) 进行复用功能 (Multiplexed Mode) 主要涉及将数据总线 (FSMC_D[15:0]/FMC_D[15:0]) 也用作地址总线的一部分,以节省引脚资源(通常用于连接 NOR Flash、PSRAM 等存储器)。以下是详细步骤和关键点(以常见场景为例):
核心步骤:配置复用模式的 FSMC/FMC
1. 硬件连接
- 复用引脚: 确保目标存储器的
ADDR引脚连接到 STM32 的FSMC_D[15:0]/FMC_D[15:0]引脚。 - 控制信号: 至少连接:
FSMC_NE/FMC_NEx(片选)FSMC_NOE(输出使能/读)FSMC_NWE(写使能)FSMC_NBL[1:0](字节使能,可选)FSMC_Ax(地址线,用于锁存高位地址)
- 时钟:
FSMC_CLK(可选,用于同步模式)。
2. GPIO 配置 (复用功能)
关键:将所有涉及的 FSMC_D[15:0]、FSMC_Ax、FSMC_NEx、FSMC_NOE、FSMC_NWE 等引脚配置为复用推挽输出模式 (GPIO_MODE_AF_PP),并启用高速模式 (GPIO_SPEED_FREQ_HIGH 或 VERY_HIGH)。
// 示例 (HAL库, 以 STM32F4/F7/H7 FMC 为例)
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 配置数据/地址复用总线 (D0-D15)
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | ... | GPIO_PIN_15; // D0-D15 的具体引脚
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FMC; // FMC 的复用功能号 (查手册)
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); // 通常 GPIOD, GPIOE
// 配置地址线 (高位地址,如 A0-A18, 具体看需求)
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | ...; // A0-Ax 的具体引脚
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); // 通常 GPIOF, GPIOG
// 配置控制信号 (片选 NE, 读 NOE, 写 NWE)
GPIO_InitStruct.Pin = GPIO_PIN_7; // 例如 NE1 -> PG7 (查手册)
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5; // 例如 NOE->PD4, NWE->PD5
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
3. 时钟使能
使能 FSMC/FMC 控制器时钟和所用 GPIO 组的时钟。
__HAL_RCC_FMC_CLK_ENABLE(); // 使能 FMC 控制器时钟
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE(); // 根据实际使用的 GPIO 组
4. FMC/FSMC 控制器配置 (复用模式关键)
配置 FMC_NORSRAM_TimingTypeDef 和 FMC_NORSRAM_InitTypeDef,显式启用地址/数据复用 (FSMC_DataAddressMux_Enable) 。
// 1. 配置时序参数 (根据存储器手册)
FMC_NORSRAM_TimingTypeDef Timing = {0};
Timing.AddressSetupTime = 2; // ADDSET: 地址建立时间 (HCLK周期)
Timing.AddressHoldTime = 0; // ADDHLD: 通常为0
Timing.DataSetupTime = 4; // DATAST: 数据建立时间 (HCLK周期)
Timing.BusTurnAroundDuration = 0; // BUSTURN: 总线周转时间,通常为0
Timing.CLKDivision = 0; // CLKDIV: 分频,异步模式忽略
Timing.DataLatency = 0; // 数据延迟,异步模式忽略
Timing.AccessMode = FMC_ACCESS_MODE_A; // 模式A (常用)
// 2. 配置主控制块 (关键: 使能复用!)
FMC_NORSRAM_InitTypeDef Init = {0};
Init.NSBank = FMC_NORSRAM_BANK1; // 使用的Bank号 (如 NE1 -> BANK1)
Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_ENABLE; // 关键!启用地址/数据复用
Init.MemoryType = FMC_MEMORY_TYPE_SRAM; // 或 FMC_MEMORY_TYPE_PSRAM/NOR
Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16; // 通常16位宽
Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE; // 异步模式禁用突发
Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE; // 通常用同一个时序
Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
Init.PageSize = FMC_PAGE_SIZE_NONE; // 用于NAND,NOR/SRAM设为NONE
Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ASYNC; // 异步模式可配置
Init.WriteFifo = FMC_WRITE_FIFO_ENABLE; // H7 特有,通常启用
// 3. 调用初始化函数,传入时序和初始化结构体
HAL_FMC_NORSRAM_Init(&Init, &Timing, &Timing); // 如果 ExtendedMode 禁用,第二个时序参数无效
5. 存储器地址映射
FSMC/FMC 将外部存储器映射到 STM32 的地址空间。访问时直接读写对应的指针即可。
- 基地址计算:
0x60000000 + 0x04000000 * Bank(NOR/PSRAM Bank 起始地址)BANK1 (NE1):0x60000000BANK2 (NE2):0x64000000BANK3 (NE3):0x68000000BANK4 (NE4):0x6C000000
-
示例访问:
#define NOR_BASE_ADDR ((uint16_t*)0x60000000) // 假设16位数据宽度,基地址 // 向地址 0x0000 写入数据 0xABCD *(volatile uint16_t*)(NOR_BASE_ADDR + 0x0000) = 0xABCD; // 从地址 0x0002 读取数据 uint16_t data = *(volatile uint16_t*)(NOR_BASE_ADDR + 0x0002);重要: STM32 的地址线
FSMC_A[x:0]对应访问时指针偏移量的低x+1位。在复用模式下:- 地址阶段:
FSMC_D[15:0]输出低 16 位地址 (ADDR[15:0])。 - 数据阶段:
FSMC_D[15:0]传输数据 (DATA[15:0])。
- 地址阶段:
关键注意事项
-
复用功能号 (
Alternate):- 务必查阅所用 STM32 型号的 数据手册 (Datasheet) 和 参考手册 (Reference Manual),确认 FSMC/FMC 引脚对应的正确复用功能号 (
GPIO_AF12_FMC最常见)。
- 务必查阅所用 STM32 型号的 数据手册 (Datasheet) 和 参考手册 (Reference Manual),确认 FSMC/FMC 引脚对应的正确复用功能号 (
-
Bank 选择:
- 确保
Init.NSBank与硬件连接的片选信号NE[1:4](FMC_NEx) 对应正确。每个 Bank 有独立的空间。
- 确保
-
时序参数:
AddressSetupTime(ADDSET),DataSetupTime(DATAST) 必须根据外部存储器的AC特性参数(访问时间、建立/保持时间)和 STM32 HCLK 频率仔细计算。太短会导致访问失败,太长会降低性能。参考手册有公式。
-
数据宽度:
Init.MemoryDataWidth必须与硬件连接一致 (8位/16位)。影响地址对齐和访问方式。
-
复用模式 (
DataAddressMux):- 核心配置项! 必须设置为
FMC_DATA_ADDRESS_MUX_ENABLE才能使能复用功能。
- 核心配置项! 必须设置为
-
地址偏移:
- 当通过指针访问时,指针的增加量对应的是 字节地址偏移。因为 FSMC/FMC 控制器会自动处理地址总线的输出。例如:
*(NOR_BASE + 0)->FSMC_A[0] = 0(地址最低位)*(NOR_BASE + 1)->FSMC_A[0] = 1*(NOR_BASE + 2)->FSMC_A[1] = 1
- 当通过指针访问时,指针的增加量对应的是 字节地址偏移。因为 FSMC/FMC 控制器会自动处理地址总线的输出。例如:
-
字节访问 (8位模式):
- 如果配置为 8 位数据宽度 (
FMC_NORSRAM_MEM_BUS_WIDTH_8),使用uint8_t*类型的指针,并注意FSMC_NBL0(低字节) 和FSMC_NBL1(高字节) 信号的行为。
- 如果配置为 8 位数据宽度 (
-
调试:
- 使用逻辑分析仪或示波器观察
NE,NOE,NWE,D[15:0],A[x:0]等关键信号,验证时序和复用切换是否符合预期。 - 检查 GPIO 配置、时钟、复用功能是否正确。
- 确认外部存储器的供电、复位和初始化序列(如果有)。
- 使用逻辑分析仪或示波器观察
总结: 使用 STM32 FSMC/FMC 的复用模式需要:1) 正确硬件连接;2) 配置 GPIO 为复用推挽输出;3) 使能控制器和 GPIO 时钟;4) 初始化 FMC 时显式启用 DataAddressMux 并设置其他参数;5) 根据映射地址访问。务必查阅对应型号的官方文档获取精确的引脚分配和寄存器细节。
复用FSMC能驱动并行Norflash吗?
STM32(100脚)的复用FSMC能否驱动并行Norflash?是否还需要连接 NADV 信号线进行地址锁存?
QIANRUSHIZHANG
2020-04-10 04:35:20
FPGA与STM32通过FSMC总线通信的实验
FSMC总线通信简介 FSMC是STM32系列采用的一种新型存储器扩展技术。在外部存储器扩展方面具有独特的优势,可根据系统的应用需要,方便进行不 同类型大容量静态存储器的扩展。 FSMC的特点
2024-11-12 17:20:17
STM32的FSMC外设简介
Flexible static memory controller(FSMC)灵活的静态存储控制器。FSMC可以连接异步或同步存储器或16位PC存储卡
2023-07-11 16:07:48
浅析STM32 FSMC操作LCD的过程
FSMC称为灵活的静态存储器,它能够与同步或异步存储器和16位PC存储器卡连接,STM32F4的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存储器。
2023-07-22 14:46:53
为什么可以利用FSMC来使用外部RAM
为什么可以利用FSMC来使用外部RAM呢,首先了解一下STM32里的FSMC。大容量且引脚数在100脚以上的STM32F103芯片都带有FSMC接口。FSMC是灵活的静态存储控制器,能够与同步或异步
2022-04-28 16:22:43
FSMC方案建议
、STM32(100脚)+NorFlash,用复用的FSMC控制TFT屏,速度快,比较理想。但复用的FSMC不用NADV信号线好像驱动不NorFlash,那能否驱动NandFlash?不想用(144)的STM32,成本高了。还有什么比较好的方案及建议,谢谢斑竹指教
linlin10
2020-04-13 02:54:56
STM32的FSMC详解
FSMC详解1、FSMC简介:FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和 16 位 PC 存储器卡连接,STM32 的 FSMC 接口支持包括 SRAM、NAND FLASH、NOR
h1654155143.8331
2021-12-06 06:25:11
STM32如何通过FSMC点亮LCD
FSMC是Flexible static memory controller(可变静态存储控制器)的简称,是STM32系列采用的一种新型的存储器扩展技术,支持SRAM、Nor Flash、LCD、PSRAM、NAND Flash、PC Card等。只在某些芯片上有,使用前要查看对应的手册确定。
2023-03-23 10:02:33
关于fsmc是硬件还是软件
fsmc是硬件还是软件,我查了百度说是硬件。我理解他是集成在STM32里面的,比如我们需要用它去操作SRAM或者LCD时,是不是直接和单片机引脚相连,然后复用那个引脚为FSMC功能,去操作SRAM或LCD。其实他还是直接和单片机引脚相连的,和用普通io口去操作接线上有什么区别呢?
huhu12
2020-05-07 09:15:05
微控制器的FSMC到底是咋回事?(下)
摘要:上一篇文章我们具体讲解了FSMC的原理配置,这一章主要是关于使用FSMC的SRAM初始化流程,以及使用STM32CubeMX对FSMC进行配置。
2023-05-14 10:27:39
STM32 FSMC的时序配置有问题吗
虽然是读取ID的命令,但是读出来的ID全都是0。这会不会是STM32 FSMC的时序配置问题?或者STM32的FSMC根本就不支持这款液晶的读操作?到底是STM32的时序问题,还是芯片的器件ID本来
马汉三呐
2021-07-30 07:00:39
什么是FSMC?FSMC的作用
一、FSMC模块1、什么是FSMCFSMC(Flexible Static Memory Controller):灵活的静态存储控制器,能够与同步或异步存储器和16位PC存储器卡连接,STM32
hisysteeoke
2021-07-28 06:13:21
什么是FSMC?FSMC如何操控LCD
3.7.5.外部中断程序的移植和调试13.7.6.外部中断程序的移植和调试23.7.7.外部中断程序的移植和调试33.7.8.什么是FSMC3.7.9.FSMC如何操控LCD3.7.10.FSMC控制LCD的细节第二部分、随堂记录3.7.1.STM32的NVIC和
靓仔峰
2022-02-17 06:29:36
STM32与FPGA通过fsmc通信的实现方法
前言本文介绍STM32与FPGA通过fsmc通信的实现方法。一、fsmc介绍FSMC(Flexible Static Memory Controller,可变静态存储控制器)是STM32系列采用
他在笑
2022-01-18 06:32:19
STM32F1系列MCU硬件电路FSMC接口设计
FSMC是STM32F1提供的一个静态存储控制器,是MCU用来扩展存储器,可用来驱动SRAM、Nor Flash、NAND Flash。这里先简单讲解下这三种存储器的应用场合。
2023-09-27 14:33:49
存储控制器FSMC与触摸屏介绍
FSMC(Flexible Static Memory Controller,灵活的静态存储控制器)是STM32系列采用的一种新型的存储器扩展技术,使用FSMC外设来管理扩展的存储器。
2023-07-27 17:23:24
STM32的FSMC是如何驱动8080总线的液晶的?
STM32de FSMC是如何驱动8080总线的液晶的?看了半天数据手册也不知道如何接线了,液晶有16位的数据总线,而FSMC的有20多位。
tinlyxian
2023-09-26 07:38:34
为什么要使用FSMC
在学习正点原子关于TFT-LCD的章节时,介绍了使用FSMC功能控制LCD,所以对FSMC进行了解,为什么要使用FSMC,利用FSMC有什么好处等等。FSMC(Flexible Static
laisheng
2021-08-18 07:32:59
STM32的FSMC和FMC有什么区别?
STM32的FSMC和FMC有什么区别呢? 有的系列,比如F103是FSMC,有的系列,M4就是FMC了。这两者有什么区别呢?
xymbmcu
2023-09-26 06:17:01
什么是FSMC
本篇详细的记录了如何使用STM32CubeMX配置 STM32f407ZGT6 的硬件FSMC外设驱动TFT-LCD屏幕。1. 准备工作硬件准备开发板首先需要准备一个开发板,这里我准备
qi12345
2021-08-11 06:11:08
为什么stm32的固件库里没有fsmc
帮助会员495392996发一个提问,大家帮帮他,谢谢!为什么stm32的固件库里没有fsmc?这是遗漏吗?看到库函数都是一头雾水。怎么玩
www032
2020-06-02 16:37:15
STM32的FSMC地址线有何对应关系
STM32的FSMC地址线对应关系通俗易懂解读和和驱动TFT-LCD的原理当 Bank接的是 8 位宽度存储器的时候:HADDR[25:0]对应FSMC_A[25:0]当 Bank接的是 16 位
英雄孤寂
2022-03-01 06:30:52
一文详解STM32端口复用及映射
STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。
2020-09-23 11:02:11
FSMC的相关资料推荐
STM32F407 FSMC驱动NAND FLASH MX30LF2GE8AB简介:FSMC全称灵活的静态存储控制器,FSMC 能够连接同步、异步存储器和 16 位 PC 存储卡。FSMC 具有以下
DH9527
2022-01-26 08:18:46
灵动微课堂 (第189讲) | 使用MM32F3270 FSMC驱动SRAM
的FMSC外部接口信号,可使用异步方式访问SRAM,可以选用复用或非复用方式扩展SRAM,还可以通过配置实现外扩8位总线或16位总线接口的SRAM。表1 FSMC控制器外部信号MM32F3270系列MCU因为
MMCU5721167
2021-11-10 09:22:31
STM32的固件库说明里没有FSMC怎么回事
我看了下stm32的固件库说明。但里面没有fsmc这节。主要是用到库函数时不懂怎么配置它。虽然fsmc.h里有注释,但是本人是英文文盲看不懂。
AHTLTC
2020-06-02 05:55:04