FMC—扩展外部 SDRAM

本章参考资料:《 STM32F4xx 参考手册 2》、《 STM32F4xx 规格书》、库帮助文档
《 stm32f4xx_dsp_stdperiph_lib_um.chm》。
关于 SDRAM 存储器,请参考前面的“ 常用存储器介绍”章节,实验中 SDRAM 芯片
的具体参数,请参考其规格书《 IS42-45S16400J》 来了解。

SDRAM 控制原理
STM32 控制器芯片内部有一定大小的 SRAM 及 FLASH 作为内存和程序存储空间,但
当程序较大,内存和程序空间不足时,就需要在 STM32 芯片的外部扩展存储器了。
STM32F429 系列芯片扩展内存时可以选择 SRAM 和 SDRAM,由于 SDRAM 的“容量
/价格”比较高,即使用 SDRAM 要比 SRAM 要划算得多。我们以 SDRAM 为例讲解如何
为 STM32 扩展内存。
给 STM32 芯片扩展内存与给 PC 扩展内存的原理是一样的,只是 PC 上一般以内存条
的形式扩展,内存条实质是由多个内存颗粒(即 SDRAM 芯片)组成的通用标准模块,而
STM32 直接与 SDRAM 芯片连接。见图 26-2,这是一种型号为 IS42-45S16400J 的 SDRAM
芯片内部结构框图,以它为模型进行学习。

控制逻辑
SDRAM 内部的“控制逻辑”指挥着整个系统的运行,外部可通过 CS、 WE、 CAS、
RAS 以及地址线来向控制逻辑输入命令,命令经过“命令器译码器”译码,并将控制参数
保存到“模式寄存器中”,控制逻辑依此运行。

地址控制
SDRAM 包含有“ A”以及“ BA”两类地址线, A 类地址线是行(Row)与列(Column)共
用的地址总线, BA 地址线是独立的用于指定 SDRAM 内部存储阵列号(Bank)。在命令模式
下, A 类地址线还用于某些命令输入参数。

SDRAM 内部包含的存储阵列,可以把它理解成一张表格,数据就填在这张表格上。
和表格查找一样,指定一个行地址和列地址,就可以精确地找到目标单元格,这是
SDRAM 芯片寻址的基本原理。这样的每个单元格被称为存储单元,而这样的表则被称为
存储阵列(Bank),目前设计的 SDRAM 芯片基本上内部都包含有 4 个这样的 Bank,寻址时
指定 Bank 号以及行地址,然后再指定列地址即可寻找到目标存储单元。 SDRAM 内部具有
多个 Bank 时的结构见图 26-4。

SDRAM 芯片向外部提供有独立的 BA 类地址线用于 Bank 寻址,而行与列则共用 A 类
地址线。
图 26-2 标号4中表示的就是它内部的存储阵列结构, 通讯时当 RAS 线为低电平, 则
“行地址选通器”被选通,地址线 A[11:0]表示的地址会被输入到“行地址译码及锁存器”
中,作为存储阵列中选定的行地址,同时地址线 BA[1:0]表示的 Bank 也被锁存,选中了要
操作的 Bank 号;接着控制 CAS 线为低电平,“列地址选通器”被选通,地址线 A[11:0]表
示的地址会被锁存到“列地址译码器”中作为列地址,完成寻址过程。

数据输入输出
若是写 SDRAM 内容,寻址完成后, DQ[15:0]线表示的数据经过图 26-2 标号5中的输
入数据寄存器,然后传输到存储器阵列中,数据被保存;数据输出过程相反。
本型号的 SDRAM 存储阵列的“数据宽度”是 16 位(即数据线的数量),在与 SDRAM
进行数据通讯时, 16 位的数据是同步传输的,但实际应用中我们可能会以 8 位、 16 位的宽
度存取数据,也就是说 16 位的数据线并不是所有时候都同时使用的,而且在传输低宽度数
据的时候,我们不希望其它数据线表示的数据被录入。如传输 8 位数据的时候,我们只需
要 DQ[7:0]表示的数据,而 DQ[15:8]数据线表示的数据必须忽略,否则会修改非目标存储
空间的内容。所以数据输入输出时,还会使用 DQM[1:0]线来配合,每根 DQM 线对应 8 位 数据,如“ DQM0(LDQM)”为低电平, “ DQM1(HDQM)” 为高电平时,数据线 DQ[7:0]
表示的数据有效, 而 DQ[15:8]表示的数据无效。

