STM32单片机芯片与内部102 FMC 总线 SDRAM 配置

目录

一、SDRAM硬件设计

二、SRAM驱动设计

1、tRCD( TRCD):

2、CL( CAS Latency):

3、tWR( TWR):

4、tRP( TRP):

三、SRAM相关配置

1、FMC 时钟源选择

2、时延配置

3、SDRAM配置

四、 用户侧


一、SDRAM硬件设计

通过这个硬件设计我们要了解到以下几点知识:

  • STM32F429 采用的 32 位 FMC 接口驱动镁光的 SDRAM,型号 MT48LC4M32B2,最高支持 143MHz的时钟, 容量 16MB。
  • 标准的 SDRAM 一般都是 4 个 BANK,这个芯片也不例外,芯片的总容量:1Mbit x 32bit x 4bank = 128Mbit 。每个 BANK 由 4096rows x 256columns x 32bits 组成。这个比较重要,配置的时候要用到,也就是 12 行 8 列。
  • 片选采用的 SDNE0, 那么 SDRAM 的首地址是 0xC000 000, 控制 16MB 的空间。
  • 用到引脚所代表的含义:

二、SRAM驱动设计

1、tRCD( TRCD):

在发送列读写命令时必须要与行有效命令有一个间隔,这个间隔被定义为 tRCD,即 RAS to CAS Delay( RAS 至 CAS 延迟),大家也可以理解为行选通周期,这应该是根据芯片存储阵列电子元件响应时间(从一种状态到另一种状态变化的过程)所制定的延迟。 tRCD 是 SDRAM 的一个重要时序参数,广义的 tRCD 以时钟周期数为单位,比如 tRCD=2,就代表延迟周期为两个时钟周期。 具体到确切的时间,则要根据时钟频率而定,对于 STM32F429 驱动 SDRAM,采用的 168MHz, 实际使用要做 2 分频,即 84MHz, 那么我们设置 tRCD=2, 就代表 23.8ns 的延迟。

2、CL( CAS Latency):

        在选定列地址后,就已经确定了具体的存储单元,剩下的事情就是数据通过数据 I/O 通道( DQ)输出到内存总线上了。但是在 CAS 发出之后,仍要经过一定的时间才能有数据输出,从 CAS 与读取命令发出到第一笔数据输出的这段时间,被定义为 CL( CAS Latency, CAS 潜伏期)。由于 CL 只在读取时出现,所以 CL 又被称为读取潜伏期( RL, Read Latency)。 CL 的单位与 tRCD 一样,为时钟周期数,具体耗时由时钟频率决定。数据写入的操作也是在 tRCD 之后进行,但此时没有了 CL(记住, CL 只出现在读取操作中)。

3、tWR( TWR):

        数据并不是即时地写入存储电容,因为选通三极管(就如读取时一样)与电容的充电必须要有一段时间,所以数据的真正写入需要一定的周期。为了保证数据的可靠写入,都会留出足够的写入/校正时间( tWR, WriteRecovery Time),这个操作也被称作写回( Write Back)。

4、tRP( TRP):

        在发出预充电命令之后,要经过一段时间才能允许发送 RAS 行有效命令打开新的工作行,这个间隔被称为 tRP( Precharge command Period,预充电有效周期)。和 tRCD、 CL 一样, tRP 的单位也是时钟周期数,具体值视时钟频率而定。

三、SRAM相关配置

1、FMC 时钟源选择

        STM32F429 的 FMC 是采用的 HCLK 时钟, 位于 AHB 总线上。比如主频设置的是 168MHz,那么FMC 时钟也是 168MHz。FMC 驱动 SDRAM 的话,必须对 FMC 的时钟做 2 分频或者 3 分频, 而且仅支持这两种分频方式,也就是说, SDRAM 时钟可以选择 168MHz/2 = 84MHz 或者 168MHz/3 = 56MHz。

2、时延配置

	SDRAM_Timing.LoadToActiveDelay    = 2; /* 2x11.9ns, TMRD定义加载模式寄存器的命令与激活命令或刷新命令之间的延迟 */
	SDRAM_Timing.ExitSelfRefreshDelay = 7; /* 7x11.9ns, TXSR定义从发出自刷新命令到发出激活命令之间的延迟 */
	SDRAM_Timing.SelfRefreshTime      = 4; /* 5x11.9ns, TRAS定义最短的自刷新周期 */
	SDRAM_Timing.RowCycleDelay        = 7; /* 7x11.9ns, TRC定义刷新命令和激活命令之间的延迟 */
	SDRAM_Timing.WriteRecoveryTime    = 2; /* 2x11.9ns, TWR定义在写命令和预充电命令之间的延迟 */
	SDRAM_Timing.RPDelay              = 2; /* 2x11.9ns, TRP定义预充电命令与其它命令之间的延迟 */
	SDRAM_Timing.RCDDelay             = 2; /* 2x11.9ns, TRCD定义激活命令与读/写命令之间的延迟 */

