OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3187|回复: 2

STM32F767驱动SDRAM问题求助

[复制链接]

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2017-7-4
在线时间
21 小时
发表于 2019-10-31 17:58:40 | 显示全部楼层 |阅读模式
10金钱
SDRAM配置如下
/****************************************************************************************************************************
功  能:SDRAM初始化
参  数:无
返回值:无
****************************************************************************************************************************/
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_2;                                 //读通道延时

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

}
/****************************************************************************************************************************
功  能:SDRAM初始化序列
参  数:hsdram:SDRAM句柄
返回值:无
****************************************************************************************************************************/
void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram)
{
        u32 temp=0;
    //SDRAM控制器初始化完成以后还需要按照如下顺序初始化SDRAM
    SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_CLK_ENABLE,1,0);                                            //时钟配置使能
    yanshi_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);       
}
/****************************************************************************************************************************
功  能:SDRAM底层驱动,引脚配置,时钟使能 此函数会被HAL_SDRAM_Init()调用
参  数:hsdram:SDRAM句柄
返回值:无
****************************************************************************************************************************/
void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef *hsdram){
    GPIO_InitTypeDef GPIO_InitStruct = {0};
               
    __HAL_RCC_FMC_CLK_ENABLE();                                                                //使能FMC时钟
          __HAL_RCC_GPIOA_CLK_ENABLE();                                                              //使能GPIOA时钟
          __HAL_RCC_GPIOB_CLK_ENABLE();                                                              //使能GPIOB时钟
    __HAL_RCC_GPIOC_CLK_ENABLE();                                                              //使能GPIOC时钟
    __HAL_RCC_GPIOD_CLK_ENABLE();                                                              //使能GPIOD时钟
    __HAL_RCC_GPIOE_CLK_ENABLE();                                                              //使能GPIOE时钟
    __HAL_RCC_GPIOF_CLK_ENABLE();                                                              //使能GPIOF时钟
    __HAL_RCC_GPIOG_CLK_ENABLE();                                                              //使能GPIOG时钟

                GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_PULLUP;
                GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
                GPIO_InitStruct.Alternate = GPIO_AF12_FMC;

                HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

                /* GPIO初始化 */
                GPIO_InitStruct.Pin = GPIO_PIN_7;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_PULLUP;
                GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
                GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
                HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

                /* GPIO初始化 */
                GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_PULLUP;
                GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
                GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
                HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

                /* GPIO初始化 */
                GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_15|GPIO_PIN_8;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_PULLUP;
                GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
                GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
                HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

                /* GPIO初始化 */
                GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_PULLUP;
                GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
                GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
                HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

                /* GPIO_InitStruct */
                GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_PULLUP;
                GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
                GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
                HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}


extern SDRAM_HandleTypeDef SDRAM_Handler;//SDRAM句柄
#define Bank5_SDRAM_ADDR    ((u32)(0XC0000000)) //SDRAM开始地址
#define Bank1_SDRAM_ADDR    ((u32)(0X60000000)) //SDRAM开始地址

//SDRAM配置参数
#define SDRAM_MODEREG_BURST_LENGTH_1             ((u16)0x0000)
#define SDRAM_MODEREG_BURST_LENGTH_2             ((u16)0x0001)
#define SDRAM_MODEREG_BURST_LENGTH_4             ((u16)0x0002)
#define SDRAM_MODEREG_BURST_LENGTH_8             ((u16)0x0004)
#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL      ((u16)0x0000)
#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED     ((u16)0x0008)
#define SDRAM_MODEREG_CAS_LATENCY_2              ((u16)0x0020)
#define SDRAM_MODEREG_CAS_LATENCY_3              ((u16)0x0030)
#define SDRAM_MODEREG_OPERATING_MODE_STANDARD    ((u16)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((u16)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE     ((u16)0x0200)


IO连接如下
  /** FMC GPIO Configuration  
  PF0   ------> FMC_A0
  PF1   ------> FMC_A1
  PF2   ------> FMC_A2
  PF3   ------> FMC_A3
  PF4   ------> FMC_A4
  PF5   ------> FMC_A5
  PA7   ------> FMC_SDNWE
  PC4   ------> FMC_SDNE0
  PC5   ------> FMC_SDCKE0
  PF11   ------> FMC_SDNRAS
  PF12   ------> FMC_A6
  PF13   ------> FMC_A7
  PF14   ------> FMC_A8
  PF15   ------> FMC_A9
  PG0   ------> FMC_A10
  PG1   ------> FMC_A11
  PE7   ------> FMC_D4
  PE8   ------> FMC_D5
  PE9   ------> FMC_D6
  PE10   ------> FMC_D7
  PE11   ------> FMC_D8
  PE12   ------> FMC_D9
  PE13   ------> FMC_D10
  PE14   ------> FMC_D11
  PE15   ------> FMC_D12
  PD8   ------> FMC_D13
  PD9   ------> FMC_D14
  PD10   ------> FMC_D15
  PD14   ------> FMC_D0
  PD15   ------> FMC_D1
  PG2   ------> FMC_A12
  PG4   ------> FMC_BA0
  PG5   ------> FMC_BA1
  PG8   ------> FMC_SDCLK
  PD0   ------> FMC_D2
  PD1   ------> FMC_D3
  PG15   ------> FMC_SDNCAS
  PE0   ------> FMC_NBL0
  PE1   ------> FMC_NBL1


//SDRAM内存测试            
void fsmc_sdram_test(u16 x,u16 y)
{  
        u32 i=0;            
        u32 temp=0x0000;          
        u32 sval=0;        //在地址0读到的数据                                            
//          LCD_ShowString(x,y,180,y+16,16,"Ex Memory Test:    0KB ");
        //每隔16K字节,写入一个数据,总共写入2048个数据,刚好是32M字节
        for(i=0;i<32*1024*1024;i+=16*1024)
        {
                *(vu32*)(Bank5_SDRAM_ADDR+i)=temp;
                temp++;
//                printf("SDRAM WRIT:%d\r\n",(u16)temp);//打印SDRAM容量
        }
       
        //依次读出之前写入的数据,进行校验                  
        for(i=0;i<32*1024*1024;i+=16*1024)
        {       
                  sval=*(vu32*)(Bank5_SDRAM_ADDR+i);
//                if(i==0)sval=temp;
//        else if(temp<=sval)break;//后面读出的数据一定要比第一次读到的数据大.                             
//                LCD_ShowxNum(x+15*8,y,(u16)(temp-sval+1)*16,5,16,0);        //显示内存容量  
//                printf("SDRAM Capacity:%dKB\r\n",(u16)(temp-sval+1)*16);//打印SDRAM容量
                printf("SDRAM Capacity:%d\r\n",(u16)sval);//打印SDRAM容量
               
//                u8 ddd[1];
//                 ddd[0]=sval;
//                DMA_USART5_Write(ddd,1);
        }
}       


现象是若配置FMC IO接口为上拉读出数据为65535 配置下拉全为0  上下拉不配置时读出的是乱码  上拉时把FMC数据线短接到地读出对应位的数据会变化   不知道是哪的问题求大神提示下




硬件接口

硬件接口
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-11-1 02:04:29 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2017-7-4
在线时间
21 小时
 楼主| 发表于 2019-11-1 08:56:48 | 显示全部楼层
正点原子 发表于 2019-11-1 02:04
参考我们开发板做吧

是参考你们的开发板做的啊!就换了几个IO 这是什么情况造成的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 01:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表