登录/注册

STM32F4怎么控制SRAM

STM32F4怎么控制SRAM

更多

STM32F4 系列通过其内置的 FMC(Flexible Memory Controller) 模块控制外部 SRAM。以下是详细步骤和代码示例(基于 HAL 库):


关键步骤

  1. 硬件连接

    • 将 SRAM 的地址线(A0-Ax)、数据线(D0-D15/D31)、控制线(/CE 片选、/OE 读使能、/WE 写使能)连接到 STM32F4 的 FMC 引脚。
    • 根据 SRAM 型号支持的数据宽度(8/16/32 位),配置 FMC 的数据总线。
  2. FMC 存储区域选择
    STM32F4 的 FMC 将外部存储器映射到 4 个存储块(Bank):

    • SRAM 通常使用 Bank1(NOR/SRAM 1)
    • 起始地址:0x6000 0000
  3. 时序配置
    根据 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); // 写入一个字
}

关键注意事项

  1. 时序配置

    • 严格参考 SRAM 数据手册的 读/写时序图 设置 AddressSetupTime/DataSetupTime
    • 高速 SRAM 可能需要更短的建立时间。
  2. 数据宽度匹配

    • 若 SRAM 是 8 位:设为 FMC_NORSRAM_MEM_BUS_WIDTH_8,使用 HAL_SRAM_Write_8b()
    • 若 SRAM 是 32 位:设为 FMC_NORSRAM_MEM_BUS_WIDTH_32,使用 HAL_SRAM_Write_32b()
  3. 地址对齐

    • 写入地址必须按数据宽度对齐(如 16 位访问时地址需为偶数)。
  4. 硬件设计

    • 确保 PCB 布线等长,减少信号延迟差异。
    • 在 FMC 时钟较高时(>50MHz),建议使用阻抗匹配电阻。

调试技巧

  1. 使用逻辑分析仪检查 FMC 控制信号是否合规。
  2. 先以低速配置测试(如 DataSetupTime=10),再逐步优化。
  3. 检查 HAL_SRAM_Init() 返回值确保初始化成功。

通过以上步骤,即可可靠控制外部 SRAM,扩展 STM32F4 的内存空间。

STM32项目实战:基于STM32F4的智能灯光控制系统(LVGL),附项目教程/源码

《智能灯光控制系统_STM32F4》项目完整文档、项目源码,私信小雯老师免费领取。STM32项目实战之“智能灯光

2024-10-17 16:16:30

STM32F4时钟配置的操作步骤

本文将介绍STM32F4时钟配置的操作步骤、并对比时钟配置前后LED外设闪烁的快慢以及对应代码的讲解。

2023-04-21 11:29:44

浅谈STM32F4的时钟系统

  本文将介绍STM32F4的时钟系统。

2023-04-20 11:47:40

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系统的robovup控制电路板

内置STM32F4系统的robovup控制电路板

资料下载 ah此生不换 2021-04-28 10:49:25

stm32f4舵机控制代码

stm32f4舵机控制代码资料免费下载。

资料下载 姚小熊27 2021-04-26 09:33:24

基于STM32F4的红外控制的原理是什么

基于STM32F4的红外控制红外控制原理红外控制原理

2022-01-12 07:46:26

如何利用stm32F4控制舵机?

如何利用stm32F4控制舵机?

2021-11-17 06:19:24

为什么STM32F4开发板要搭载SRAM芯片

,所以STM32F4开发板板载了一颗1M字节容量的SRAM芯片,XM8A51216,满足大内存使用的需求。英尚微将使用STM32F4来驱动XM8

2021-07-28 08:40:12

基于Cortex-M4STM32F4的复位序列

7是基于Cortex-M7内核,而Cortex-M7和Cortex-M3/M4的复位序列有些不一样。本文中,将针对这个问题做详细讲解。 STM32F4的复位序列

2021-02-16 06:14:00

STM32F4驱动外部SRAM芯片XM8A51216介绍

STM32F4驱动外部SRAM芯片XM8A51216

2021-01-08 07:29:25

STM32F4开发板STM32F4如何驱动外部SRAM芯片

国产存储芯片的底层技术攻关和相关科研工作,从而推动国家存储芯片设计前端产业变革和更进一步的发展。接下来星忆代理商英尚微电子介绍STM32F4开发板STM32F4如何驱动外部

2020-07-01 15:07:09

基于STM32F4和RT-Thread通用BootLoader使用经验

基于STM32F4、RT-Thread通用BootLoader使用经验

2020-02-27 17:23:06

7天热门专题 换一换
相关标签