1. 命令禁止
只要 CS 引脚为高电平,即表示“命令禁止” (COMMAND INHBIT),它用于禁止
SDRAM 执行新的命令,但它不能停止当前正在执行的命令。
2. 空操作
“ 空操作” (NO OPERATION), “命令禁止”的反操作, 用于选中 SDRAM,以便接
下来发送命令。
3. 行有效
进行存储单元寻址时,需要先选中要访问的 Bank 和行,使它处于激活状态。该操作
通过“行有效” (ACTIVE)命令实现,见图 26-5,发送行有效命令时, RAS 线为低电平,
同时通过 BA 线以及 A 线发送 Bank 地址和行地址。

4. 列读写
行地址通过“行有效”命令确定后,就要对列地址进行寻址了。“读命令” (READ)和
“写命令” (WRITE)的时序很相似,见图 26-6,通过共用的地址线 A 发送列地址,同时使
用 WE 引脚表示读/写方向, WE 为低电平时表示写,高电平时表示读。数据读写时,使用
DQM 线表示有效的 DQ 数据线。

本型号的 SDRAM 芯片表示列地址时仅使用 A[7:0]线,而 A10 线用于控制是否“自动预充电”,该线为高电平时使能,低电平时关闭。

预充电
SDRAM 的寻址具有独占性,所以在进行完读写操作后,如果要对同一个 Bank 的另
一行进行寻址,就要将原来有效( ACTIVE)的行关闭,重新发送行/列地址。 Bank 关闭当
前工作行,准备打开新行的操作就是预充电( Precharge)。
预充电可以通过独立的命令控制,也可以在每次发送读写命令的同时使用“ A10”线
控制自动进行预充电。实际上,预充电是一种对工作行中所有存储阵列进行数据重写,并
对行地址进行复位,以准备新行的工作。
独立的预充电命令时序见图 26-7。该命令配合使用 A10 线控制,若 A10 为高电平时,
所有 Bank 都预充电; A10 为低电平时,使用 BA 线选择要预充电的 Bank。

6.刷新
SDRAM 要不断进行刷新(Refresh)才能保留住数据,因此它是 DRAM 最重要的操作。
刷新操作与预充电中重写的操作本质是一样的。
但因为预充电是对一个或所有 Bank 中的工作行操作,并且不定期,而刷新则是有固
定的周期,依次对所有行进行操作,以保证那些久久没被访问的存储单元数据正确。
刷新操作分为两种:“自动刷新”( Auto Refresh)与“自我刷新” (Self Refresh),发
送命令后 CKE 时钟为有效时(低电平),使用自动刷新操作,否则使用自我刷新操作。不论
是何种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。

对于“自动刷新”, SDRAM 内部有一个行地址生成器(也称刷新计数器)用来自动
地依次生成行地址,每收到一次命令刷新一行。 在刷新过程中,所有 Bank 都停止工作,
而每次刷新所占用的时间为 N 个时钟周期(视 SDRAM 型号而定,通常为 N=9), 刷新结束
之后才可进入正常的工作状态,也就是说在这 N 个时钟期间内,所有工作指令只能等待而
无法执行。一次次地按行刷新,刷新完所有行后,将再次对第一行重新进行刷新操作,这
个对同一行刷新操作的时间间隔,称为 SDRAM 的刷新周期,通常为 64ms。 显然刷新会对
SDRAM 的性能造成影响, 但这是它的 DRAM 的特性决定的, 也是 DRAM 相对于 SRAM
取得成本优势的同时所付出的代价。
“自我刷新”则主要用于休眠模式低功耗状态下的数据保存,也就是说即使外部控制
器不工作了, SDRAM 都能自己确保数据正常。在发出“自我刷新”命令后,将 CKE 置于
无效状态(低电平),就进入自我刷新模式,此时不再依靠外部时钟工作,而是根据 SDRAM
内部的时钟进行刷新操作。在自我刷新期间除了 CKE 之外的所有外部信号都是无效的,只
有重新使 CKE 有效才能退出自我刷新模式并进入正常操作状态。
7. 加载模式寄存器
前面提到 SDRAM 的控制逻辑是根据它的模式寄存器来管理整个系统的,而这个寄存
器的参数就是通过“加载模式寄存器”命令(LOAD MODE REGISTER)来配置的。发送该
命令时,使用地址线表示要存入模式寄存器的参数“ OP-Code”,各个地址线表示的参数
见图 26-8。

