drv_sdram.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-05-17 ZYH first implementation
  9. */
  10. #include "drv_sdram.h"
  11. #include <rtthread.h>
  12. #ifdef BSP_USING_SDRAM
  13. SDRAM_HandleTypeDef hsdram;
  14. static void BSP_SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command);
  15. /* FMC initialization function */
  16. void MX_FMC_Init(void)
  17. {
  18. FMC_SDRAM_TimingTypeDef SdramTiming;
  19. FMC_SDRAM_CommandTypeDef command;
  20. /** Perform the SDRAM1 memory initialization sequence
  21. */
  22. hsdram.Instance = FMC_SDRAM_DEVICE;
  23. /* hsdram.Init */
  24. hsdram.Init.SDBank = FMC_SDRAM_BANK1;
  25. hsdram.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;
  26. hsdram.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
  27. hsdram.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_32;
  28. hsdram.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
  29. hsdram.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2;
  30. hsdram.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
  31. hsdram.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;
  32. hsdram.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;
  33. hsdram.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;
  34. /* SdramTiming */
  35. SdramTiming.LoadToActiveDelay = 2;
  36. SdramTiming.ExitSelfRefreshDelay = 6;
  37. SdramTiming.SelfRefreshTime = 4;
  38. SdramTiming.RowCycleDelay = 6;
  39. SdramTiming.WriteRecoveryTime = 2;
  40. SdramTiming.RPDelay = 2;
  41. SdramTiming.RCDDelay = 2;
  42. HAL_SDRAM_Init(&hsdram, &SdramTiming);
  43. BSP_SDRAM_Initialization_Sequence(&hsdram, &command);
  44. }
  45. static uint32_t FMC_Initialized = 0;
  46. static void HAL_FMC_MspInit(void)
  47. {
  48. GPIO_InitTypeDef GPIO_InitStruct;
  49. if (FMC_Initialized)
  50. {
  51. return;
  52. }
  53. FMC_Initialized = 1;
  54. /* Peripheral clock enable */
  55. __HAL_RCC_FMC_CLK_ENABLE();
  56. __HAL_RCC_GPIOD_CLK_ENABLE();
  57. __HAL_RCC_GPIOE_CLK_ENABLE();
  58. __HAL_RCC_GPIOF_CLK_ENABLE();
  59. __HAL_RCC_GPIOG_CLK_ENABLE();
  60. __HAL_RCC_GPIOH_CLK_ENABLE();
  61. __HAL_RCC_GPIOI_CLK_ENABLE();
  62. /** FMC GPIO Configuration
  63. PE1 ------> FMC_NBL1
  64. PE0 ------> FMC_NBL0
  65. PG15 ------> FMC_SDNCAS
  66. PD0 ------> FMC_D2
  67. PI4 ------> FMC_NBL2
  68. PD1 ------> FMC_D3
  69. PI3 ------> FMC_D27
  70. PI2 ------> FMC_D26
  71. PF0 ------> FMC_A0
  72. PI5 ------> FMC_NBL3
  73. PI7 ------> FMC_D29
  74. PI10 ------> FMC_D31
  75. PI6 ------> FMC_D28
  76. PH15 ------> FMC_D23
  77. PI1 ------> FMC_D25
  78. PF1 ------> FMC_A1
  79. PI9 ------> FMC_D30
  80. PH13 ------> FMC_D21
  81. PH14 ------> FMC_D22
  82. PI0 ------> FMC_D24
  83. PF2 ------> FMC_A2
  84. PF3 ------> FMC_A3
  85. PG8 ------> FMC_SDCLK
  86. PF4 ------> FMC_A4
  87. PH5 ------> FMC_SDNWE
  88. PH3 ------> FMC_SDNE0
  89. PF5 ------> FMC_A5
  90. PH2 ------> FMC_SDCKE0
  91. PD15 ------> FMC_D1
  92. PD10 ------> FMC_D15
  93. PD14 ------> FMC_D0
  94. PD9 ------> FMC_D14
  95. PD8 ------> FMC_D13
  96. PF12 ------> FMC_A6
  97. PG1 ------> FMC_A11
  98. PF15 ------> FMC_A9
  99. PH12 ------> FMC_D20
  100. PF13 ------> FMC_A7
  101. PG0 ------> FMC_A10
  102. PE8 ------> FMC_D5
  103. PG5 ------> FMC_BA1
  104. PG4 ------> FMC_BA0
  105. PH9 ------> FMC_D17
  106. PH11 ------> FMC_D19
  107. PF14 ------> FMC_A8
  108. PF11 ------> FMC_SDNRAS
  109. PE9 ------> FMC_D6
  110. PE11 ------> FMC_D8
  111. PE14 ------> FMC_D11
  112. PH8 ------> FMC_D16
  113. PH10 ------> FMC_D18
  114. PE7 ------> FMC_D4
  115. PE10 ------> FMC_D7
  116. PE12 ------> FMC_D9
  117. PE15 ------> FMC_D12
  118. PE13 ------> FMC_D10
  119. */
  120. /* GPIO_InitStruct */
  121. GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_0 | GPIO_PIN_8 | GPIO_PIN_9
  122. | GPIO_PIN_11 | GPIO_PIN_14 | GPIO_PIN_7 | GPIO_PIN_10
  123. | GPIO_PIN_12 | GPIO_PIN_15 | GPIO_PIN_13;
  124. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  125. GPIO_InitStruct.Pull = GPIO_NOPULL;
  126. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  127. GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
  128. HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
  129. /* GPIO_InitStruct */
  130. GPIO_InitStruct.Pin = GPIO_PIN_15 | GPIO_PIN_8 | GPIO_PIN_1 | GPIO_PIN_0
  131. | GPIO_PIN_5 | GPIO_PIN_4;
  132. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  133. GPIO_InitStruct.Pull = GPIO_NOPULL;
  134. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  135. GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
  136. HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
  137. /* GPIO_InitStruct */
  138. GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_15 | GPIO_PIN_10
  139. | GPIO_PIN_14 | GPIO_PIN_9 | GPIO_PIN_8;
  140. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  141. GPIO_InitStruct.Pull = GPIO_NOPULL;
  142. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  143. GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
  144. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  145. /* GPIO_InitStruct */
  146. GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_5
  147. | GPIO_PIN_7 | GPIO_PIN_10 | GPIO_PIN_6 | GPIO_PIN_1
  148. | GPIO_PIN_9 | GPIO_PIN_0;
  149. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  150. GPIO_InitStruct.Pull = GPIO_NOPULL;
  151. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  152. GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
  153. HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
  154. /* GPIO_InitStruct */
  155. GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3
  156. | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_12 | GPIO_PIN_15
  157. | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_11;
  158. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  159. GPIO_InitStruct.Pull = GPIO_NOPULL;
  160. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  161. GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
  162. HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
  163. /* GPIO_InitStruct */
  164. GPIO_InitStruct.Pin = GPIO_PIN_15 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_5
  165. | GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_12 | GPIO_PIN_9
  166. | GPIO_PIN_11 | GPIO_PIN_8 | GPIO_PIN_10;
  167. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  168. GPIO_InitStruct.Pull = GPIO_NOPULL;
  169. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  170. GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
  171. HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
  172. }
  173. void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef *sdramHandle)
  174. {
  175. HAL_FMC_MspInit();
  176. }
  177. static uint32_t FMC_DeInitialized = 0;
  178. static void HAL_FMC_MspDeInit(void)
  179. {
  180. if (FMC_DeInitialized)
  181. {
  182. return;
  183. }
  184. FMC_DeInitialized = 1;
  185. /* Peripheral clock enable */
  186. __HAL_RCC_FMC_CLK_DISABLE();
  187. /** FMC GPIO Configuration
  188. PE1 ------> FMC_NBL1
  189. PE0 ------> FMC_NBL0
  190. PG15 ------> FMC_SDNCAS
  191. PD0 ------> FMC_D2
  192. PI4 ------> FMC_NBL2
  193. PD1 ------> FMC_D3
  194. PI3 ------> FMC_D27
  195. PI2 ------> FMC_D26
  196. PF0 ------> FMC_A0
  197. PI5 ------> FMC_NBL3
  198. PI7 ------> FMC_D29
  199. PI10 ------> FMC_D31
  200. PI6 ------> FMC_D28
  201. PH15 ------> FMC_D23
  202. PI1 ------> FMC_D25
  203. PF1 ------> FMC_A1
  204. PI9 ------> FMC_D30
  205. PH13 ------> FMC_D21
  206. PH14 ------> FMC_D22
  207. PI0 ------> FMC_D24
  208. PF2 ------> FMC_A2
  209. PF3 ------> FMC_A3
  210. PG8 ------> FMC_SDCLK
  211. PF4 ------> FMC_A4
  212. PH5 ------> FMC_SDNWE
  213. PH3 ------> FMC_SDNE0
  214. PF5 ------> FMC_A5
  215. PH2 ------> FMC_SDCKE0
  216. PD15 ------> FMC_D1
  217. PD10 ------> FMC_D15
  218. PD14 ------> FMC_D0
  219. PD9 ------> FMC_D14
  220. PD8 ------> FMC_D13
  221. PF12 ------> FMC_A6
  222. PG1 ------> FMC_A11
  223. PF15 ------> FMC_A9
  224. PH12 ------> FMC_D20
  225. PF13 ------> FMC_A7
  226. PG0 ------> FMC_A10
  227. PE8 ------> FMC_D5
  228. PG5 ------> FMC_BA1
  229. PG4 ------> FMC_BA0
  230. PH9 ------> FMC_D17
  231. PH11 ------> FMC_D19
  232. PF14 ------> FMC_A8
  233. PF11 ------> FMC_SDNRAS
  234. PE9 ------> FMC_D6
  235. PE11 ------> FMC_D8
  236. PE14 ------> FMC_D11
  237. PH8 ------> FMC_D16
  238. PH10 ------> FMC_D18
  239. PE7 ------> FMC_D4
  240. PE10 ------> FMC_D7
  241. PE12 ------> FMC_D9
  242. PE15 ------> FMC_D12
  243. PE13 ------> FMC_D10
  244. */
  245. HAL_GPIO_DeInit(GPIOE, GPIO_PIN_1 | GPIO_PIN_0 | GPIO_PIN_8 | GPIO_PIN_9
  246. | GPIO_PIN_11 | GPIO_PIN_14 | GPIO_PIN_7 | GPIO_PIN_10
  247. | GPIO_PIN_12 | GPIO_PIN_15 | GPIO_PIN_13);
  248. HAL_GPIO_DeInit(GPIOG, GPIO_PIN_15 | GPIO_PIN_8 | GPIO_PIN_1 | GPIO_PIN_0
  249. | GPIO_PIN_5 | GPIO_PIN_4);
  250. HAL_GPIO_DeInit(GPIOD, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_15 | GPIO_PIN_10
  251. | GPIO_PIN_14 | GPIO_PIN_9 | GPIO_PIN_8);
  252. HAL_GPIO_DeInit(GPIOI, GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_5
  253. | GPIO_PIN_7 | GPIO_PIN_10 | GPIO_PIN_6 | GPIO_PIN_1
  254. | GPIO_PIN_9 | GPIO_PIN_0);
  255. HAL_GPIO_DeInit(GPIOF, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3
  256. | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_12 | GPIO_PIN_15
  257. | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_11);
  258. HAL_GPIO_DeInit(GPIOH, GPIO_PIN_15 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_5
  259. | GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_12 | GPIO_PIN_9
  260. | GPIO_PIN_11 | GPIO_PIN_8 | GPIO_PIN_10);
  261. }
  262. void HAL_SDRAM_MspDeInit(SDRAM_HandleTypeDef *sdramHandle)
  263. {
  264. HAL_FMC_MspDeInit();
  265. }
  266. static void BSP_SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command)
  267. {
  268. __IO uint32_t tmpmrd = 0;
  269. int delay = 216000/3;
  270. /* Step 3: Configure a clock configuration enable command */
  271. Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
  272. Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
  273. Command->AutoRefreshNumber = 1;
  274. Command->ModeRegisterDefinition = 0;
  275. /* Send the command */
  276. HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);
  277. /* Step 4: Insert 100 us minimum delay */
  278. /* Inserted delay is equal to 1 ms due to systick time base unit (ms) */
  279. while(delay)
  280. {
  281. delay--;
  282. }
  283. /* Step 5: Configure a PALL (precharge all) command */
  284. Command->CommandMode = FMC_SDRAM_CMD_PALL;
  285. Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
  286. Command->AutoRefreshNumber = 1;
  287. Command->ModeRegisterDefinition = 0;
  288. /* Send the command */
  289. HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);
  290. /* Step 6 : Configure a Auto-Refresh command */
  291. Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
  292. Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
  293. Command->AutoRefreshNumber = 8;
  294. Command->ModeRegisterDefinition = 0;
  295. /* Send the command */
  296. HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);
  297. /* Step 7: Program the external memory mode register */
  298. tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 |
  299. SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL |
  300. SDRAM_MODEREG_CAS_LATENCY_2 |
  301. SDRAM_MODEREG_OPERATING_MODE_STANDARD |
  302. SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
  303. Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
  304. Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
  305. Command->AutoRefreshNumber = 1;
  306. Command->ModeRegisterDefinition = tmpmrd;
  307. /* Send the command */
  308. HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);
  309. /* Step 8: Set the refresh rate counter */
  310. /* (15.62 us x Freq) - 20 */
  311. /* Set the device refresh counter */
  312. hsdram->Instance->SDRTR |= ((uint32_t)((1292) << 1));
  313. }
  314. int bsp_sdram_hw_init(void)
  315. {
  316. MX_FMC_Init();
  317. return 0;
  318. }
  319. #endif