OpenEdv-开源电子网

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

f429+fmc驱动SRAM,求帮我看看问题出在哪里

[复制链接]

2

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2024-12-5
在线时间
2 小时
发表于 2024-12-10 16:05:23 | 显示全部楼层 |阅读模式
2金钱
使用F429的FMC驱动IS61WV102416BLL芯片。
现在问题是不能正常读写,摆脱大佬帮我看看问题出现在哪里。已经调了一个周了,一直没找到原因
下边是程序源码
#define Bank1_SRAM3_ADDR    ((u32)(0x68000000))


void FSMC_SRAM_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        FMC_NORSRAMInitTypeDef  FMC_NORSRAMInitStructure;
  FMC_NORSRAMTimingInitTypeDef  readWriteTiming;

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//使能PD,PE,PF,PG时钟  
  RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC,ENABLE);//使能FSMC时钟  
       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_PinSource0|GPIO_PinSource1|GPIO_PinSource2|GPIO_PinSource3|GPIO_PinSource4|GPIO_PinSource5|GPIO_PinSource12|GPIO_PinSource13|GPIO_PinSource14|GPIO_PinSource15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化
       
        GPIO_InitStructure.GPIO_Pin = GPIO_PinSource0|GPIO_PinSource1|GPIO_PinSource2|GPIO_PinSource3|GPIO_PinSource4|GPIO_PinSource5|GPIO_PinSource10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_PinSource11|GPIO_PinSource12|GPIO_PinSource13|GPIO_PinSource14|GPIO_PinSource15|GPIO_PinSource0|GPIO_PinSource1|GPIO_PinSource8|GPIO_PinSource9|GPIO_PinSource10|GPIO_PinSource4|GPIO_PinSource5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化       
//       
        GPIO_InitStructure.GPIO_Pin = GPIO_PinSource0|GPIO_PinSource1|GPIO_PinSource3|GPIO_PinSource7|GPIO_PinSource8|GPIO_PinSource9|GPIO_PinSource10|GPIO_PinSource11|GPIO_PinSource12|GPIO_PinSource13|GPIO_PinSource14|GPIO_PinSource15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化       
       
       
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FMC);       
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FMC);       
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FMC);       
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FMC);               
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FMC);       
       
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource0,GPIO_AF_FMC);               
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource1,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource3,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FMC);       
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FMC);       
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FMC);       
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FMC);       
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FMC);       
        GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FMC);       
       
        GPIO_PinAFConfig(GPIOG,GPIO_PinSource0,GPIO_AF_FMC);       
        GPIO_PinAFConfig(GPIOG,GPIO_PinSource1,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOG,GPIO_PinSource2,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOG,GPIO_PinSource3,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOG,GPIO_PinSource4,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOG,GPIO_PinSource5,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOG,GPIO_PinSource10,GPIO_AF_FMC);
       
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource0,GPIO_AF_FMC);       
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource1,GPIO_AF_FMC);       
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource2,GPIO_AF_FMC);       
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource3,GPIO_AF_FMC);       
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource4,GPIO_AF_FMC);       
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource5,GPIO_AF_FMC);               
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource13,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource14,GPIO_AF_FMC);
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource15,GPIO_AF_FMC);       
         
        readWriteTiming.FMC_AddressSetupTime =1;         //地址建立时间(ADDSET)       
  readWriteTiming.FMC_DataSetupTime = 2;                 ////数据建立时间(DATAST)               
  readWriteTiming.FMC_AddressHoldTime = 0;         //地址保持时间               
  readWriteTiming.FMC_BusTurnAroundDuration = 0;
  readWriteTiming.FMC_CLKDivision = 0;
  readWriteTiming.FMC_DataLatency = 0;
  readWriteTiming.FMC_AccessMode = FMC_AccessMode_A;         //模式A

