ext_sram.c 5.8 KB

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