探索者F407 外部SRAM(IS62WV51216)

2019-07-20 17:27发布

针对探索者板子,SRAM实验,有几个问题不能理解,所以发帖求助下各位大大:

1、原子哥的程序中,在对IS62WV51216控制引脚的初始化中,只是初始化为FSMC,硬件连接如下
//控制引脚硬件连接
BU <------------> PE1
LB <------------> PE0
OE <------------> PD4
WE <------------> PD5
CE <------------> PG10

而在对FSMC的初始化配置中:

[mw_shl_code=c,true] FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;//  这里我们使用NE3 ,也就对应BTCR[4],[5]。
  FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
  FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;  //SRAM   
  FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit  
  FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;   
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;  
  FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;        //存储器写使能
  FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;  
  FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; // 读写使用相同的时序
  FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;  
  FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;
  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming; //读写同样时序

  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置[/mw_shl_code]
问题1:
这个地方,读和写同时序。这个是怎么来的?为什么就同时序了?

问题2:
IS62WV51216控制引脚在对SARM的读操作函数和写操作函数中,都没有去特意的设置,请问这是为什么?难道是因为在FSMC初始化的时候,
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;        //存储器写使能  的效果?


[mw_shl_code=c,true]//在指定地址(WriteAddr+Bank1_SRAM3_ADDR)开始,连续写入n个字节.
//pBuffer:字节指针
//WriteAddr:要写入的地址
//n:要写入的字节数
void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
{
        for(;n!=0;n--)  
        {                                                                                    
                *(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;          
                WriteAddr++;
                pBuffer++;
        }   
}                                                                                                                                                            
//在指定地址((WriteAddr+Bank1_SRAM3_ADDR))开始,连续读出n个字节.
//pBuffer:字节指针
//ReadAddr:要读出的起始地址
//n:要写入的字节数
void FSMC_SRAM_ReadBuffer(u8* pBuffer,u32 ReadAddr,u32 n)
{
        for(;n!=0;n--)  
        {                                                                                            
                *pBuffer++=*(vu8*)(Bank1_SRAM3_ADDR+ReadAddr);   
                ReadAddr++;
        }  
} [/mw_shl_code]
问题3,SRAM的读写有什么要求还是怎么样?在写操作中*(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;在读操作中*pBuffer++=*(vu8*)(Bank1_SRAM3_ADDR+ReadAddr);这个为什么要这么写?

以上问题,还请各位大大及原子哥,帮忙说明下,感谢各位了。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
taizonglai
1楼-- · 2019-07-20 18:39
1、读写同时序的问题请看IS62WV51216的数据手册,去看他们的读和写的时序图。
2、FSMC一旦配置好,你就可以直接读写SRAM中的指定地址的数据了!不需要设置什么其他的引脚,这些是FSMC自动完成的!
3、写是对指定地址写,肯定要用指针。读是对指定地址读,也需要用到指针。采用vu8*是为了实现字节读写。更多详细的内容请自行买本C语言书籍认真学习指针章节。
huaiqiao
2楼-- · 2019-07-20 20:16
zuozhongkai 发表于 2017-1-10 10:08
1、读写同时序的问题请看IS62WV51216的数据手册,去看他们的读和写的时序图。
2、FSMC一旦配置好,你就可 ...

首先非常感谢您的回复。

我的问题不是说不知道看IS62WV51216的时序图。而是在FSMC初始化的时候,是FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming; //读写同样时序。只是想问问为什么要这样。


还有后面我知道是指针的操作,可能我没有表达清楚,这个是我的问题。
我的意思是这个读和写(我帖子中的最后一段代码),难道不按照时序走么?

一周热门 更多>