STM32F4怎么控制SRAM
STM32F4怎么控制SRAM
STM32F4 系列通过其内置的 FMC(Flexible Memory Controller) 模块控制外部 SRAM。以下是详细步骤和代码示例(基于 HAL 库):
关键步骤
-
硬件连接
- 将 SRAM 的地址线(A0-Ax)、数据线(D0-D15/D31)、控制线(
/CE片选、/OE读使能、/WE写使能)连接到 STM32F4 的 FMC 引脚。 - 根据 SRAM 型号支持的数据宽度(8/16/32 位),配置 FMC 的数据总线。
- 将 SRAM 的地址线(A0-Ax)、数据线(D0-D15/D31)、控制线(
-
FMC 存储区域选择
STM32F4 的 FMC 将外部存储器映射到 4 个存储块(Bank):- SRAM 通常使用 Bank1(NOR/SRAM 1)
- 起始地址:
0x6000 0000
-
时序配置
根据 SRAM 数据手册设置时序参数(单位:HCLK 周期):AddressSetupTime:地址建立时间DataSetupTime:数据建立时间BusTurnAroundDuration:总线周转时间(可选)
代码实现(HAL 库)
1. 初始化 FMC 和 GPIO
#include "stm32f4xx_hal.h"
SRAM_HandleTypeDef hsram;
FMC_NORSRAM_TimingTypeDef Timing = {0};
void SRAM_Init(void) {
// 使能 FMC 时钟
__HAL_RCC_FMC_CLK_ENABLE();
// 配置 FMC 引脚(以 Bank1 为例)
GPIO_InitTypeDef GPIO_Init = {0};
GPIO_Init.Pin = GPIO_PIN_0 | GPIO_PIN_1 | ...; // 具体引脚参考数据手册
GPIO_Init.Mode = GPIO_MODE_AF_PP;
GPIO_Init.Pull = GPIO_NOPULL;
GPIO_Init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_Init.Alternate = GPIO_AF12_FMC; // FMC 复用功能
HAL_GPIO_Init(GPIOD, &GPIO_Init); // 通常使用 GPIOD, PE, PF, PG
// 配置时序(示例值,需按 SRAM 手册调整)
Timing.AddressSetupTime = 2; // 地址建立时间
Timing.AddressHoldTime = 1; // 地址保持时间
Timing.DataSetupTime = 2; // 数据建立时间
Timing.BusTurnAroundDuration = 1; // 总线周转
Timing.CLKDivision = 2;
Timing.DataLatency = 2;
// 配置 FMC SRAM
hsram.Instance = FMC_NORSRAM_DEVICE;
hsram.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
hsram.Init.NSBank = FMC_NORSRAM_BANK1; // 使用 Bank1
hsram.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
hsram.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
hsram.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16; // 16位总线
hsram.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
hsram.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
hsram.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
hsram.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
hsram.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
hsram.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE; // 标准模式
hsram.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
hsram.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
// 初始化 FMC SRAM
HAL_SRAM_Init(&hsram, &Timing, NULL);
}
2. 读写数据示例
#define SRAM_BASE_ADDR 0x60000000 // Bank1 起始地址
// 写入数据到 SRAM
void SRAM_WriteBuffer(uint16_t *pBuffer, uint32_t WriteAddr, uint32_t NumHalfwords) {
HAL_SRAM_Write_16b(&hsram, (uint32_t *)(SRAM_BASE_ADDR + WriteAddr), pBuffer, NumHalfwords);
}
// 从 SRAM 读取数据
void SRAM_ReadBuffer(uint16_t *pBuffer, uint32_t ReadAddr, uint32_t NumHalfwords) {
HAL_SRAM_Read_16b(&hsram, (uint32_t *)(SRAM_BASE_ADDR + ReadAddr), pBuffer, NumHalfwords);
}
// 示例:在地址 0x0000 写入数据
int main(void) {
uint16_t data = 0x1234;
SRAM_Init();
SRAM_WriteBuffer(&data, 0x0000, 1); // 写入一个字
}
关键注意事项
-
时序配置
- 严格参考 SRAM 数据手册的 读/写时序图 设置
AddressSetupTime/DataSetupTime。 - 高速 SRAM 可能需要更短的建立时间。
- 严格参考 SRAM 数据手册的 读/写时序图 设置
-
数据宽度匹配
- 若 SRAM 是 8 位:设为
FMC_NORSRAM_MEM_BUS_WIDTH_8,使用HAL_SRAM_Write_8b()。 - 若 SRAM 是 32 位:设为
FMC_NORSRAM_MEM_BUS_WIDTH_32,使用HAL_SRAM_Write_32b()。
- 若 SRAM 是 8 位:设为
-
地址对齐
- 写入地址必须按数据宽度对齐(如 16 位访问时地址需为偶数)。
-
硬件设计
- 确保 PCB 布线等长,减少信号延迟差异。
- 在 FMC 时钟较高时(>50MHz),建议使用阻抗匹配电阻。
调试技巧
- 使用逻辑分析仪检查 FMC 控制信号是否合规。
- 先以低速配置测试(如
DataSetupTime=10),再逐步优化。 - 检查
HAL_SRAM_Init()返回值确保初始化成功。
通过以上步骤,即可可靠控制外部 SRAM,扩展 STM32F4 的内存空间。
STM32项目实战:基于STM32F4的智能灯光控制系统(LVGL),附项目教程/源码
《智能灯光控制系统_STM32F4》项目完整文档、项目源码,私信小雯老师免费领取。STM32项目实战之“智能灯光
2024-10-17 16:16:30
STM32F4 DAC数模转换实验例程
STM32F4 DAC数模转换实验例程(现代电源技术试卷西建大)-STM32F4 DAC数模转换实验例程,有需要的可以参考!
资料下载
佚名
2021-09-16 10:18:15
STM32F4 PWM-DAC实验例程
STM32F4 PWM-DAC实验例程(电源技术是sci吗)-STM32F4 PWM-DAC实验例程,有需要的可以参考!
资料下载
佚名
2021-09-16 10:14:07
STM32F4内部Flash实验例程
STM32F4内部Flash实验例程(嵌入式开发版哪个好)-STM32F4内部Flash实验例程,有需要的可以参考!
资料下载
无人岛
2021-07-30 15:58:01
为什么STM32F4开发板要搭载SRAM芯片
,所以STM32F4开发板板载了一颗1M字节容量的SRAM芯片,XM8A51216,满足大内存使用的需求。英尚微将使用STM32F4来驱动XM8
基于Cortex-M4的STM32F4的复位序列
7是基于Cortex-M7内核,而Cortex-M7和Cortex-M3/M4的复位序列有些不一样。本文中,将针对这个问题做详细讲解。 STM32F4的复位序列
2021-02-16 06:14:00
STM32F4开发板STM32F4如何驱动外部SRAM芯片
国产存储芯片的底层技术攻关和相关科研工作,从而推动国家存储芯片设计前端产业变革和更进一步的发展。接下来星忆代理商英尚微电子介绍STM32F4开发板STM32F4如何驱动外部
2020-07-01 15:07:09
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- amoled屏幕和oled区别
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览