你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f207vet6 外扩SRAM的问题

[复制链接]
xuyejin 提问时间:2016-5-14 16:07 /
各位大侠
              你们好!

             我在使用stm32f207vet6 外扩SRAM的时候,碰到问题啦,
    外挂一个IS61WV25616,CPU和RAM之间用CPLD链接,A15~A0 使用FSMC_NL的下降沿锁存
使用MDK 仿真,在memory窗口改变数据是好的,配置如下

void FSMC_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
        FSMC_NORSRAMTimingInitTypeDef  Timing_read, Timing_write;

        //-- Enable FSMC clock---------------------------------
        RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);

        // Configure GPIOB pins :
        //        PB0 nc  in PP_no                                        PB1 nc  in PP_no
        //        PB2 ETH_RST out PP_down                        PB3 SPISCK  SPI1
        //        PB4 SPIMISO  SPI1                                PB5 SPIMOSI  SPI1
        //        PB6 nc  in PP_no                                        PB7 FSMC_NL AF PP_no        
        //        PB8 nc in PP_no                                        PB9 FMQ  AF PP_no
        //        PB10 nc in PP_no                                        PB11 ETH_TX_EN AF PP_no
        //        PB12 ETH_TXD_0 AF PP_no                        PB13 ETH_TXD_1 AF PP_no
        //        PB14 Device_DM AF PP_no                        PB15 Device_DP AF PP_no
        //
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;//FSMC_NL
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOB, &GPIO_InitStruct);

        GPIO_PinAFConfig(GPIOB,        GPIO_PinSource7,GPIO_AF_FSMC);

         // Configure GPIOD pins :
         //        PD0 FSMC_D2 AF PP_no                                PD1 FSMC_D3 AF PP_no
        //        PD2 T3_ETR AF PP_no                                PD3 FSMC_CLK AF PP_no
        //        PD4 FSMC_NOE AF PP_no                        PD5 FSMC_NWE AF PP_no
        //        PD6 nc in                                                        PD7 FSMC_NE1  AF PP_no
        //        PD8 FSMC_D13 AF PP_no                        PD9 FSMC_D14 AF PP_no
        //        PD10 FSMC_D15 AF PP_no                        PD11 FSMC_A16 AF PP_no
        //        PD12 FSMC_A17 AF PP_no                        PD13 A18 out PP_up
        //        PD14 FSMC_D0 AF PP_no                        PD15  FSMC_D1 AF PP_no
        //
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8
                                                        |GPIO_Pin_9|GPIO_Pin_10        |GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_14 |GPIO_Pin_15;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOD, &GPIO_InitStruct);

        GPIO_PinAFConfig(GPIOD,        GPIO_PinSource0,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD,        GPIO_PinSource1,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD,        GPIO_PinSource3,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD,        GPIO_PinSource4,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD,        GPIO_PinSource5,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD,        GPIO_PinSource7,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD,        GPIO_PinSource8,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD,        GPIO_PinSource9,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD,        GPIO_PinSource10,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD,        GPIO_PinSource11,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD,        GPIO_PinSource12,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD,        GPIO_PinSource14,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD,        GPIO_PinSource15,GPIO_AF_FSMC);

        GPIO_InitStruct.GPIO_Pin = FSMC_Addr18;//PD13 A18 out PP_up
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
        GPIO_Init(GPIOD, &GPIO_InitStruct);
        GPIO_ResetBits(GPIOD, FSMC_Addr18);
        
        // Configure GPIOE pins :
        //        PE0 FSMC_NBL0  AF PP_no                        PE1 FSMC_NBL1  AF PP_no
        //        PE2         UPDATE out PP_down                        PE3 PLL_LOCKED out PP_up
        //        PE4 PLL_RST  out         PP_up                        PE5 OUT_FAULT1 out PP_up
        //        PE6 CS_FPGA out         PP_down                        PE7 FSMC_D4 AF PP_no
        //        PE8 FSMC_D5 AF PP_no                                PE9 FSMC_D6 AF PP_no
        //        PE10 FSMC_D7 AF PP_no                        PE11 FSMC_D8 AF PP_no
        //        PE12 FSMC_D9 AF PP_no                        PE13 FSMC_D10 AF PP_no
        //        PE14 FSMC_D11 AF PP_no                        PE15 FSMC_D12 AF PP_no
        //
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|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_InitStruct.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOE, &GPIO_InitStruct);

        GPIO_PinAFConfig(GPIOE,        GPIO_PinSource0,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE,        GPIO_PinSource1,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE,        GPIO_PinSource7,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE,        GPIO_PinSource8,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE,        GPIO_PinSource9,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE,        GPIO_PinSource10,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE,        GPIO_PinSource11,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE,        GPIO_PinSource12,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE,        GPIO_PinSource13,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE,        GPIO_PinSource14,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE,        GPIO_PinSource15,GPIO_AF_FSMC);

        //-- FSMC Configuration --------------------------------
        //------------------ SRAM Bank 1 ---------------------
        //-- FSMC_Bank1_NORSRAM1 configuration----------------
        Timing_read.FSMC_AddressSetupTime = 3;
        Timing_read.FSMC_AddressHoldTime = 0;  
        Timing_read.FSMC_DataSetupTime = 3;
        Timing_read.FSMC_BusTurnAroundDuration =3;
        Timing_read.FSMC_CLKDivision = 0;
        Timing_read.FSMC_DataLatency = 0;
        Timing_read.FSMC_AccessMode = FSMC_AccessMode_C;   

        Timing_write.FSMC_AddressSetupTime = 3;           
        Timing_write.FSMC_AddressHoldTime = 0;  
        Timing_write.FSMC_DataSetupTime = 3;         
        Timing_write.FSMC_BusTurnAroundDuration = 3;
        Timing_write.FSMC_CLKDivision = 0;
        Timing_write.FSMC_DataLatency = 0;  
        Timing_write.FSMC_AccessMode = FSMC_AccessMode_C;

        //-- SRAM configuration --------------------------------
        //   LCD configured as follow:
        //      - Data/Address MUX = Enable
        //      - Memory Type = SRAM
        //      - Data Width = 16bit
           //      - Extended Mode = Enable
        //      - Asynchronous Wait = Disable

        FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Enable;
        FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
        FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
        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_Enable;
        FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &Timing_read;
        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &Timing_write;

        FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);   

        //---BANK 1 (of NOR/SRAM Bank 1~4) is enabled ----------
        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}


