STM32-FSMC对外接SRAM的读写操作详解

一、FSMC与SRAM基础概念

1.1 FSMC简介

FSMC(Flexible Static Memory Controller)是STM32系列芯片中用于管理扩展存储器的外设,它可以驱动包括SRAM、NOR FLASH以及NAND FLASH类型的静态存储器。FSMC的主要优势在于将外部存储器映射到STM32的内部寻址空间,使得访问外部存储器就像访问片上外设寄存器一样简单。

1.2 SRAM基本结构

SRAM(静态随机存取存储器)的内部结构主要包括三个核心部分:

组成部分 功能描述
存储矩阵 数据存储的物理阵列,可理解为行列寻址的表格结构
地址数据接口 包含地址线和数据线,用于传输地址信息和数据
控制电路 包含片选、读写使能等控制信号线

二、FSMC控制SRAM的信号线系统

2.1 核心信号线分类

// FSMC与SRAM连接的主要信号线示例
typedef struct {
    // 地址总线(FSMC_A[25:0])
    uint32_t address_lines;
    
    // 数据总线(FSMC_D[15:0])
    uint16_t data_lines;
    
    // 控制信号线
    GPIO_PinState chip_select;      // FSMC_NE[4:1] - 片选信号
    GPIO_PinState read_enable;      // FSMC_NOE - 读使能
    GPIO_PinState write_enable;     // FSMC_NWE - 写使能
    GPIO_PinState byte_enable_high; // FSMC_NBL[1] - 高字节使能
    GPIO_PinState byte_enable_low;  // FSMC_NBL[0] - 低字节使能
} FSMC_SRAM_Signals;

2.2 关键控制信号详解

片选信号(FSMC_NE[4:1])

  • STM32具有FSMC_NE1/2/3/4号引脚,不同的引脚对应STM32内部不同的地址区域
  • 当访问特定地址范围时,对应的FSMC_NE信号会自动激活
  • 例如访问0x68000000-0x6BFFFFFF地址空间时,FSMC_NE3信号线会输出控制信号

读写使能信号

  • FSMC_NOE(输出使能):控制读操作
  • FSMC_NWE(写使能):控制写操作
  • 这两个信号防止读写操作冲突,确保数据完整性

三、FSMC地址映射机制

3.1 存储区域划分

FSMC把整个External RAM存储区域分成了4个Bank区域,NOR及SRAM存储器只能使用Bank1的地址。每个Bank内部又分为4个小块:

存储区域 地址范围 对应FSMC_NE信号
Bank1-小块1 0x60000000-0x63FFFFFF FSMC_NE1
Bank1-小块2 0x64000000-0x67FFFFFF FSMC_NE2
Bank1-小块3 0x68000000-0x6BFFFFFF FSMC_NE3
Bank1-小块4 0x6C000000-0x6FFFFFFF FSMC_NE4

3.2 地址映射优势

#define SRAM_BANK_ADDR ((uint32_t)0x68000000)

// 通过指针直接访问外部SRAM
uint8_t *sram_pointer = (uint8_t *)SRAM_BANK_ADDR;

// 写入数据到SRAM
sram_pointer[0] = 0xAA;    // FSMC自动生成写时序

// 从SRAM读取数据
uint8_t data = sram_pointer[0];  // FSMC自动生成读时序

这种映射方式使得程序访问外部SRAM时,不需要像I2C EEPROM或SPI FLASH那样通过总线发送地址和命令,FSMC外设会自动完成整个数据访问过程。

四、SRAM读写操作时序控制

4.1 读操作时序流程

SRAM的读时序遵循以下严格流程:

  1. 地址建立阶段:主机通过地址信号线发出要访问的存储器目标地址
  2. 片选激活:控制片选信号CE#使能存储器芯片
  3. 读使能触发:控制读使能信号OE#表示要读取数据
  4. 字节掩码控制:使用UB#与LB#信号指示要访问目标地址的高、低字节部分
  5. 数据输出:存储器通过数据线向主机输出目标数据

4.2 写操作时序流程

写操作时序与读操作类似但方向相反:

  1. 地址建立:主机使用地址信号线发出目标地址
  2. 片选使能:控制片选信号CE#使能SRAM芯片
  3. 写使能激活:控制写使能信号WE#表示要写入数据
  4. 数据准备:主机通过数据线向存储器传输目标数据
  5. 字节选择:使用掩码信号LB#与UB#控制写入的字节位置

4.3 关键时序参数

