39.1 初学者重要提示
学习本章节前,务必优先学习第37章,需要对FMC的基础知识和HAL库的几个常用API有个认识。
学习SDRAM前搞清楚两个问题,一个是SDRAM的基本原理,还有一个就是那几个关键的参数,参数是STM32H7配置SDRAM的关键。这几个参数大概了解是什么意思即可,配置的时候,根据SDRAM的手册配置一下就完成了。
关于SDRAM的学习资料,推荐此贴:http://www.armbbs.cn/forum.php?mod=viewthread&tid=1930。特别是《高手进阶,终极内存技术指南——完整/进阶版》,强烈推荐大家一定看下。
STM32F429驱动32位SDRAM的写速度狂飙300MB/S,读速度90MB/S。http://www.armbbs.cn/forum.php?mod=viewthread&tid=16836 。
39.2 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的空间。
用到引脚所代表的含义:
了解这些知识就够了,剩下就是软件配置时的参数设置。
39.3 SDRAM驱动设计
下面将程序设计中的相关问题逐一为大家做个说明。
39.3.1 第1步,配置SDRAM的几个重要参数
STM32F429把这几个关键的参数做到了一个寄存器里面了,这些参数,手册上面有一些说明,但比较的笼统。
注:更多的参数介绍可以看本章初学者重要提示部分推荐的文档《高手进阶,终极内存技术指南——完整/进阶版》。
tRCD(TRCD):
在发送列读写命令时必须要与行有效命令有一个间隔,这个间隔被定义为tRCD,即RAS to CASDelay(RAS至CAS延迟),大家也可以理解为行选通周期,这应该是根据芯片存储阵列电子元件响应时间(从一种状态到另一种状态变化的过程)所制定的延迟。tRCD是SDRAM的一个重要时序参数,广义的tRCD以时钟周期数为单位,比如tRCD=2,就代表延迟周期为两个时钟周期。具体到确切的时间,则要根据时钟频率而定,对于STM32F429驱动SDRAM,采用的168MHz,实际使用要做2分频,即84MHz,那么我们设置tRCD=2,就代表23.8ns的延迟。
CL(CAS Latency):
在选定列地址后,就已经确定了具体的存储单元,剩下的事情就是数据通过数据I/O通道(DQ)输出到内存总线上了。但是在CAS发出之后,仍要经过一定的时间才能有数据输出,从CAS与读取命令发出到第一笔数据输出的这段时间,被定义为CL(CAS Latency,CAS潜伏期)。由于CL只在读取时出现,所以CL又被称为读取潜伏期(RL,Read Latency)。CL的单位与tRCD一样,为时钟周期数,具体耗时由时钟频率决定。数据写入的操作也是在tRCD之后进行,但此时没有了CL(记住,CL只出现在读取操作中)。
tWR(TWR):
数据并不是即时地写入存储电容,因为选通三极管(就如读取时一样)与电容的充电必须要有一段时间,所以数据的真正写入需要一定的周期。为了保证数据的可靠写入,都会留出足够的写入/校正时间(tWR,WriteRecovery Time),这个操作也被称作写回(Write Back)。
tRP(TRP):
在发出预充电命令之后,要经过一段时间才能允许发送RAS行有效命令打开新的工作行,这个间隔被称为tRP(Precharge command Period,预充电有效周期)。和tRCD、CL一样,tRP的单位也是时钟周期数,具体值视时钟频率而定。
39.3.2 第2步,FMC时钟源选择
STM32F429的FMC是采用的HCLK时钟,位于AHB总线上。比如主频设置的是168MHz,那么FMC时钟也是168MHz。
FMC驱动SDRAM的话,必须对FMC的时钟做2分频或者3分频,而且仅支持这两种分频方式,也就是说,SDRAM时钟可以选择168MHz/2 = 84MHz或者168MHz/3 = 56MHz。
39.3.3 第3步,SDRAM时序参数配置
SDRAM的时序配置主要是下面几个参数,FMC时钟是168MHz,驱动SDRAM做了2分频,也就是84MHz,一个SDRAM时钟周期就是11.90ns,下面参数的单位都是11.90ns:
SDRAM_Timing.LoadToActiveDelay = 2;
SDRAM_Timing.ExitSelfRefreshDelay = 7;
SDRAM_Timing.SelfRefreshTime = 4;
SDRAM_Timing.RowCycleDelay = 7;
SDRAM_Timing.WriteRecoveryTime = 2;
SDRAM_Timing.RPDelay = 2;
SDRAM_Timing.RCDDelay = 2;
下面就把这几个参数逐一为大家做个说明:
TMRD
SDRAM_Timing.LoadToActiveDelay = 2;
TMRD定义加载模式寄存器的命令与激活命令或刷新命令之间的延迟。SDRAM手册上提供的是四种速度等级时提供的参数,V6开发板用的SDRAM支持143MHz,TMRD=2就是13.9ns,而我们实际驱动SDRAM是用的100MHz,TMRD = 1时是10ns,超出了性能范围,TMRD=2时是20ns,所以这里取值2。
TXSR
SDRAM_Timing.ExitSelfRefreshDelay = 7;
TXSR定义从发出自刷新命令到发出激活命令之间的延迟。SDRAM速度等级143MHz时,最小值为70ns,取值为7的话,那就是11.90ns * 7 = 83.3ns。
TRAS
SDRAM_Timing.SelfRefreshTime = 4;
TRAS定义最短的自刷新周期。SDRAM速度等级143MHz时,最小值为42ns。取值为4的话,那就是11.90ns * 4 = 47.6ns。
TRC
SDRAM_Timing.RowCycleDelay = 7;
TRC定义刷新命令和激活命令之间的延迟。SDRAM速度等级143MHz时,最小值为70ns。取值为7的话,那就是11.90ns * 7 = 83.3ns。
TWR
SDRAM_Timing.WriteRecoveryTime = 2;
TWR定义在写命令和预充电命令之间的延迟。SDRAM速度等级143MHz时,最小值为14ns。取值为7的话,那就是11.90ns * 2=23.8ns。
TRP
SDRAM_Timing.RPDelay = 2;
TRP定义预充电命令与其它命令之间的延迟。SDRAM速度等级143MHz时,最小值为20ns。取值为2的话,那就是11.90ns * 2=23.8ns。
TRCD
SDRAM_Timing.RCDDelay = 2;
TRCD定义激活命令与读/写命令之间的延迟。SDRAM速度等级143MHz时,最小值为20ns。取值为2的话,那就是11.90ns * 2=23.8ns。
39.3.4 第4步,SDRAM基本参数配置
SDRAM的基本参数配置如下:
1. hsdram.Init.SDBank = FMC_SDRAM_BANK1;
2. hsdram.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;
3. hsdram.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
4. hsdram.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_32;
5. hsdram.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
6. hsdram.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;
7. hsdram.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
8. hsdram.Init.SDClockPeriod = SDCLOCK_PERIOD;
9. hsdram.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;
10. hsdram.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1;
第1行:硬件设计上用的BANK1。
第2-3行:镁光的SDRAM,型号MT48LC4M32B2TG-7,12行8列。
第4行:SDRAM的带宽是32位。
第5行:SDRAM有4个BANK。
第6行:CAS Latency可以设置Latency1,Latency2和Latency3,实际测试Latency3稳定。
第7行:关闭写保护。
第8行:设置FMC做2分频输出给SDRAM,即168MHz做2分频,SDRAM的时钟是84MHz。
这里的SDCLOCK_PERIOD是个宏定义:
#define SDCLOCK_PERIOD FMC_SDRAM_CLOCK_PERIOD_2
第9行:使能读突发。
第10行:此位定义CAS延时后延后多少个SDRAM时钟周期读取数据,实际测此位可以设置无需延迟。
39.3.5 第5步,SDRAM初始化
SDRAM的初始化如下:
1. /*
2. ******************************************************************************************************
3. * 函 数 名: SDRAM初始化序列
4. * 功能说明: 完成SDRAM序列初始化
5. * 形 参: hsdram: SDRAM句柄
6. * Command: 命令结构体指针
7. * 返 回 值: None
8. ******************************************************************************************************
9. */
10. static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram,
11. FMC_SDRAM_CommandTypeDef *Command)
12. {
13. __IO uint32_t tmpmrd =0;
14.
15. /*##-1- 时钟使能命令 ##################################################*/
16. Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
17. Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;;
18. Command->AutoRefreshNumber = 1;
19. Command->ModeRegisterDefinition = 0;
20.
21. /* 发送命令 */
22. HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);
23.
24. /*##-2- 插入延迟,至少100us ##################################################*/
25. HAL_Delay(1);
26.
27. /*##-3- 整个SDRAM预充电命令,PALL(precharge all) #############################*/
28. Command->CommandMode = FMC_SDRAM_CMD_PALL;
29. Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
30. Command->AutoRefreshNumber = 1;
31. Command->ModeRegisterDefinition = 0;
32.
33. /* 发送命令 */
34. HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);
35.
36. /*##-4- 自动刷新命令 #######################################################*/
37. Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
38. Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
39. Command->AutoRefreshNumber = 8;
40. Command->ModeRegisterDefinition = 0;
41.
42. /* 发送命令 */
43. HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);
44.
45. /*##-5- 配置SDRAM模式寄存器 ###############################################*/
46. tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 |
47. SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL |
48. SDRAM_MODEREG_CAS_LATENCY_3 |
49. SDRAM_MODEREG_OPERATING_MODE_STANDARD |
50. SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
51.
52. Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
53. Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
54. Command->AutoRefreshNumber = 1;
55. Command->ModeRegisterDefinition = tmpmrd;
56.
57. /* 发送命令 */
58. HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);
59.
60. /*##-6- 设置自刷新率 ####################################################*/
61. /*
62. SDRAM refresh period / Number of rows)*SDRAM时钟速度 – 20
63. = 64ms / 4096 *100MHz - 20
64. = 1542.5 取值1543
65. */
66. HAL_SDRAM_ProgramRefreshRate(hsdram, REFRESH_COUNT);
67. }
68. /*
69. ******************************************************************************************************
70. * 函 数 名: SDRAM初始化序列
71. * 功能说明: 完成SDRAM序列初始化
上一篇:第40章 STM32F429的LCD控制器LTDC基础知识和HAL库API
下一篇:第38章 STM32F429的FMC总线应用之是32路高速IO扩展
推荐阅读最新更新时间:2024-11-16 22:50
推荐帖子
- Download新内核后按键和触摸屏都无声
- 重新下载新的内核后,按键和触摸屏都变的没有声音了,用PB5.0下的RemoteRegistryEditor对比两内核的注册表,三者的设置完全一致,不知问题到底是出在什么地方了??请各位高手指点Download新内核后按键和触摸屏都无声看音频驱动是否正确加载了呢楼主是同样的内核再次下载时出现状况吗?还是重新编译内核下载后导致的?如果是重新编译内核了,请检查一下相关组件有没有添加到OS中来。看相关驱动是否加载了。楼主表述尽量详细一些。我等好看一些。是在之前的平台上又重新编译的
- nick35 嵌入式系统
- 基于24C02和LCD液晶显示的电子密码锁的仿真.rar
- 基于24C02和LCD液晶显示的电子密码锁的仿真基于24C02和LCD液晶显示的电子密码锁的仿真.rar基于24C02和LCD液晶显示的电子密码锁的仿真.rar基于24C02和LCD液晶显示的电子密码锁的仿真.rarPWM调温.rarPWM调温.rarRAM扩展仿真RAM扩展.rariccavr240128iccavr240128谢谢,先让我下载这个附件先怎么下载不了。老提示无法复制原文件下载需要4枚芯币,请多多参与讨论,多多分享。同时在置顶帖还有报到送芯币的活动。
- kf026530 单片机
- EEWORLD大学堂----如何使用戴尔XPS15Z 笔记本电脑上的Cypress触摸板
- 如何使用戴尔XPS15Z笔记本电脑上的Cypress触摸板:https://training.eeworld.com.cn/course/2015如何使用戴尔XPS15Z笔记本电脑上的Cypress触摸板EEWORLD大学堂----如何使用戴尔XPS15Z笔记本电脑上的Cypress触摸板
- chenyy 移动便携
- MSP430编程时常犯的错误
- 错误1 Error:expectedastatementE:\MSP430\Module\TFT\SD.c95 Error:expecteda)E:\MSP430\Module\TFT\SD.c132解决:仔细检查下程序,看有没有一些语法上的错误,多加的;就会使程序出现上述错误;或者一些常用语句表达错误。Example1:宏定义的时候多加了;#defineSPI_DO_HP1OUT|=BIT0;//P1.0#defi
- fish001 微控制器 MCU
- rfid低频和高频天线技术
- rfid根据工作频率,有低频、高频、超高频和微波系统之分。频率是指相关的读写器和标签的工作频率,也就是它们的天线频率。本文章讨论一下低频和高频的天线技术。在低频和高频频段,读写器与电子标签基本都采用线圈天线,二者线圈之间存在相互感应,使一方线圈的能量可以耦合到另方线圈,因此读写器天线与电子标签天线之间采用电感耦合的方式工作。读写器天线与电子标签天线是近场耦合(参照博文章耦合形式http://blog.csdn.net/yixueming/article/details/4
- fish001 RF/无线
- ARM的读时序
- 我用的S3C2440的平台,想测试一下nGCS5和nROE的时序,在GPACON中已经配置过了,但二者端口始终输出是高电平(理论上应该是ARM自动产生时序),请高手指教应如何设置才能测到.ARM的读时序什么玩意啊?没看懂你再说什么
- net ARM技术
设计资源 培训 开发板 精华推荐
- 使用 Analog Devices 的 LTC2609CGN-1 的参考设计
- STC15F2K60S2开发板
- Si5601-EVB,用于 SI5601 OC-192/S-64 SONET/SDH 收发器的评估板套件,具有单独的 VDD 1.8 V 电源连接
- 基于ESP-01的物联网继电器
- TC650DEMO,使用 TC650 PWM 风扇电机控制器的风扇控制演示板
- 基于stm32f103c8t6最小系统设计
- 100W, 3.267 to 3.333V DC to DC 单路输出电源,适用于电信电源
- EVAL-AD7273CBZ,用于仪表的 AD7273、10 位、3MSPS ADC 的评估板
- ic卡
- ExpressLRS_STM32_915M
- 大联大品佳集团推出以复旦微和ams OSRAM产品为主的汽车氛围灯方案
- 为啥车载操作系统(Vehicle OS)越来越重要了呢?
- 车载传感器 — 一文详解激光雷达
- 汽车(超声波、毫米波、激光)雷达之间的简单区别
- 汽车电路相关知识大全
- Bourns 推出两款厚膜电阻系列,具备高功率耗散能力, 采用紧凑型 TO-220 和 DPAK 封装设计
- SABIC进一步深化与博鳌亚洲论坛的战略合作伙伴关系
- 使用 3.3V CAN 收发器在工业系统中实现可靠的数据传输
- 凌华智能推出AmITX Mini-ITX 主板,助力边缘人工智能和物联网创新
- 英飞凌携手马瑞利采用AURIX™ TC4x MCU系列推动区域控制单元创新