ext_sram.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. /*
  2. *********************************************************************************************************
  3. *
  4. * 模块名称 : 外部SRAM驱动模块
  5. * 文件名称 : bsp_fsmc_sram.c
  6. * 版 本 : V2.4
  7. * 说 明 : 安富莱STM32-F4开发板标配的SRAM为 IS61WV102416BLL-10TL 容量2M字节,16Bit,10ns速度
  8. *
  9. * 修改记录 :
  10. * 版本号 日期 作者 说明
  11. * V1.0 2013-02-01 armfly 正式发布
  12. *
  13. * Copyright (C), 2013-2014, 安富莱电子 www.armfly.com
  14. *
  15. *********************************************************************************************************
  16. */
  17. #include "ext_sram.h"
  18. #include <inttypes.h>
  19. /*
  20. *********************************************************************************************************
  21. * 函 数 名: ext_sram_init
  22. * 功能说明: 配置连接外部SRAM的GPIO和FSMC
  23. * 形 参: 无
  24. * 返 回 值: 无
  25. *********************************************************************************************************
  26. */
  27. void ext_sram_init(void)
  28. {
  29. FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
  30. FSMC_NORSRAMTimingInitTypeDef p;
  31. /* SRAM 的 GPIO :
  32. PD0/FSMC_D2
  33. PD1/FSMC_D3
  34. PD4/FSMC_NOE
  35. PD5/FSMC_NWE
  36. PD8/FSMC_D13
  37. PD9/FSMC_D14
  38. PD10/FSMC_D15
  39. PD11/FSMC_A16
  40. PD12/FSMC_A17
  41. PD13/FSMC_A18
  42. PD14/FSMC_D0
  43. PD15/FSMC_D1
  44. PE0/FSMC_NBL0
  45. PE1/FSMC_NBL1
  46. PE3/FSMC_A19
  47. PE4/FSMC_A20 -- 参与片选的译码
  48. PE5/FSMC_A21 -- 参与片选的译码
  49. PE7/FSMC_D4
  50. PE8/FSMC_D5
  51. PE9/FSMC_D6
  52. PE10/FSMC_D7
  53. PE11/FSMC_D8
  54. PE12/FSMC_D9
  55. PE13/FSMC_D10
  56. PE14/FSMC_D11
  57. PE15/FSMC_D12
  58. PF0/FSMC_A0
  59. PF1/FSMC_A1
  60. PF2/FSMC_A2
  61. PF3/FSMC_A3
  62. PF4/FSMC_A4
  63. PF5/FSMC_A5
  64. PF12/FSMC_A6
  65. PF13/FSMC_A7
  66. PF14/FSMC_A8
  67. PF15/FSMC_A9
  68. PG0/FSMC_A10
  69. PG1/FSMC_A11
  70. PG2/FSMC_A12
  71. PG3/FSMC_A13
  72. PG4/FSMC_A14
  73. PG5/FSMC_A15
  74. PG10/FSMC_NE3 --- 片选主信号
  75. */
  76. /*-- FSMC Configuration ------------------------------------------------------*/
  77. p.FSMC_AddressSetupTime = 3; /* 设置为2会出错; 3正常 */
  78. p.FSMC_AddressHoldTime = 0;
  79. p.FSMC_DataSetupTime = 2; /* 设置为1出错,2正常 */
  80. p.FSMC_BusTurnAroundDuration = 1;
  81. p.FSMC_CLKDivision = 0;
  82. p.FSMC_DataLatency = 0;
  83. p.FSMC_AccessMode = FSMC_AccessMode_A;
  84. FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;
  85. FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
  86. FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
  87. FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
  88. FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
  89. FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
  90. FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  91. FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
  92. FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
  93. FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
  94. FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
  95. FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
  96. FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  97. FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
  98. FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
  99. FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
  100. /*!< Enable FSMC Bank1_SRAM3 Bank */
  101. FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE);
  102. }
  103. /*
  104. *********************************************************************************************************
  105. * 函 数 名: bsp_TestExtSRAM
  106. * 功能说明: 扫描测试外部SRAM
  107. * 形 参: 无
  108. * 返 回 值: 0 表示测试通过; 大于0表示错误单元的个数。
  109. *********************************************************************************************************
  110. */
  111. uint8_t test_ext_sram(void)
  112. {
  113. uint32_t i;
  114. uint32_t *pSRAM;
  115. uint8_t *pBytes;
  116. uint32_t err;
  117. const uint8_t ByteBuf[4] = {0x55, 0xA5, 0x5A, 0xAA};
  118. /* 写SRAM */
  119. pSRAM = (uint32_t *)EXT_SRAM_ADDR;
  120. for (i = 0; i < EXT_SRAM_SIZE / 4; i++)
  121. {
  122. *pSRAM++ = i;
  123. }
  124. /* 读SRAM */
  125. err = 0;
  126. pSRAM = (uint32_t *)EXT_SRAM_ADDR;
  127. for (i = 0; i < EXT_SRAM_SIZE / 4; i++)
  128. {
  129. if (*pSRAM++ != i)
  130. {
  131. err++;
  132. }
  133. }
  134. if (err > 0)
  135. {
  136. return (4 * err);
  137. }
  138. /* 对SRAM 的数据求反并写入 */
  139. pSRAM = (uint32_t *)EXT_SRAM_ADDR;
  140. for (i = 0; i < EXT_SRAM_SIZE / 4; i++)
  141. {
  142. *pSRAM = ~*pSRAM;
  143. pSRAM++;
  144. }
  145. /* 再次比较SRAM的数据 */
  146. err = 0;
  147. pSRAM = (uint32_t *)EXT_SRAM_ADDR;
  148. for (i = 0; i < EXT_SRAM_SIZE / 4; i++)
  149. {
  150. if (*pSRAM++ != (~i))
  151. {
  152. err++;
  153. }
  154. }
  155. if (err > 0)
  156. {
  157. return (4 * err);
  158. }
  159. /* 测试按字节方式访问, 目的是验证 FSMC_NBL0 、 FSMC_NBL1 口线 */
  160. pBytes = (uint8_t *)EXT_SRAM_ADDR;
  161. for (i = 0; i < sizeof(ByteBuf); i++)
  162. {
  163. *pBytes++ = ByteBuf[i];
  164. }
  165. /* 比较SRAM的数据 */
  166. err = 0;
  167. pBytes = (uint8_t *)EXT_SRAM_ADDR;
  168. for (i = 0; i < sizeof(ByteBuf); i++)
  169. {
  170. if (*pBytes++ != ByteBuf[i])
  171. {
  172. err++;
  173. }
  174. }
  175. if (err > 0)
  176. {
  177. return err;
  178. }
  179. return 0;
  180. }