//        WriteTiming.FMC_AddressSetupTime = 0;         //地址建立时间(ADDSET)       
//  WriteTiming.FMC_DataSetupTime = 3;                 ////数据建立时间(DATAST)               
//  WriteTiming.FMC_AddressHoldTime = 0;         //地址保持时间               
//  WriteTiming.FMC_BusTurnAroundDuration = 0;
//  WriteTiming.FMC_CLKDivision = 0;
//  WriteTiming.FMC_DataLatency = 0;
//  WriteTiming.FMC_AccessMode = FMC_AccessMode_A;         //模式A

        FMC_NORSRAMInitStructure.FMC_Bank = FMC_Bank1_NORSRAM3;
  FMC_NORSRAMInitStructure.FMC_DataAddressMux = FMC_DataAddressMux_Disable;
  FMC_NORSRAMInitStructure.FMC_MemoryType = FMC_MemoryType_SRAM;
  FMC_NORSRAMInitStructure.FMC_MemoryDataWidth = FMC_NORSRAM_MemoryDataWidth_16b;
  FMC_NORSRAMInitStructure.FMC_BurstAccessMode = FMC_BurstAccessMode_Disable;
  FMC_NORSRAMInitStructure.FMC_AsynchronousWait = FMC_AsynchronousWait_Disable;  
  FMC_NORSRAMInitStructure.FMC_WaitSignalPolarity = FMC_WaitSignalPolarity_Low;
  FMC_NORSRAMInitStructure.FMC_WrapMode = FMC_WrapMode_Disable;
  FMC_NORSRAMInitStructure.FMC_WaitSignalActive = FMC_WaitSignalActive_BeforeWaitState;
  FMC_NORSRAMInitStructure.FMC_WriteOperation = FMC_WriteOperation_Enable;
  FMC_NORSRAMInitStructure.FMC_WaitSignal = FMC_WaitSignal_Disable;
  FMC_NORSRAMInitStructure.FMC_ExtendedMode = FMC_ExtendedMode_Disable;
  FMC_NORSRAMInitStructure.FMC_WriteBurst = FMC_WriteBurst_Disable;
  FMC_NORSRAMInitStructure.FMC_ContinousClock = FMC_CClock_SyncOnly;
  FMC_NORSRAMInitStructure.FMC_ReadWriteTimingStruct = &readWriteTiming;
  FMC_NORSRAMInitStructure.FMC_WriteTimingStruct = &readWriteTiming;

  FMC_NORSRAMInit(&FMC_NORSRAMInitStructure);  //初始化FSMC配置

        FMC_NORSRAMCmd(FMC_Bank1_NORSRAM3, ENABLE);  // 使能BANK1区域3       
}

//在指定地址(WriteAddr+Bank1_SRAM3_ADDR)开始,连续写入n个字节.
//pBuffer:字节指针
//WriteAddr:要写入的地址
//n:要写入的字节数
void FMC_SRAM_WriteBuffer(u16* pBuffer,u32 WriteAddr,u32 n)
{
        for(;n!=0;n--)  
        {                                                                                    
                *(vu16*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer++;          
                WriteAddr+=2;
        }   
}                                                                                                                                                            
//在指定地址((WriteAddr+Bank1_SRAM3_ADDR))开始,连续读出n个字节.
//pBuffer:字节指针
//ReadAddr:要读出的起始地址
//n:要写入的字节数
void FMC_SRAM_ReadBuffer(u16* pBuffer,u32 ReadAddr,u32 n)
{
        for(;n!=0;n--)  
        {
                *pBuffer++=*(vu16*)(Bank1_SRAM3_ADDR+ReadAddr);   
                ReadAddr+=2;
        }  
}



//外部内存测试(最大支持2M字节内存测试)            
void fmc_sram_test(void)
{  
        u32 i=0;            
        u16 temp=0;          
                                    

        for(i=0;i<1024*1024*2*2;i+=2048)
        {
                FMC_SRAM_WriteBuffer(&temp,i,1);
                temp++;
        }
        temp = 0;
        //依次读出之前写入的数据
        for(i=0;i<1024*1024*2*2;i+=2048)
        {
          FMC_SRAM_ReadBuffer(&temp,i,1);                     
                printf("%d\r\n",temp);
        }               
}       

下面是芯片时序手册


程序执行结果










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

使用道具 举报

17

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
387
金钱
387
注册时间
2023-5-29
在线时间
133 小时
发表于 2024-12-11 08:49:59 | 显示全部楼层
加载不出你的图片,代码,根据芯片手册调一下参数,参数不太对,大致一看
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-11 05:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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