SDRAM 的初始化流程
最后我们来了解 SDRAM 的初始化流程。 SDRAM 并不是上电后立即就可以开始读写
数据的,它需要按步骤进行初始化,对存储矩阵进行预充电、刷新并设置模式寄存器,见
图 26-10。

该流程说明如下:
(1) 给 SDRAM 上电,并提供稳定的时钟,至少 100us;
(2) 发送“空操作” (NOP)命令;
(3) 发送“预充电” (PRECHARGE)命令,控制所有 Bank 进行预充电,并等待 tRP 时间,
tRP 表示预充电与其它命令之间的延迟;
(4) 发送至少 2 个“自动刷新” (AUTO REFRESH)命令,每个命令后需等待 tRFC 时间, tRFC
表示自动刷新时间;
(5) 发送“加载模式寄存器” (LOAD MODE REGISTER)命令,配置 SDRAM 的工作参数,
并等待 tMRD 时间, tMRD 表示加载模式寄存器命令与行有行或刷新命令之间的延迟;
(6) 初始化流程完毕,可以开始读写数据。

其中 tRP、 tRFC、 tMRD 等时间参数跟具体的 SDRAM 有关,可查阅其数据手册获知,STM32 FMC 访问时配置需要这些参数。

SDRAM 的读写流程
初始化步骤完成,开始读写数据,其时序流程见图 26-11 及图 26-12。

(1) 发送“行有效” (ACTIVE)命令,发送命令的同时包含行地址和 Bank 地址,然后
等待 tRCD 时间, tRCD 表示行有效命令与读/写命令之间的延迟;
(2) 发送“读/写” (READ/WRITE)命令,在发送命令的同时发送列地址,完成寻址的
地址输入。对于读命令,根据模式寄存器的 CL 定义,延迟 CL 个时钟周期后,
SDRAM 的数据线 DQ 才输出有效数据,而写命令是没有 CL 延迟的,主机在发送
写命令的同时就可以把要写入的数据用 DQ 输入到 SDRAM 中,这是读命令与写
命令的时序最主要的区别。图中的读/写命令都通过地址线 A10 控制自动预充电,
而 SDRAM 接收到带预充电要求的读/写命令后,并不会立即预充电,而是等待
tWR 时间才开始, tWR 表示写命令与预充电之间的延迟;
(3) 执行“预充电” (auto precharge)命令后,需要等待 tRP时间, tRP 表示预充电与其它
命令之间的延迟;
(4) 图中的标号?处的 tRAS,表示自刷新周期,即在前一个“行有效”与 “预充电”
命令之间的时间;
(5) 发送第二次“行有效” (ACTIVE)命令准备读写下一个数据,在图中的标号?处的
tRC,表示两个行有效命令或两个刷新命令之间的延迟。
其中 tRCD、 tWR、 tRP、 tRAS 以及 tRC 等时间参数跟具体的 SDRAM 有关,可查阅其数据
手册获知, STM32 FMC 访问时配置需要这些参数。

FMC 简介
STM32F429 使用 FMC 外设来管理扩展的存储器, FMC 是 Flexible Memory Controller
的缩写,译为可变存储控制器。它可以用于驱动包括 SRAM、 SDRAM、 NOR FLASH 以及
NAND FLSAH 类型的存储器。在其它系列的 STM32 控制器中,只有 FSMC 控制器
(Flexible Static Memory Controller),译为可变静态存储控制器,所以它们不能驱动 SDRAM
这样的动态存储器,因为驱动 SDRAM 时需要定时刷新, STM32F429 的 FMC 外设才支持
该功能,且只支持普通的 SDRAM,不支持 DDR 类型的 SDRAM。我们只讲述 FMC 的
SDRAM 控制功能。

时间: 2024-08-07 18:02:15

FMC—扩展外部 SDRAM的相关文章

STM32(十二)- FSMC_扩展外部SRAM

7 原文地址:https://www.cnblogs.com/wuguangzong/p/10925026.html

