AnsweredAssumed Answered

STM32F4, FSMC copies same data each 2 MB on external SRAM

Question asked by kotev.kostadin on Sep 8, 2014
Latest reply on Feb 27, 2017 by patel.vishal.006
Hello there,

I am using IS61WV102416BLL external SRAM module. I got it working with a STM32F4 microcontroller. The problem now is that every time I write some data to the SRAM it is copied to an address with 2 MB Offset, i.e. if I write something on address 0x60000000 it is copied automatically on addresses 0x60200000. 0x60400000, 0x60800000 and so on. Is it possible or it is just the debug mode, that cannot display data correctly in the viewer? In that way I can only use 2 MB instead of the full 16 MB.

Does anyone have a clue why is this happening?

Thank you in advance!

Best regards,
Kostadin

P.S. My init routine for the SRAM (using 20 address lines and 16 bit data width):

001.void SRAM_Init(void){
002.     
003.    GPIO_InitTypeDef GPIO_InitStructure;
004.    FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
005.    FSMC_NORSRAMTimingInitTypeDef FSMC_NORSRAMTimingInitStructure;
006.     
007.    /* Enable GPIO clock */
008.    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE |
009.                                                    RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE);
010.     
011.    /* Enable FSMC clock */
012.    RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
013.     
014.    /*------------- begining of gpio init -------------*/
015.    /* GPIOD */
016.    GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
017.    GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
018.    GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
019.    GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
020.    GPIO_PinAFConfig(GPIOD, GPIO_PinSource7, GPIO_AF_FSMC);
021.    GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);
022.    GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);
023.    GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);
024.    GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FSMC);
025.    GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_FSMC);
026.    GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_FSMC);
027.    GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
028.    GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);
029.     
030.    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 |
031.                                                                GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_8 |
032.                                                                GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |
033.                                                                GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
034.                                                                GPIO_Pin_15;
035.     
036.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
037.    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
038.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
039.    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
040.     
041.    GPIO_Init(GPIOD, &GPIO_InitStructure);
042.     
043.    /* GPIOE */
044.    GPIO_PinAFConfig(GPIOE, GPIO_PinSource0, GPIO_AF_FSMC);
045.    GPIO_PinAFConfig(GPIOE, GPIO_PinSource1, GPIO_AF_FSMC);
046.    GPIO_PinAFConfig(GPIOE, GPIO_PinSource3, GPIO_AF_FSMC);
047.    GPIO_PinAFConfig(GPIOE, GPIO_PinSource7, GPIO_AF_FSMC);
048.    GPIO_PinAFConfig(GPIOE, GPIO_PinSource8, GPIO_AF_FSMC);
049.    GPIO_PinAFConfig(GPIOE, GPIO_PinSource9, GPIO_AF_FSMC);
050.    GPIO_PinAFConfig(GPIOE, GPIO_PinSource10, GPIO_AF_FSMC);
051.    GPIO_PinAFConfig(GPIOE, GPIO_PinSource11, GPIO_AF_FSMC);
052.    GPIO_PinAFConfig(GPIOE, GPIO_PinSource12, GPIO_AF_FSMC);
053.    GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_FSMC);
054.    GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_FSMC);
055.    GPIO_PinAFConfig(GPIOE, GPIO_PinSource15, GPIO_AF_FSMC);
056.     
057.    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3 |
058.                                                                GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 |
059.                                                                GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 |
060.                                                                GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
061.                                                                 
062.    GPIO_Init(GPIOE, &GPIO_InitStructure);
063.     
064.    /* GPIOF */
065.    GPIO_PinAFConfig(GPIOF, GPIO_PinSource0, GPIO_AF_FSMC);
066.    GPIO_PinAFConfig(GPIOF, GPIO_PinSource1, GPIO_AF_FSMC);
067.    GPIO_PinAFConfig(GPIOF, GPIO_PinSource2, GPIO_AF_FSMC);
068.    GPIO_PinAFConfig(GPIOF, GPIO_PinSource3, GPIO_AF_FSMC);
069.    GPIO_PinAFConfig(GPIOF, GPIO_PinSource4, GPIO_AF_FSMC);
070.    GPIO_PinAFConfig(GPIOF, GPIO_PinSource5, GPIO_AF_FSMC);
071.    GPIO_PinAFConfig(GPIOF, GPIO_PinSource12, GPIO_AF_FSMC);
072.    GPIO_PinAFConfig(GPIOF, GPIO_PinSource13, GPIO_AF_FSMC);
073.    GPIO_PinAFConfig(GPIOF, GPIO_PinSource14, GPIO_AF_FSMC);
074.    GPIO_PinAFConfig(GPIOF, GPIO_PinSource15, GPIO_AF_FSMC);
075.     
076.    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |
077.                                                                GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |
078.                                                                GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
079.                                                                GPIO_Pin_15;
080.                                                                 
081.    GPIO_Init(GPIOF, &GPIO_InitStructure);
082.     
083.    /* GPIOG */
084.    GPIO_PinAFConfig(GPIOG, GPIO_PinSource0, GPIO_AF_FSMC);
085.    GPIO_PinAFConfig(GPIOG, GPIO_PinSource1, GPIO_AF_FSMC);
086.    GPIO_PinAFConfig(GPIOG, GPIO_PinSource2, GPIO_AF_FSMC);
087.    GPIO_PinAFConfig(GPIOG, GPIO_PinSource3, GPIO_AF_FSMC);
088.    GPIO_PinAFConfig(GPIOG, GPIO_PinSource4, GPIO_AF_FSMC);
089.    GPIO_PinAFConfig(GPIOG, GPIO_PinSource5, GPIO_AF_FSMC);
090.     
091.    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |
092.                                                                GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
093.     
094.    GPIO_Init(GPIOG, &GPIO_InitStructure);
095.    /*------------- end of gpio init -------------*/
096.     
097.    /*------------- Initialize FSMC controller -------------*/
098.    FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_A;
099.    FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime = 0;
100.    FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime = 0;
101.    FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime = 1;
102.    // the next 3 params do not matter in case of an asynchronous SRAM
103.    FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration = 0;
104.    FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision = 0;
105.    FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency = 0;
106.     
107.    FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait =
108.                                                                                                    FSMC_AsynchronousWait_Disable;
109.    FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
110.    FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
111.    FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
112.    //different timings for reading and writing
113.    FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable;
114.    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
115.    FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
116.    FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct =
117.                                                                                            &FSMC_NORSRAMTimingInitStructure;
118.    FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
119.    FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive =
120.                                                                                    FSMC_WaitSignalActive_BeforeWaitState;
121.    FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity =
122.                                                                                                        FSMC_WaitSignalPolarity_Low;
123.    FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
124.    FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
125.    FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
126.    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct =
127.                                                                                             &FSMC_NORSRAMTimingInitStructure;
128.     
129.    FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
130.     
131.    /* Enable the SRAM bank1  */
132.    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
133.    /*------------- end of FSMC init -------------*/
134.}

Outcomes