时序参数 读操作 写操作 描述
周期时间 tRC tWC 完整读写周期所需时间
地址建立时间 tAA tSA 地址稳定到数据有效的时间
使能建立时间 tDOE - 读使能到数据输出的时间
写使能脉宽 - tPWE 写使能信号的最小保持时间

五、FSMC寄存器配置

5.1 核心控制寄存器

STM32通过三个主要寄存器组来控制SRAM的访问:

// FSMC Bank1 控制寄存器结构(示例)
typedef struct {
    // FSMC_BCR控制寄存器:配置存储器类型、数据线宽度等
    uint32_t memory_type    : 2;   // 存储器类型设置
    uint32_t data_width     : 2;   // 数据线宽度(8/16位)
    uint32_t write_enable   : 1;   // 写使能
    uint32_t extended_mode  : 1;   // 扩展模式使能
    // ... 其他配置位
} FSMC_BCR_TypeDef;

// FSMC时序寄存器配置示例
void FSMC_SRAM_Init(void) {
    // 配置控制寄存器
    FSMC_Bank1->BTCR[0] = 0x00001011;  // 存储器类型SRAM,数据宽度16位
    
    // 配置读时序寄存器
    FSMC_Bank1->BTCR[1] = 0x000002FF;  // 地址建立时间、数据保持时间等
    
    // 配置写时序寄存器  
    FSMC_Bank1->BTCR[2] = 0x000002FF;  // 写时序参数
}

5.2 时序配置详解

FSMC_BTR时序寄存器:用于配置SRAM访问时的各种时间延迟,如数据保持时间、地址保持时间等

FSMC_BWTR写时序寄存器:与FMC_BTR寄存器控制的参数类似,它专门用于控制写时序的时间参数

六、实际编程示例

6.1 完整SRAM读写代码

#include "main.h"
#include "fsmc.h"

#define SRAM_BANK_ADDR ((uint32_t)0x68000000)

int main(void) {
    // 初始化系统时钟和外设
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_FSMC_Init();
    MX_USART1_UART_Init();
    
    printf("FSMC SRAM测试开始
");
    
    // 定义指向SRAM地址的指针
    uint8_t *sram_ptr = (uint8_t *)SRAM_BANK_ADDR;
    uint8_t i;
    
    // 向SRAM写入数据
    for(i = 1; i <= 10; i++) {
        printf("写入: 地址=%p, 数据=%d
", &sram_ptr[i], i);
        sram_ptr[i] = i;  // FSMC自动处理写时序
    }
    
    // 从SRAM读取数据
    printf("地址=%p, 数据=%d
", &sram_ptr[0], sram_ptr[0]);
    for(i = 1; i <= 10; i++) {
        printf("读取: 地址=%p, 数据=%d
", &sram_ptr[i], sram_ptr[i]);
    }
    
    printf("FSMC SRAM测试结束
");
    
    while(1) {
        // 主循环
    }
}

6.2 信号线状态变化分析

在执行上述代码时,FSMC信号线的实际变化:

写操作时

  1. FSMC_A[25:0]输出目标地址
  2. FSMC_NE3变为低电平(片选激活)
  3. FSMC_NWE变为低电平(写使能)
  4. FSMC_D[15:0]输出要写入的数据
  5. 根据字节位置,FSMC_NBL[1:0]相应位激活

读操作时

  1. FSMC_A[25:0]输出目标地址
  2. FSMC_NE3变为低电平
  3. FSMC_NOE变为低电平(读使能)
  4. FSMC_D[15:0]输入读取的数据
  5. 数据锁存到内部总线

七、应用场景与优势

7.1 典型应用场景

  1. 大容量数据缓存:需要快速存取的大量临时数据
  2. 显示缓冲区:TFT LCD的显存管理
  3. 复杂算法运算:需要大量中间变量的数学运算
  4. 多任务数据交换:不同任务间的数据共享区域

7.2 FSMC控制优势

优势特性 传统方式 FSMC方式
访问速度 较慢,需软件控制时序 硬件自动生成时序,速度快
编程复杂度 高,需手动控制信号 低,指针直接访问
系统性能 CPU占用率高 CPU占用率低
时序精度 受软件延迟影响 硬件精确控制

通过FSMC控制外接SRAM,STM32能够以接近内部存储器的速度访问外部大容量内存,极大地扩展了处理复杂应用的能力,同时保持了编程的简洁性和系统的高效性。这种硬件级别的存储器管理机制是STM32在嵌入式高性能应用中的重要优势之一。


参考来源

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