【STM32H7教程】第49章 STM32H7的FMC总线应用之SDRAM

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第49章       STM32H7的FMC总线应用之SDRAM 本章教程为大家讲解SDRAM的驱动实现,后面LCD的显存和大数量的存取都要用到. 49.1 初学者重要提示 49.2 SDRAM硬件设计 49.3 SDRAM驱动设计 49.4 SDRAM板级支持包(bsp_fmc_sdram.c) 49.5 SDRAM驱动移植和使用 49.6 实验例程设计框架 49.

zynq板卡学习资料:基于zynq XC7Z100 FMC接口通用计算平台367

基于zynq XC7Z100 FMC接口通用计算平台 一.板卡概述 本板卡基于Xilinx公司的FPGA XC7Z100 FFG 9000 芯片, 该平台为设计和验证应用程序提供了一个完整的开发平台.该平台使设计师能够更加简单进行高性能的原型设计,并且通过FMC HPC扩展槽提供可扩展性和满足客户定制需求. 二.基础接口和性能 使用 Zynq-7000 SoC  XC7Z100对嵌入式应用进行快速原型设计以实现优化 支持包含 Dual ARM Cortex-A9 核处理器的嵌入式处理 PS 端3

【STM32H7教程】第51章 STM32H7的LTDC应用之LCD汉字显示和2D图形显示

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第51章       STM32H7的LTDC应用之LCD汉字显示和2D图形显示 本章教程为大家讲解LTDC应用中最基本的汉字显示和2D图形显示功能实现. 51.1 初学者重要提示 51.2 LCD相关的基础支持 51.3 LCD硬件设计 51.4 LCD驱动设计 51.5 LCD板级支持包(bsp_ltdc_h7.c和bsp_tft_lcd.c) 51.6 LCD的

【STM32H7教程】第69章 STM32H7的系统bootloader之串口IAP固件升级

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第69章       STM32H7的系统bootloader之串口IAP固件升级 本章节为大家讲解使用系统bootloader做程序升级的方法,即使不依赖外部boot引脚也可以方便升级. IAP的全称是In Application Programming,即在线应用编程. 69.1 初学者重要提示 69.2 跳转到系统bootloader的程序设计 69.3 STM

NetFPGA

From Wikipedia, the free encyclopedia The NetFPGA project[1] is an effort to develop open source hardware and software for rapid prototyping of computer network devices. The project targeted academic researchers, industry users, and students. It was

VC++制作DLL详解

1.    DLL的基本概念 应用程序(exe)要引用目标代码(.obj)外部的函数时,有两种实现途径--静态链接和动态链接. 1.    静态链接 链接程序搜索对应的库文件(.lib),然后将这个对象模块拷贝到应用程序(.exe)中来.Windows之所不使用静态链接库,是因为很多基础库被很多应用程序使用.如果每个应用程序一份拷贝,将带来内存的极大浪费. 2.    动态链接 链接程序搜索到对应的库文件(.lib),然后根据函数名得到对应的函数入口地址,即可进行编译链接.直到真正运行的时候,应

NetFPGA平台介绍

介绍 NetFPGA是一款低功耗的开发平台,作为网络硬件教学和路由设计的设计工具.NetFPGA可以很方便的使得研究人员或者高校的学生搭建一个高速.硬件加速的网络系统.兴起于北美,最初只是斯坦福大学课堂教学使用的Project.NetFPGA把FPGA的可配置的特性带入了网络通讯领域,可以为更多的研究人员研究下一代网络提供了一个开放的平台.愈来愈多的人开始关注到NetFPGA的特性,并有很多人参与了基于NetFPGA的开源项目. NetFPGA的参数 NetFPGA平台(如图1)包含了一个Xil

野火 ov7725 学习笔记 (fifo)

AL422B-FIFO简介STM32F4系列的控制器主频高.一般会扩展外部SRAM.SDRAM等 存储器,且具有DCMI外设,可以直接根据VGA时序接收并存储摄像头输出的图 像数据:而STM32F1系列的控制器一般主频较低.为节省成本可能不扩展 SRAM存储器,而且不具DCMI外设,难以直接接收和存储OV7725图像传感器输出的数据. 为了解决上述问题,针对类似STM32F1或更低级的控制器,秉火的 OV7725摄像头在图像传感器之外还添加了一个型号为AL422B的FIFO,用于缓 冲数据.AL