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

SDRAM(FMC)(STM32CubeMx)

时间:10-02 整理:3721RD 点击:
SDRAM(Synchronous Dynamic Random Access Memory)同步动态随机存取存储器
·同步是指存储器工作需要同步时钟,内部命令的发送与数据传输都以它为基准
·动态是指存储阵列需要不断的刷新来保证数据不丢失
·随机存取是指存储器的内容可以以任意顺序访问,而不管前一次访问的是哪一个位置

在STM32CubeMx 的SDRAM的配置,相对的简单




动态生成后,并不是成功,还有一个关键的步骤,初始化序列,这样SDRAM才能正常使用

  1. /发送SDRAM初始化序列
  2. void SDRAM_Initialization_Sequence(void)
  3. {
  4.         uint32_t temp=0;
  5.         //SDRAM控制器初始化完成以后还需要按照如下顺序初始化SDRAM
  6.         SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_CLK_ENABLE,1,0); //时钟配置使能
  7.         delay_us(500);                                  //至少延时200us
  8.         SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_PALL,1,0);       //对所有存储区预充电
  9.         SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_AUTOREFRESH_MODE,8,0);//设置自刷新次数
  10.         //配置模式寄存器,SDRAM的bit0~bit2为指定突发访问的长度,
  11.         //bit3为指定突发访问的类型,bit4~bit6为CAS值,bit7和bit8为运行模式
  12.         //bit9为指定的写突发模式,bit10和bit11位保留位
  13.         temp=(uint32_t)(SDRAM_MODEREG_BURST_LENGTH_1|            /* 设置突发长度:1(可以是1/2/4/8)      */
  14.              SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |            /* 设置突发类型:连续(可以是连续/交错) */
  15.              SDRAM_MODEREG_CAS_LATENCY_3           |            /* 设置CAS值:3(可以是2/3)             */
  16.              SDRAM_MODEREG_OPERATING_MODE_STANDARD |        /* 设置操作模式:0,标准模式            */
  17.              SDRAM_MODEREG_WRITEBURST_MODE_SINGLE);         /* 设置突发写模式:1,单点访问          */
  18.         SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_LOAD_MODE,1,temp);   /* 设置SDRAM的模式寄存器 */

  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(&hsdram1,823);

  24. }

复制代码


具体上的操作,实际上与RAM没有多大的具别,具体操作如下:

  1. //在指定地址(WriteAddr+Bank5_SDRAM_ADDR)开始,连续写入n个字节.
  2. //pBuffer:字节指针
  3. //WriteAddr:要写入的地址
  4. //n:要写入的字节数
  5. void FMC_SDRAM_WriteBuffer(uint8_t *pBuffer,uint32_t WriteAddr,uint32_t n)
  6. {
  7.         for(; n!=0; n--)
  8.         {
  9.                 *(uint8_t*)(Bank5_SDRAM_ADDR+WriteAddr)=*pBuffer;
  10.                 WriteAddr++;
  11.                 pBuffer++;
  12.         }
  13. }

  14. //在指定地址((WriteAddr+Bank5_SDRAM_ADDR))开始,连续读出n个字节.
  15. //pBuffer:字节指针
  16. //ReadAddr:要读出的起始地址
  17. //n:要写入的字节数
  18. void FMC_SDRAM_ReadBuffer(uint8_t *pBuffer,uint32_t ReadAddr,uint32_t n)
  19. {
  20.         for(; n!=0; n--)
  21.         {
  22.                 *pBuffer++=*(uint8_t*)(Bank5_SDRAM_ADDR+ReadAddr);
  23.                 ReadAddr++;
  24.         }
  25. }

复制代码


如果想合理的应用 SDRAM就上引用堆操作,动态申请和释放RAM,malloc free等操作,以后再来介绍




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

网站地图

Top