0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

复用FSMC STM32

复用FSMC STM32

分享:

在 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_AxFSMC_NExFSMC_NOEFSMC_NWE 等引脚配置为复用推挽输出模式 (GPIO_MODE_AF_PP),并启用高速模式 (GPIO_SPEED_FREQ_HIGHVERY_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_TimingTypeDefFMC_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): 0x60000000
    • BANK2 (NE2): 0x64000000
    • BANK3 (NE3): 0x68000000
    • BANK4 (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])。

关键注意事项

  1. 复用功能号 (Alternate):

    • 务必查阅所用 STM32 型号的 数据手册 (Datasheet)参考手册 (Reference Manual),确认 FSMC/FMC 引脚对应的正确复用功能号 (GPIO_AF12_FMC 最常见)。
  2. Bank 选择:

    • 确保 Init.NSBank 与硬件连接的片选信号 NE[1:4] (FMC_NEx) 对应正确。每个 Bank 有独立的空间。
  3. 时序参数:

    • AddressSetupTime (ADDSET), DataSetupTime (DATAST) 必须根据外部存储器的AC特性参数(访问时间、建立/保持时间)和 STM32 HCLK 频率仔细计算。太短会导致访问失败,太长会降低性能。参考手册有公式。
  4. 数据宽度:

    • Init.MemoryDataWidth 必须与硬件连接一致 (8位/16位)。影响地址对齐和访问方式。
  5. 复用模式 (DataAddressMux):

    • 核心配置项! 必须设置为 FMC_DATA_ADDRESS_MUX_ENABLE 才能使能复用功能。
  6. 地址偏移:

    • 当通过指针访问时,指针的增加量对应的是 字节地址偏移。因为 FSMC/FMC 控制器会自动处理地址总线的输出。例如:
      • *(NOR_BASE + 0) -> FSMC_A[0] = 0 (地址最低位)
      • *(NOR_BASE + 1) -> FSMC_A[0] = 1
      • *(NOR_BASE + 2) -> FSMC_A[1] = 1
  7. 字节访问 (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总线通信简介 FSMCSTM32系列采用的一种新型存储器扩展技术。在外部存储器扩展方面具有独特的优势,可根据系统的应用需要,方便进行不 同类型大容量静态存储器的扩展。 FSMC的特点

2024-11-12 17:20:17

STM32F1_ FSMC读写外部SRAM

STM32F1_FSMC读写外部SRAM

2020-04-08 10:02:32

STM32FSMC外设简介

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

STM32FSMC详解

FSMC详解1、FSMC简介:FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和 16 位 PC 存储器卡连接,STM32FSMC 接口支持包括 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的时序配置问题?或者STM32FSMC根本就不支持这款液晶的读操作?到底是STM32的时序问题,还是芯片的器件ID本来

马汉三呐 2021-07-30 07:00:39

什么是FSMCFSMC的作用

一、FSMC模块1、什么是FSMCFSMC(Flexible Static Memory Controller):灵活的静态存储控制器,能够与同步或异步存储器和16位PC存储器卡连接,STM32

hisysteeoke 2021-07-28 06:13:21

什么是FSMCFSMC如何操控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接口设计

FSMCSTM32F1提供的一个静态存储控制器,是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

STM32FSMC是如何驱动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

STM32FSMC和FMC有什么区别?

STM32FSMC和FMC有什么区别呢? 有的系列,比如F103是FSMC,有的系列,M4就是FMC了。这两者有什么区别呢?

xymbmcu 2023-09-26 06:17:01

求大佬分享STM32:FSMC驱动TFTLCD的代码

求大佬分享STM32:FSMC驱动TFTLCD的代码

lancy 2022-02-21 07:32:14

请问哪个系列的stm32fsmc功能?

要哪个系列的stm32才有fsmc功能

musicalboy 2020-03-31 22:13:37

什么是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

STM32FSMC地址线有何对应关系

STM32FSMC地址线对应关系通俗易懂解读和和驱动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

STM32复用时钟的开启时间

STM32的AFIO时钟真的是在开启引脚复用功能的时候开启吗?其实并不是~

2020-04-04 17:22:00

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

加载更多
相关标签