|
本帖最后由 andeyqi 于 2018-10-12 09:33 编辑 STM32f769I-DISC开发板板载了128Mbit的SDRAM芯片,一直只是了解SDRAM原理,并未进行深入的了解,手头的开发板硬件资源丰富可以有机会研究下。片上SDRAM框图如下:
从图中可以看出,SDRAM的行地址宽度和列地址宽度分别为12bit和8bit,正好和demo的配置吻合。
由于技术、成本等原因,不可能只做一个全容量的 L-Bank,而且最重要的是,由于 SDRAM 的工作原理限制,单一的 L-Bank 将会造成非常严重的寻址冲突,大幅降低内存效率。所以人们在 SDRAM 内部分割成多个L-Bank,较早以前是两个,目前基本都是 4 个,这也是 SDRAM 规范中的最高 L-Bank 数量。根据上面的图示可以知道,板子上的Lbank数量为4。
根据上面的芯片框图,芯片的控制引脚大致分为,时钟信号线,地址线,数据线,控制线这三类。 时钟信号线: CLK:时钟信号线 CKE:时钟使能信号线 地址线: A0-A11 12根地址线 BA0,BA1:SDRAM bank选择信号 数据线: DQ0-DQ31 32根数据线 控制线: CS#:片选信号线 WE#:SDRAM写使能信号 CAS#:列地址选择信号线 RAS#:行地址选择信号线 DQM0-DQM3:SDRAM输入输出掩码控制信号 FMC结构框图如下:
硬件连线图:
FMC模块使用的时钟为HCLK,试验代码配置200MHZ(The AHB clock (HCLK) is the reference clock for the FMC.) 硬件相关的初始化如下:
SDRAM命令发送方法如下:
SDRAM的时钟分频系数设置可设为2和3(SDRAM clock can be HCLK/2 or HCLK/3 ),demo代码设置为2即CLK为100M,周期10ns。 #define SDRAM clock can be HCLK/2 or HCLK/3 hsdram.Init.SDClockPeriod = SDCLOCK_PERIOD; SDRAM相关时间参数的设置: 芯片手册上TRCD的时间描述如下,最小值为20ns.
根据SDRAM Timing registers 寄存器的描述,Bits 27:24 TRCD[3:0]: Row to column delay 此处可以设为1~16来设置最小值,demo设置的为2(30ns) > 最小值20ns符合芯片时序要求。 SDRAM_Timing.RCDDelay = 2;
芯片手册的TRRD时间最小值为14ns
代码配置为3个时钟周期,30ns满足芯片的最小时间要求。 SDRAM_Timing.RPDelay = 2; CAS 根据手册的描述指的是,模式寄存器中的 CASLatency 是指列地址选通延迟,简称 CL。在发出读命令(命令同时包含列地址)后,需要等待几个时钟周期数据线 DQ 才会输出有效数据,,手册上描述支持1,2,3(Supports CAS latency of 1, 2, and 3)个周期,769的FMC控制器支持CAS latency of 1,2,3三种配置,demo中配置的为2。 hsdram.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2;改参数设置的为SDRAM的模式寄存器的CASLatency位。
tXSR (These bits define the delay from releasing the Self-refresh command to issuing the Activate command in number of memory clock cycles. )自刷新命令后,可以执行Active command 的时间间隔芯片手册描述最小为(70ns)。
SDRAM_Timing.ExitSelfRefreshDelay = 6; demo中设定为70ns tRAS (These bits define the minimum Self-refresh period in number of memory clock cycles.)刷新周期,刷新率,手册要求最小值为42ns. SDRAM_Timing.SelfRefreshTime = 4;demo中设定为50ns满足要求 tMRD 设定load mode 命令和 active 指令之间的时间间隔,手册上最小值为2个时钟周期 Bits 3:0 TMRD[3:0]: Load Mode Register to Active These bits define the delay between a Load Mode Register command and an Active or Refresh command in number of memory clock cycles. 0000: 1 cycle 0001: 2 cycles .... 1111: 16 cycles SDRAM_Timing.LoadToActiveDelay = 2;demo中设置为3个时钟周期满足芯片要求 tRC(ACTIVE to ACTIVE command period) 芯片手册描述的为70ns,代码中设置为70ns SDRAM_Timing.RowCycleDelay = 6; tWR:WRITE recovery time( Auto precharge mode only )芯片手册描述为1CLK+7ns,针对本demo为17ns,demo代码的SDRAM_Timing.WriteRecoveryTime = 2; 30ns符合要求。
769文档上对这个几个时间有此要求:TWR ≥ TRAS - TRCD and TWR ≥TRC - TRCD - TRP TWR=30ns ,TRAS = 50ns,TRCD = 30ns,TRC = 70ns ,TRP = 30ns 时间参数满足上述要求。下图为SDRAM初始化流程图。
该流程说明如下: (1) 给 SDRAM 上电,并提供稳定的时钟,至少 100us; (2) 发送“空操作” (NOP)命令; (3) 发送“预充电” (PRECHARGE)命令,控制所有 Bank 进行预充电,并等待 tRP 时间,tRP 表示预充电与其它命令之间的延迟; (4) 发送至少 2 个“自动刷新” (AUTO REFRESH)命令,每个命令后需等待 tRFC 时间, tRFC表示自动刷新时间; (5) 发送“加载模式寄存器” (LOAD MODE REGISTER)命令,配置 SDRAM 的工作参数,并等待 tMRD时间, tMRD表示加载模式寄存器命令与行有行或刷新命令之间的延迟; (6) 初始化流程完毕,可以开始读写数据。
(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 访问时配置需要这些参数。 =======================参考资料=========================
MT48LC4M32_DataSheet.pdf
(1.25 MB, 下载次数: 3)
|
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版
感谢破总捧场
只是理解了下demo程序,有些东西还是没有理解透彻,在慢慢学习理解。