3、SDRAM配置

	hsdram.Init.SDBank             = FMC_SDRAM_BANK1;               /* 硬件设计上用的BANK1 */
	hsdram.Init.ColumnBitsNumber   = FMC_SDRAM_COLUMN_BITS_NUM_8;   /* 8列 */
	hsdram.Init.RowBitsNumber      = FMC_SDRAM_ROW_BITS_NUM_12;     /* 12行 */
	hsdram.Init.MemoryDataWidth    = FMC_SDRAM_MEM_BUS_WIDTH_32;	/* 32位带宽 */
	hsdram.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;  /* SDRAM有4个BANK */
	hsdram.Init.CASLatency         = FMC_SDRAM_CAS_LATENCY_3;       /* CAS Latency可以设置Latency1,2和3,实际测试Latency3稳定 */
	hsdram.Init.WriteProtection    = FMC_SDRAM_WRITE_PROTECTION_DISABLE; /* 禁止写保护 */
	hsdram.Init.SDClockPeriod      = SDCLOCK_PERIOD;                /* FMC时钟168MHz,2分频后给SDRAM,即84MHz */
	hsdram.Init.ReadBurst          = FMC_SDRAM_RBURST_ENABLE;       /* 使能读突发 */
	hsdram.Init.ReadPipeDelay      = FMC_SDRAM_RPIPE_DELAY_1;       /* 此位定CAS延时后延后多少个SDRAM时钟周期读取数据,实际测此位可以设置无需延迟 */

四、 用户侧

        进行到这一步,已经可以像使用内部 SRAM 一样使用 SDRAM 了。 除了本章节配套例子采用指针方式操作 SDRAM, 也可以采用下面帖子中的超方便使用方式和动态内存分配方式。

#define EXT_SDRAM_ADDR  	((uint32_t)0xC0000000)
#define EXT_SDRAM_SIZE		(16 * 1024 * 1024)

/* LCD显存,第1页, 分配2M字节 */
#define SDRAM_LCD_BUF1 		EXT_SDRAM_ADDR

/* LCD显存,第2页, 分配2M字节 */
#define SDRAM_LCD_BUF2		(EXT_SDRAM_ADDR + SDRAM_LCD_SIZE)

#define SDRAM_LCD_SIZE		(2 * 1024 * 1024)		/* 每层2M */
#define SDRAM_LCD_LAYER		2						/* 2层 */

/* 剩下的12M字节,提供给应用程序使用 */
#define SDRAM_APP_BUF		(EXT_SDRAM_ADDR + SDRAM_LCD_SIZE * SDRAM_LCD_LAYER)
#define SDRAM_APP_SIZE		(EXT_SDRAM_SIZE - SDRAM_LCD_SIZE * SDRAM_LCD_LAYER)
### STM32 SDRAM 配置、初始化及使用教程 #### 一、SDRAM基本概念工作原理 同步动态随机存取存储器(Synchronous Dynamic Random Access Memory),简称SDRAM,是一种高速度的动态随机存取内存(DRAM)[^2]。其特点是数据传输速率高,在特定条件下可以提供比传统DRAM更高的性能。 对于STM32系列微控制器而言,当内部SRAM不足以满足应用需求时,可以通过外部扩展的方式连接SDRAM来增加系统的可用内存空间。这尤其适用于图形界面处理等场景下需要大量缓存的情况[^1]。 #### 二、硬件准备引脚配置 在实际操作前需确认所使用的具体型号及其对应的SDRAM规格参数。例如,在某些案例中采用的是STM32H750XBH6搭配W9812G6KH-6I型SDRAM芯片;而在另一些实例里,则可能是基于STM32H743并选用MT48LC16M16A2P-6A作为外扩存储器件[^4]。 为了使能FMC接口并选定类型的SDRAM建立通信链路,必须按照官方文档指导完成相应的GPIO端口映射设置。这部分涉及到多个管脚的功能定义,务必严格按照手册说明执行以确保正确无误地建立起物理层面上的数据通路[^5]。 #### 三、软件层面的初始化过程 借助于STM32CubeMX工具自动生成的基础代码框架能够极大简化开发难度。通过该IDE环境内的向导功能可快速设定好必要的寄存器值,并生成用于启动阶段调用的一系列API函数原型声明[^3]。 具体的初始化逻辑通常遵循如下模式: ```c // FMC控制器全局变量声明 extern FMC_SDRAM_TimingTypeDef Timing; HAL_StatusTypeDef ret; ret = HAL_OK; /* Step 1: Deinitialize the FMC Bank */ if (HAL_DeInit(&hsdram1) != HAL_OK){ Error_Handler(); } /* Step 2: Configure and enable the FMC bank associated to SDRAM device */ Timing.LoadToActiveDelay = __ Loft_To_Active_Delay__; Timing.ExitSelfRefreshDelay = __ Exit_Self_Refresh_Delay__; ... // 更多定时参数赋值省略... if(HAL_SDRAM_Init(&hsdram1,&SdramTiming)!= HAL_OK){ Error_Handler(); } ``` 上述伪码片段展示了如何利用`HAL_DeInit()`先释放现有资源再重新加载新的配置项,接着通过传递给`HAL_SDRAM_Init()`函数指针形式传入预设的时间特性结构体完成最终激活步骤。 值得注意的是,在此期间还需适时发出一系列控制指令(如刷新命令)以便让目标设备进入正常运作状态。这些细节往往被封装进了库文件内部无需开发者额外关注。 #### 四、读写访问机制概述 一旦成功完成了前述准备工作之后就可以像对待片内静态RAM那样自由地对这块新增加出来的区域实施任意形式的操作了——无论是简单的单字节交换还是连续区块搬运均不在话下。当然出于效率考虑建议尽可能批量提交请求而非频繁切换地址边界从而减少不必要的等待开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌夏微秋

希望各位多多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值