SDRAM(Synchronous Dynamic Random Access Memory)同步动态随机存取存储器
·同步是指存储器工作需要同步时钟,内部命令的发送与数据传输都以它为基准
·动态是指存储阵列需要不断的刷新来保证数据不丢失
·随机存取是指存储器的内容可以以任意顺序访问,而不管前一次访问的是哪一个位置
在STM32CubeMx 的SDRAM的配置,相对的简单
动态生成后,并不是成功,还有一个关键的步骤,初始化序列,这样SDRAM才能正常使用
- /发送SDRAM初始化序列
- void SDRAM_Initialization_Sequence(void)
- {
- uint32_t 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=(uint32_t)(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(&hsdram1,823);
- }
复制代码
具体上的操作,实际上与RAM没有多大的具别,具体操作如下:
- //在指定地址(WriteAddr+Bank5_SDRAM_ADDR)开始,连续写入n个字节.
- //pBuffer:字节指针
- //WriteAddr:要写入的地址
- //n:要写入的字节数
- void FMC_SDRAM_WriteBuffer(uint8_t *pBuffer,uint32_t WriteAddr,uint32_t n)
- {
- for(; n!=0; n--)
- {
- *(uint8_t*)(Bank5_SDRAM_ADDR+WriteAddr)=*pBuffer;
- WriteAddr++;
- pBuffer++;
- }
- }
- //在指定地址((WriteAddr+Bank5_SDRAM_ADDR))开始,连续读出n个字节.
- //pBuffer:字节指针
- //ReadAddr:要读出的起始地址
- //n:要写入的字节数
- void FMC_SDRAM_ReadBuffer(uint8_t *pBuffer,uint32_t ReadAddr,uint32_t n)
- {
- for(; n!=0; n--)
- {
- *pBuffer++=*(uint8_t*)(Bank5_SDRAM_ADDR+ReadAddr);
- ReadAddr++;
- }
- }
复制代码
如果想合理的应用 SDRAM就上引用堆操作,动态申请和释放RAM,malloc free等操作,以后再来介绍
|