STM32 FSMC控制SRAM读写信号解析
·
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的读时序遵循以下严格流程:
- 地址建立阶段:主机通过地址信号线发出要访问的存储器目标地址
- 片选激活:控制片选信号CE#使能存储器芯片
- 读使能触发:控制读使能信号OE#表示要读取数据
- 字节掩码控制:使用UB#与LB#信号指示要访问目标地址的高、低字节部分
- 数据输出:存储器通过数据线向主机输出目标数据
4.2 写操作时序流程
写操作时序与读操作类似但方向相反:
- 地址建立:主机使用地址信号线发出目标地址
- 片选使能:控制片选信号CE#使能SRAM芯片
- 写使能激活:控制写使能信号WE#表示要写入数据
- 数据准备:主机通过数据线向存储器传输目标数据
- 字节选择:使用掩码信号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信号线的实际变化:
写操作时:
- FSMC_A[25:0]输出目标地址
- FSMC_NE3变为低电平(片选激活)
- FSMC_NWE变为低电平(写使能)
- FSMC_D[15:0]输出要写入的数据
- 根据字节位置,FSMC_NBL[1:0]相应位激活
读操作时:
- FSMC_A[25:0]输出目标地址
- FSMC_NE3变为低电平
- FSMC_NOE变为低电平(读使能)
- FSMC_D[15:0]输入读取的数据
- 数据锁存到内部总线
七、应用场景与优势
7.1 典型应用场景
- 大容量数据缓存:需要快速存取的大量临时数据
- 显示缓冲区:TFT LCD的显存管理
- 复杂算法运算:需要大量中间变量的数学运算
- 多任务数据交换:不同任务间的数据共享区域
7.2 FSMC控制优势
| 优势特性 | 传统方式 | FSMC方式 |
|---|---|---|
| 访问速度 | 较慢,需软件控制时序 | 硬件自动生成时序,速度快 |
| 编程复杂度 | 高,需手动控制信号 | 低,指针直接访问 |
| 系统性能 | CPU占用率高 | CPU占用率低 |
| 时序精度 | 受软件延迟影响 | 硬件精确控制 |
通过FSMC控制外接SRAM,STM32能够以接近内部存储器的速度访问外部大容量内存,极大地扩展了处理复杂应用的能力,同时保持了编程的简洁性和系统的高效性。这种硬件级别的存储器管理机制是STM32在嵌入式高性能应用中的重要优势之一。
参考来源
更多推荐
所有评论(0)