微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > SDRAM 使用

SDRAM 使用

时间:10-02 整理:3721RD 点击:

在以往的STM32F103上,只能使用SRAM而不支持SDRAM的扩展。

这里有必要说明一下。SRAM是Static Random Access Memory的缩写,中文含义为静态随机访问存储器,它是一种类型的半导体存储器。“静态”是指只要不掉电,存储在SRAM中的数据就不会丢失。这一点与动态RAM(DRAM)不同,DRAM需要进行周期性的刷新操作。而且是行列地址复用的,许多都有页模式。

而在阿波罗STM32F767上使用的是SDRAM,而不是SRAM,这一点对于只是使用过STM32F103的同学可能有点新。

阿波罗STM32F767上的SDRAM为W9825G6KH,其驱动外设要使用FMC,如下的原理图,使用了13位地址总线与16位数据总线,以及其他的时钟与控制信号。





这里对于程序的说明,虽然程序中有关于LCD的代码,但是并不能驱动LCD,由于没有LTDC部分的配置,使用时要想显示LCD,这部分代码要自己添加上。 其中SDRAM的初始化函数主要是对FMC外设进行配置。其中部分注释可能有问题,与程序不符。以程序为准。

  1. void SDRAM_Init(void)
  2. {
  3.     FMC_SDRAM_TimingTypeDef SDRAM_Timing;
  4.                                                      
  5.     SDRAM_Handler.Instance=FMC_SDRAM_DEVICE;                                  //SDRAM在BANK5,6  
  6.     SDRAM_Handler.Init.SDBank=FMC_SDRAM_BANK1;                           //SDRAM接在BANK5上
  7.     SDRAM_Handler.Init.ColumnBitsNumber=FMC_SDRAM_COLUMN_BITS_NUM_9;     //列数量
  8.     SDRAM_Handler.Init.RowBitsNumber=FMC_SDRAM_ROW_BITS_NUM_13;          //行数量
  9.     SDRAM_Handler.Init.MemoryDataWidth=FMC_SDRAM_MEM_BUS_WIDTH_16;       //数据宽度为16位
  10.     SDRAM_Handler.Init.InternalBankNumber=FMC_SDRAM_INTERN_BANKS_NUM_4;  //一共4个BANK
  11.     SDRAM_Handler.Init.CASLatency=FMC_SDRAM_CAS_LATENCY_3;               //CAS为3
  12.     SDRAM_Handler.Init.WriteProtection=FMC_SDRAM_WRITE_PROTECTION_DISABLE;//失能写保护
  13.     SDRAM_Handler.Init.SDClockPeriod=FMC_SDRAM_CLOCK_PERIOD_2;           //SDRAM时钟为HCLK/2=216M/2=108M=9.3ns
  14.     SDRAM_Handler.Init.ReadBurst=FMC_SDRAM_RBURST_ENABLE;                //使能突发
  15.     SDRAM_Handler.Init.ReadPipeDelay=FMC_SDRAM_RPIPE_DELAY_1;            //读通道延时
  16.    
  17.     SDRAM_Timing.LoadToActiveDelay=2;                                   //加载模式寄存器到激活时间的延迟为2个时钟周期
  18.     SDRAM_Timing.ExitSelfRefreshDelay=8;                                //退出自刷新延迟为8个时钟周期
  19.     SDRAM_Timing.SelfRefreshTime=6;                                     //自刷新时间为6个时钟周期                                 
  20.     SDRAM_Timing.RowCycleDelay=6;                                       //行循环延迟为6个时钟周期
  21.     SDRAM_Timing.WriteRecoveryTime=2;                                   //恢复延迟为2个时钟周期
  22.     SDRAM_Timing.RPDelay=2;                                             //行预充电延迟为2个时钟周期
  23.     SDRAM_Timing.RCDDelay=2;                                            //行到列延迟为2个时钟周期
  24.     HAL_SDRAM_Init(&SDRAM_Handler,&SDRAM_Timing);  
  25.        
  26.         SDRAM_Initialization_Sequence(&SDRAM_Handler);//发送SDRAM初始化序列
  27.    
  28. }

复制代码


配置了FMC后,还要对SDRAM进行初始化。


  1. void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram)
  2. {
  3.         u32 temp=0;
  4.     //SDRAM控制器初始化完成以后还需要按照如下顺序初始化SDRAM
  5.     SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_CLK_ENABLE,1,0); //时钟配置使能
  6.     delay_us(500);                                  //至少延时200us
  7.     SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_PALL,1,0);       //对所有存储区预充电
  8.     SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_AUTOREFRESH_MODE,8,0);//设置自刷新次数
  9.     //配置模式寄存器,SDRAM的bit0~bit2为指定突发访问的长度,
  10.         //bit3为指定突发访问的类型,bit4~bit6为CAS值,bit7和bit8为运行模式
  11.         //bit9为指定的写突发模式,bit10和bit11位保留位
  12.         temp=(u32)SDRAM_MODEREG_BURST_LENGTH_1          |        //设置突发长度:1(可以是1/2/4/8)
  13.               SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |        //设置突发类型:连续(可以是连续/交错)
  14.               SDRAM_MODEREG_CAS_LATENCY_3           |        //设置CAS值:3(可以是2/3)
  15.               SDRAM_MODEREG_OPERATING_MODE_STANDARD |   //设置操作模式:0,标准模式
  16.               SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;     //设置突发写模式:1,单点访问
  17.     SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_LOAD_MODE,1,temp);   //设置SDRAM的模式寄存器
  18.    
  19.     //刷新频率计数器(以SDCLK频率计数),计算方法:
  20.         //COUNT=SDRAM刷新周期/行数-20=SDRAM刷新周期(us)*SDCLK频率(Mhz)/行数
  21.     //我们使用的SDRAM刷新周期为64ms,SDCLK=216/2=108Mhz,行数为8192(2^13).
  22.         //所以,COUNT=64*1000*108/8192-20=823
  23.         HAL_SDRAM_ProgramRefreshRate(&SDRAM_Handler,823);       

  24. }

复制代码


main函数功能,即对外设进行初始化,并在按下key0后,测试SRAM




按下key1进,串口输出记录。







不错的分享!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top