如果使用下面的程序,往RAM中写数据,在memory窗口看的话是乱七八糟
int main( void )  
{
        u16 *ptr;        
        u16 i,num;        
        
        GPIO_Config();   
        FSMC_Config();
        
        
        while(1)
        {
                ptr = (u16 *)&LCD_Disp_Buff[0];
               
                for(i=0;i<65535;i++)
                {
                        *ptr = i;
                        //num = *ptr;
                        ptr++;
                        
                }
        }
}


这个到底是怎么回事情?还望各位大侠不吝赐教



收藏 1 评论7 发布时间:2016-5-14 16:07

举报

7个回答
xuyejin 回答时间:2016-5-15 09:05:03
感觉是地址锁存不对,
换成模式D addrset=2 addrhold=1 dataset=2  FSMC_NL上升沿锁存,还是不对,
按照我的程序,地址应该不动才对,始终应该是一个电平,
可是我在锁存出来的地址线A15~A0上面怎么看到电平波动?
这到底是怎么回事情?
xuyejin 回答时间:2016-5-15 09:10:20
        //-- FSMC Configuration --------------------------------
        //------------------ SRAM Bank 1 ---------------------
        //-- FSMC_Bank1_NORSRAM1 configuration----------------
        Timing_read.FSMC_AddressSetupTime = 2;
        Timing_read.FSMC_AddressHoldTime = 1;  
        Timing_read.FSMC_DataSetupTime = 2;
        Timing_read.FSMC_BusTurnAroundDuration =2;
        Timing_read.FSMC_CLKDivision = 0;
        Timing_read.FSMC_DataLatency = 0;
        Timing_read.FSMC_AccessMode = FSMC_AccessMode_D;   

        Timing_write.FSMC_AddressSetupTime = 2;           
        Timing_write.FSMC_AddressHoldTime = 1;  
        Timing_write.FSMC_DataSetupTime = 2;          
        Timing_write.FSMC_BusTurnAroundDuration = 2;
        Timing_write.FSMC_CLKDivision = 0;
        Timing_write.FSMC_DataLatency = 0;  
        Timing_write.FSMC_AccessMode = FSMC_AccessMode_D;
  
        //-- SRAM configuration --------------------------------
        //   LCD configured as follow:
        //      - Data/Address MUX = Enable
        //      - Memory Type = SRAM
        //      - Data Width = 16bit
           //      - Extended Mode = Enable
        //      - Asynchronous Wait = Disable

        FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Enable;
        FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
        FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
        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_Enable;
        FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &Timing_read;
        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &Timing_write;

        FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);   

        //---BANK 1 (of NOR/SRAM Bank 1~4) is enabled ----------
        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
