AnsweredAssumed Answered

STM32F429 Discovery Board SDRAM

Question asked by stefan.merfu on Jan 27, 2015
Good evening, i am a beginner in the stm32f microcontroller and i am trying to learn how to use the SDRAM embedded on the discovery board.I made a function which initialize the sdram gpio and timing characteristics but when i used the debugger the data is lost after a while.Perhaps somebody could explain me why. Thank you in advance !

001.void SDRAMInit(void)
002.{
003.    /*-- GPIOs Configuration -----------------------------------------------------*/
004./*
005. +-------------------+--------------------+--------------------+--------------------+
006. +                       SDRAM pins assignment                                      +
007. +-------------------+--------------------+--------------------+--------------------+
008. | PD0  <-> FMC_D2   | PE0  <-> FMC_NBL0  | PF0  <-> FMC_A0    | PG0  <-> FMC_A10   |
009. | PD1  <-> FMC_D3   | PE1  <-> FMC_NBL1  | PF1  <-> FMC_A1    | PG1  <-> FMC_A11   |
010. | PD8  <-> FMC_D13  | PE7  <-> FMC_D4    | PF2  <-> FMC_A2    | PG4  <-> FMC_BA0   |
011. | PD9  <-> FMC_D14  | PE8  <-> FMC_D5    | PF3  <-> FMC_A3    | PG5  <-> FMC_BA1   |
012. | PD10 <-> FMC_D15  | PE9  <-> FMC_D6    | PF4  <-> FMC_A4    | PG8  <-> FMC_SDCLK |
013. | PD14 <-> FMC_D0   | PE10 <-> FMC_D7    | PF5  <-> FMC_A5    | PG15 <-> FMC_NCAS  |
014. | PD15 <-> FMC_D1   | PE11 <-> FMC_D8    | PF11 <-> FMC_NRAS  |--------------------+
015. +-------------------| PE12 <-> FMC_D9    | PF12 <-> FMC_A6    |
016.                     | PE13 <-> FMC_D10   | PF13 <-> FMC_A7    |
017.                     | PE14 <-> FMC_D11   | PF14 <-> FMC_A8    |
018.                     | PE15 <-> FMC_D12   | PF15 <-> FMC_A9    |
019. +-------------------+--------------------+--------------------+
020. | PB5 <-> FMC_SDCKE1|
021. | PB6 <-> FMC_SDNE1 |
022. | PC0 <-> FMC_SDNWE |
023. +-------------------+
024.  
025.*/
026.    GPIO_InitTypeDef GPIO_InitStruct;
027.    FMC_SDRAMTimingInitTypeDef FMC_SDRAMTimingStruct;
028.    FMC_SDRAMCommandTypeDef FMC_SDRAMCommandStruct;
029.    FMC_SDRAMInitTypeDef FMC_SDRAMInitStruct;
030.     
031.    volatile uint32_t ptr;
032.     
033.    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG,ENABLE);
034.    RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC,ENABLE);
035.     
036.    // GPIOB //
037.     
038.    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
039.    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
040.    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
041.    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
042.    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
043.    GPIO_Init(GPIOB,&GPIO_InitStruct);
044.     
045.    GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_FMC);
046.    GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_FMC);
047.     
048.    // GPIOD //
049.     
050.    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
051.    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
052.    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
053.    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
054.    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
055.    GPIO_Init(GPIOD,&GPIO_InitStruct);
056.     
057.    GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FMC);
058.    GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FMC);
059.    GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FMC);
060.    GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FMC);
061.    GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FMC);
062.    GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FMC);
063.    GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FMC);
064.     
065.    // GPIOE //
066.     
067.    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
068.    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
069.    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
070.    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
071.    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
072.    GPIO_Init(GPIOE,&GPIO_InitStruct);
073.     
074.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource0,GPIO_AF_FMC);
075.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource1,GPIO_AF_FMC);
076.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource2,GPIO_AF_FMC);
077.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource3,GPIO_AF_FMC);
078.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource4,GPIO_AF_FMC);
079.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource5,GPIO_AF_FMC);
080.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource6,GPIO_AF_FMC);
081.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FMC);
082.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FMC);
083.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FMC);
084.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FMC);
085.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FMC);
086.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FMC);
087.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FMC);
088.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FMC);
089.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FMC);
090.     
091.    // GPIOF //
092.     
093.    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
094.    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
095.    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
096.    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
097.    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
098.    GPIO_Init(GPIOF,&GPIO_InitStruct);
099.     
100.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource0,GPIO_AF_FMC);
101.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource1,GPIO_AF_FMC);
102.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource2,GPIO_AF_FMC);
103.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource3,GPIO_AF_FMC);
104.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource4,GPIO_AF_FMC);
105.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource5,GPIO_AF_FMC);
106.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource6,GPIO_AF_FMC);
107.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FMC);
108.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FMC);
109.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FMC);
110.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FMC);
111.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FMC);
112.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FMC);
113.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FMC);
114.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FMC);
115.    GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FMC);
116.     
117.    // GPIOG //
118.     
119.    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
120.    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
121.    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
122.    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
123.    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_15;
124.    GPIO_Init(GPIOG,&GPIO_InitStruct);
125.     
126.    GPIO_PinAFConfig(GPIOG,GPIO_PinSource0,GPIO_AF_FMC);
127.    GPIO_PinAFConfig(GPIOG,GPIO_PinSource1,GPIO_AF_FMC);
128.    GPIO_PinAFConfig(GPIOG,GPIO_PinSource4,GPIO_AF_FMC);
129.    GPIO_PinAFConfig(GPIOG,GPIO_PinSource5,GPIO_AF_FMC);
130.    GPIO_PinAFConfig(GPIOG,GPIO_PinSource8,GPIO_AF_FMC);
131.    GPIO_PinAFConfig(GPIOG,GPIO_PinSource15,GPIO_AF_FMC);
132.     
133.    // init SDRAM
134.     
135.    FMC_SDRAMTimingStruct.FMC_ExitSelfRefreshDelay = 7;
136.    FMC_SDRAMTimingStruct.FMC_LoadToActiveDelay = 2;
137.    FMC_SDRAMTimingStruct.FMC_RCDDelay = 2;
138.    FMC_SDRAMTimingStruct.FMC_RowCycleDelay = 7;
139.    FMC_SDRAMTimingStruct.FMC_RPDelay = 7;
140.    FMC_SDRAMTimingStruct.FMC_SelfRefreshTime = 4;
141.    FMC_SDRAMTimingStruct.FMC_WriteRecoveryTime = 2;
142.     
143.    FMC_SDRAMInitStruct.FMC_SDRAMTimingStruct = &FMC_SDRAMTimingStruct;
144.    FMC_SDRAMInitStruct.FMC_Bank = FMC_Bank2_SDRAM;
145.    FMC_SDRAMInitStruct.FMC_CASLatency = FMC_CAS_Latency_2;
146.    FMC_SDRAMInitStruct.FMC_ColumnBitsNumber = FMC_ColumnBits_Number_8b;
147.    FMC_SDRAMInitStruct.FMC_InternalBankNumber = FMC_InternalBank_Number_4;
148.    FMC_SDRAMInitStruct.FMC_ReadBurst = FMC_Read_Burst_Enable;
149.    FMC_SDRAMInitStruct.FMC_ReadPipeDelay = FMC_ReadPipe_Delay_1;
150.    FMC_SDRAMInitStruct.FMC_RowBitsNumber = FMC_RowBits_Number_12b;
151.    FMC_SDRAMInitStruct.FMC_SDClockPeriod = FMC_SDClock_Period_2;
152.    FMC_SDRAMInitStruct.FMC_SDMemoryDataWidth = FMC_SDMemory_Width_16b;
153.    FMC_SDRAMInitStruct.FMC_WriteProtection = FMC_WriteBurst_Disable;
154.     
155.    FMC_SDRAMInit(&FMC_SDRAMInitStruct);
156.     
157.    // Start deliver clock to the SDRAM
158.     
159.    FMC_SDRAMCommandStruct.FMC_CommandMode = FMC_Command_Mode_CLK_Enabled;
160.    FMC_SDRAMCommandStruct.FMC_CommandTarget = FMC_Command_Target_bank2;
161.     
162.    FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStruct);
163.     
164.    // Wait about 100uS
165. 
166.    DelayUs(110);
167.     
168.    // Precharge all the banks
169.     
170.    FMC_SDRAMCommandStruct.FMC_CommandMode = FMC_Command_Mode_PALL;
171.    FMC_SDRAMCommandStruct.FMC_CommandTarget = FMC_Command_Target_bank2;
172.     
173.    FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStruct);
174.     
175.    while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
176.     
177.    // Auto-Refresh command
178.     
179.    FMC_SDRAMCommandStruct.FMC_CommandMode = FMC_Command_Mode_AutoRefresh;
180.    FMC_SDRAMCommandStruct.FMC_CommandTarget = FMC_Command_Target_bank2;
181.    FMC_SDRAMCommandStruct.FMC_AutoRefreshNumber = 8;
182.     
183.    FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStruct);
184.     
185.    while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
186.     
187.    // Load Mode Register
188.     
189.    FMC_SDRAMCommandStruct.FMC_CommandMode = FMC_Command_Mode_LoadMode;
190.    FMC_SDRAMCommandStruct.FMC_CommandTarget = FMC_Command_Target_bank2;
191.    FMC_SDRAMCommandStruct.FMC_ModeRegisterDefinition = 0x221;
192.     
193.    FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStruct);
194.     
195.    while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
196.     
197.    // Program the Refresh Rate
198.     
199.    FMC_SetRefreshCount(1297);
200.     
201.    while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
202.     
203.    // Finish
204.     
205.    for(ptr = SDRAM_BASE;ptr < (SDRAM_BASE + SDRAM_SIZE);ptr += 4)
206.        *((uint32_t *)ptr) = 0x11111111;
207.}

The SDRAM_BASE is 0xD0000000 and the SDRAM_SIZE is 0x00800000.I am using the Keil Uvision V5.

Outcomes