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外设进行配置。其中部分注释可能有问题,与程序不符。以程序为准。
- void SDRAM_Init(void)
- {
- FMC_SDRAM_TimingTypeDef SDRAM_Timing;
-
- SDRAM_Handler.Instance=FMC_SDRAM_DEVICE; //SDRAM在BANK5,6
- SDRAM_Handler.Init.SDBank=FMC_SDRAM_BANK1; //SDRAM接在BANK5上
- SDRAM_Handler.Init.ColumnBitsNumber=FMC_SDRAM_COLUMN_BITS_NUM_9; //列数量
- SDRAM_Handler.Init.RowBitsNumber=FMC_SDRAM_ROW_BITS_NUM_13; //行数量
- SDRAM_Handler.Init.MemoryDataWidth=FMC_SDRAM_MEM_BUS_WIDTH_16; //数据宽度为16位
- SDRAM_Handler.Init.InternalBankNumber=FMC_SDRAM_INTERN_BANKS_NUM_4; //一共4个BANK
- SDRAM_Handler.Init.CASLatency=FMC_SDRAM_CAS_LATENCY_3; //CAS为3
- SDRAM_Handler.Init.WriteProtection=FMC_SDRAM_WRITE_PROTECTION_DISABLE;//失能写保护
- SDRAM_Handler.Init.SDClockPeriod=FMC_SDRAM_CLOCK_PERIOD_2; //SDRAM时钟为HCLK/2=216M/2=108M=9.3ns
- SDRAM_Handler.Init.ReadBurst=FMC_SDRAM_RBURST_ENABLE; //使能突发
- SDRAM_Handler.Init.ReadPipeDelay=FMC_SDRAM_RPIPE_DELAY_1; //读通道延时
-
- SDRAM_Timing.LoadToActiveDelay=2; //加载模式寄存器到激活时间的延迟为2个时钟周期
- SDRAM_Timing.ExitSelfRefreshDelay=8; //退出自刷新延迟为8个时钟周期
- SDRAM_Timing.SelfRefreshTime=6; //自刷新时间为6个时钟周期
- SDRAM_Timing.RowCycleDelay=6; //行循环延迟为6个时钟周期
- SDRAM_Timing.WriteRecoveryTime=2; //恢复延迟为2个时钟周期
- SDRAM_Timing.RPDelay=2; //行预充电延迟为2个时钟周期
- SDRAM_Timing.RCDDelay=2; //行到列延迟为2个时钟周期
- HAL_SDRAM_Init(&SDRAM_Handler,&SDRAM_Timing);
-
- SDRAM_Initialization_Sequence(&SDRAM_Handler);//发送SDRAM初始化序列
-
- }
配置了FMC后,还要对SDRAM进行初始化。
- void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram)
- {
- u32 temp=0;
- //SDRAM控制器初始化完成以后还需要按照如下顺序初始化SDRAM
- SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_CLK_ENABLE,1,0); //时钟配置使能
- delay_us(500); //至少延时200us
- SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_PALL,1,0); //对所有存储区预充电
- SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_AUTOREFRESH_MODE,8,0);//设置自刷新次数
- //配置模式寄存器,SDRAM的bit0~bit2为指定突发访问的长度,
- //bit3为指定突发访问的类型,bit4~bit6为CAS值,bit7和bit8为运行模式
- //bit9为指定的写突发模式,bit10和bit11位保留位
- temp=(u32)SDRAM_MODEREG_BURST_LENGTH_1 | //设置突发长度:1(可以是1/2/4/8)
- SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | //设置突发类型:连续(可以是连续/交错)
- SDRAM_MODEREG_CAS_LATENCY_3 | //设置CAS值:3(可以是2/3)
- SDRAM_MODEREG_OPERATING_MODE_STANDARD | //设置操作模式:0,标准模式
- SDRAM_MODEREG_WRITEBURST_MODE_SINGLE; //设置突发写模式:1,单点访问
- SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_LOAD_MODE,1,temp); //设置SDRAM的模式寄存器
-
- //刷新频率计数器(以SDCLK频率计数),计算方法:
- //COUNT=SDRAM刷新周期/行数-20=SDRAM刷新周期(us)*SDCLK频率(Mhz)/行数
- //我们使用的SDRAM刷新周期为64ms,SDCLK=216/2=108Mhz,行数为8192(2^13).
- //所以,COUNT=64*1000*108/8192-20=823
- HAL_SDRAM_ProgramRefreshRate(&SDRAM_Handler,823);
- }
main函数功能,即对外设进行初始化,并在按下key0后,测试SRAM
按下key1进,串口输出记录。
不错的分享!