xuyejin 回答时间:2016-5-15 09:32:17
看了CPU出来的时序,好像在ADDRSET段,data线上面的数据没变,应该出来始终为0才对
xuyejin 回答时间:2016-5-15 09:32:58
看起来好像就是上次输出的数据,而不是地址,这到底是怎么回事情?
xuyejin 回答时间:2016-5-15 10:00:49
使用模式D,
       FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Enable;
        FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;
        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
        FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
        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_Enable;
        FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &Timing_read;
        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &Timing_write;

数据线上面,好像还是没有地址项
xuyejin 回答时间:2016-5-15 10:20:53
解决问题啦,应该使用RM0033.pdf 1267页的
Muxed mode - multiplexed asynchronous access to NOR Flash memory
就可以解决啦 给大家共享下
        //-- FSMC_Bank1_NORSRAM1 configuration----------------
        Timing_read.FSMC_AddressSetupTime = 2;
        Timing_read.FSMC_AddressHoldTime = 1;  
        Timing_read.FSMC_DataSetupTime = 3;
        Timing_read.FSMC_BusTurnAroundDuration =2;
        Timing_read.FSMC_CLKDivision = 0;
        Timing_read.FSMC_DataLatency = 0;
        Timing_read.FSMC_AccessMode = FSMC_AccessMode_D;   

        Timing_write.FSMC_AddressSetupTime = 2;           
        Timing_write.FSMC_AddressHoldTime = 1;  
        Timing_write.FSMC_DataSetupTime = 3;          
        Timing_write.FSMC_BusTurnAroundDuration = 2;
        Timing_write.FSMC_CLKDivision = 0;
        Timing_write.FSMC_DataLatency = 0;  
        Timing_write.FSMC_AccessMode = FSMC_AccessMode_D;
  
        //-- SRAM configuration --------------------------------
        //   LCD configured as follow:
        //      - Data/Address MUX = Enable
        //      - Memory Type = SRAM
        //      - Data Width = 16bit
           //      - Extended Mode = Enable
        //      - Asynchronous Wait = Disable

        FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Enable;
        FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;
        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
        FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
        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 = &Timing_read;
        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &Timing_write;

        FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);   

        //---BANK 1 (of NOR/SRAM Bank 1~4) is enabled ----------
        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
PseudoSRAM 回答时间:2016-12-6 23:02:38
外扩SRAM,可以选择SQPI PSRAM,通过SPI或者Quad SPI接口来实现,在QSPI QCLK=60MHz情况下,memory map with DMA或者memory map with DMA2D,读取速度约为28MB/s (实测速度, STM32F746, HCLK 180MH在)

SOP-8封装,可以提供4MB的大内存,体积很小,价格比SRAM便宜很多

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版