第39章 STM32F429的FMC总线应用之SDRAM

发布者:alpha12最新更新时间:2022-04-28 来源: eefocus关键字:STM32F429  SDRAM 手机看文章 扫描二维码
随时随地手机看文章

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序列初始化

[1] [2] [3] [4]
关键字:STM32F429  SDRAM 引用地址:第39章 STM32F429的FMC总线应用之SDRAM

上一篇:第40章 STM32F429的LCD控制器LTDC基础知识和HAL库API
下一篇:第38章 STM32F429的FMC总线应用之是32路高速IO扩展

推荐阅读最新更新时间:2024-11-16 22:50

STM32F429HAL库ADCDMA学习笔记
做了一个ADC的程序一直想学习一下DMA的配置,我一直也是不懂DMA到底有什么用处,还是感觉很鸡肋。稍微配置了一下,我是这样理解DMA的。在配置了dma之后我们adc的数据不会再由cpu搬运,我们直接读取我们DMA数据是节省adc时间。直接看配置 void MY_ADC_Init(void) { ADC_ChannelConfTypeDef ADC1_ChanConf; ADC1_Handler.Instance=ADC1; ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4; //4分频,ADCCLK=PCLK2/4=90/4=22.5MHZ A
[单片机]
电源管理IC是DDR SDRAM存储器的理想选择
  与其它存储器技术相比,DDRSDRAM具有出众性能、很低的功耗以及更具竞争力的成本。可与以前的SDRAM技术相比,DDRx存储器需要一个更复杂的电源管理新架构。本文探讨了DDR电源管理架构的理想选择。   与其它存储器技术相比,DDRSDRAM具有出众性能、很低的功耗以及更具竞争力的成本,目前已普遍应用在桌面电脑和便携计算应用中。   最初,DDR的数据传输速率只有266MBps,而普通SDRAM的速率只有133MBps。随后,DDR数据传输速率增加400MBps。第二代DDR,即2004年初登场的DDR2,将数据速率从400MBps提高到667MBps,而同时还进一步降低了功耗。   目前,第一代DDR仍在存储器市场中
[手机便携]
电源管理IC是DDR <font color='red'>SDRAM</font>存储器的理想选择
高速嵌入式视频系统中SDRAM时序控制分析
在高速数字视频系统应用中,使用大容量存储器实现数据缓存是一个必不可少的环节。SDRAM就是经常用到的一种存储器。 但是,在主芯片与SDRAM之间产生的时序抖动问题阻碍了产品的大规模生产。在数字电视接收机的生产实际应用中,不同厂家的PCB板布线、PCB材料和时钟频率的不同,及SDRAM型号和器件一致性不同等原因,都会带来解码主芯片与SDRAM间访问时序的抖动问题。 本文利用C-NOVA公司数字电视MPEG-2解码芯片AVIA9700内置的SDRAM控制器所提供的时序补偿机制,设计了一个方便使用的内存时序测试软件工具,利用这个工具,开发测试人员可在以AVIA9700为解码器的数字电视接收机设计和生产中进行快速诊断,并解决SDRAM的时
[单片机]
高速嵌入式视频系统中<font color='red'>SDRAM</font>时序控制分析
基于STM32F429的定时器中断点亮LED的设计
电子时代,硬件在突飞猛进的发展,频率不断上升,目前的STM32系列,Cortex M系列,Cortex-M4的频率已经为:180MHz了,基本上与之前的ARM7/9频率差不多了,还有Cortex-M7,频率更高,出现了BGA封装与SDRAM DDR等。看来处理器越来越大众化了,物联网上的电子设备联网,也越来越普及了,硬件成本不断降低是大势所趋,因此,作为一个电子设计人员,还是要不断的学习掌握更多的技术知识与基础,从而不会被社会很快淘汰。 最近买了一个现成的STM32F429 Discovery 的开发板,想尝试一下较大点的嵌入式操作系统如RTEMS的移植与应用。因为有了STM32F103/107的基础,熟悉了硬件与固件库,ST
[单片机]
基于<font color='red'>STM32F429</font>的定时器中断点亮LED的设计
DSP片外高速海量SDRAM存储系统设计
在数字图像处理、航空航天等高速信号处理应用场合,需要有高速大容量存储空间的强力支持,来满足系统对海量数据吞吐的要求,通过使用大容量同步动态RAM(SDRAM)来扩展嵌入式DSP系统存储空间的方法,选用ISSI公司的IS42S16400高速SDRAM芯片,详细论述在基于TMS320C6201(简称C6201)的数字信号处理系统中此设计方法的具体实现。    1 IS42S16400芯片简介   IS42S16400是ISSI公司推出的一种单片存储容量高达64Mb(即8MB)的16位字宽高速SDRAM芯片。SDRAM的主要特点是:①同步访问,读写操作需要时钟;②动态存储,芯片需要定时刷新。IS42S16400采用CMOS工艺
[嵌入式]

推荐帖子

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技术
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved