sram.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. /**
  2. ******************************************************************************
  3. * @file sram.c
  4. * @author fire
  5. * @version V1.0
  6. * @date 2015-xx-xx
  7. * @brief sram应用函数接口
  8. ******************************************************************************
  9. * @attention
  10. *
  11. * 实验平台:野火 STM32 F407 开发板
  12. * 论坛 :http://www.firebbs.cn
  13. * 淘宝 :https://fire-stm32.taobao.com
  14. *
  15. ******************************************************************************
  16. */
  17. #include "sram.h"
  18. /**
  19. * @brief 初始化控制SRAM的IO
  20. * @param 无
  21. * @retval 无
  22. */
  23. static void SRAM_GPIO_Config(void)
  24. {
  25. GPIO_InitTypeDef GPIO_InitStructure;
  26. /* 使能SRAM相关的GPIO时钟 */
  27. /*地址信号线*/
  28. RCC_AHB1PeriphClockCmd(FSMC_A0_GPIO_CLK | FSMC_A1_GPIO_CLK | FSMC_A2_GPIO_CLK |
  29. FSMC_A3_GPIO_CLK | FSMC_A4_GPIO_CLK | FSMC_A5_GPIO_CLK |
  30. FSMC_A6_GPIO_CLK | FSMC_A7_GPIO_CLK | FSMC_A8_GPIO_CLK |
  31. FSMC_A9_GPIO_CLK | FSMC_A10_GPIO_CLK| FSMC_A11_GPIO_CLK|
  32. FSMC_A12_GPIO_CLK| FSMC_A13_GPIO_CLK|FSMC_A14_GPIO_CLK|
  33. FSMC_A15_GPIO_CLK|FSMC_A16_GPIO_CLK|FSMC_A17_GPIO_CLK|FSMC_A18_GPIO_CLK|
  34. /*数据信号线*/
  35. FSMC_D0_GPIO_CLK | FSMC_D1_GPIO_CLK | FSMC_D2_GPIO_CLK |
  36. FSMC_D3_GPIO_CLK | FSMC_D4_GPIO_CLK | FSMC_D5_GPIO_CLK |
  37. FSMC_D6_GPIO_CLK | FSMC_D7_GPIO_CLK | FSMC_D8_GPIO_CLK |
  38. FSMC_D9_GPIO_CLK | FSMC_D10_GPIO_CLK| FSMC_D11_GPIO_CLK|
  39. FSMC_D12_GPIO_CLK| FSMC_D13_GPIO_CLK| FSMC_D14_GPIO_CLK|
  40. FSMC_D15_GPIO_CLK|
  41. /*控制信号线*/
  42. FSMC_CS_GPIO_CLK | FSMC_WE_GPIO_CLK | FSMC_OE_GPIO_CLK |
  43. FSMC_UDQM_GPIO_CLK|FSMC_LDQM_GPIO_CLK, ENABLE);
  44. /*-- GPIO 配置 -----------------------------------------------------*/
  45. /* 通用 GPIO 配置 */
  46. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  47. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  48. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  49. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  50. /*A地址信号线 针对引脚配置*/
  51. GPIO_InitStructure.GPIO_Pin = FSMC_A0_GPIO_PIN;
  52. GPIO_Init(FSMC_A0_GPIO_PORT, &GPIO_InitStructure);
  53. GPIO_PinAFConfig(FSMC_A0_GPIO_PORT,FSMC_A0_GPIO_PinSource,FSMC_GPIO_AF);
  54. GPIO_InitStructure.GPIO_Pin = FSMC_A1_GPIO_PIN;
  55. GPIO_Init(FSMC_A1_GPIO_PORT, &GPIO_InitStructure);
  56. GPIO_PinAFConfig(FSMC_A1_GPIO_PORT,FSMC_A1_GPIO_PinSource,FSMC_GPIO_AF);
  57. GPIO_InitStructure.GPIO_Pin = FSMC_A2_GPIO_PIN;
  58. GPIO_Init(FSMC_A2_GPIO_PORT, &GPIO_InitStructure);
  59. GPIO_PinAFConfig(FSMC_A2_GPIO_PORT,FSMC_A2_GPIO_PinSource,FSMC_GPIO_AF);
  60. GPIO_InitStructure.GPIO_Pin = FSMC_A3_GPIO_PIN;
  61. GPIO_Init(FSMC_A3_GPIO_PORT, &GPIO_InitStructure);
  62. GPIO_PinAFConfig(FSMC_A3_GPIO_PORT,FSMC_A3_GPIO_PinSource,FSMC_GPIO_AF);
  63. GPIO_InitStructure.GPIO_Pin = FSMC_A4_GPIO_PIN;
  64. GPIO_Init(FSMC_A4_GPIO_PORT, &GPIO_InitStructure);
  65. GPIO_PinAFConfig(FSMC_A4_GPIO_PORT,FSMC_A4_GPIO_PinSource,FSMC_GPIO_AF);
  66. GPIO_InitStructure.GPIO_Pin = FSMC_A5_GPIO_PIN;
  67. GPIO_Init(FSMC_A5_GPIO_PORT, &GPIO_InitStructure);
  68. GPIO_PinAFConfig(FSMC_A5_GPIO_PORT,FSMC_A5_GPIO_PinSource,FSMC_GPIO_AF);
  69. GPIO_InitStructure.GPIO_Pin = FSMC_A6_GPIO_PIN;
  70. GPIO_Init(FSMC_A6_GPIO_PORT, &GPIO_InitStructure);
  71. GPIO_PinAFConfig(FSMC_A6_GPIO_PORT,FSMC_A6_GPIO_PinSource,FSMC_GPIO_AF);
  72. GPIO_InitStructure.GPIO_Pin = FSMC_A7_GPIO_PIN;
  73. GPIO_Init(FSMC_A7_GPIO_PORT, &GPIO_InitStructure);
  74. GPIO_PinAFConfig(FSMC_A7_GPIO_PORT,FSMC_A7_GPIO_PinSource,FSMC_GPIO_AF);
  75. GPIO_InitStructure.GPIO_Pin = FSMC_A8_GPIO_PIN;
  76. GPIO_Init(FSMC_A8_GPIO_PORT, &GPIO_InitStructure);
  77. GPIO_PinAFConfig(FSMC_A8_GPIO_PORT,FSMC_A8_GPIO_PinSource,FSMC_GPIO_AF);
  78. GPIO_InitStructure.GPIO_Pin = FSMC_A9_GPIO_PIN;
  79. GPIO_Init(FSMC_A9_GPIO_PORT, &GPIO_InitStructure);
  80. GPIO_PinAFConfig(FSMC_A9_GPIO_PORT,FSMC_A9_GPIO_PinSource,FSMC_GPIO_AF);
  81. GPIO_InitStructure.GPIO_Pin = FSMC_A10_GPIO_PIN;
  82. GPIO_Init(FSMC_A10_GPIO_PORT, &GPIO_InitStructure);
  83. GPIO_PinAFConfig(FSMC_A10_GPIO_PORT,FSMC_A10_GPIO_PinSource,FSMC_GPIO_AF);
  84. GPIO_InitStructure.GPIO_Pin = FSMC_A11_GPIO_PIN;
  85. GPIO_Init(FSMC_A11_GPIO_PORT, &GPIO_InitStructure);
  86. GPIO_PinAFConfig(FSMC_A11_GPIO_PORT,FSMC_A11_GPIO_PinSource,FSMC_GPIO_AF);
  87. GPIO_InitStructure.GPIO_Pin = FSMC_A12_GPIO_PIN;
  88. GPIO_Init(FSMC_A12_GPIO_PORT, &GPIO_InitStructure);
  89. GPIO_PinAFConfig(FSMC_A12_GPIO_PORT,FSMC_A12_GPIO_PinSource,FSMC_GPIO_AF);
  90. GPIO_InitStructure.GPIO_Pin = FSMC_A13_GPIO_PIN;
  91. GPIO_Init(FSMC_A13_GPIO_PORT, &GPIO_InitStructure);
  92. GPIO_PinAFConfig(FSMC_A13_GPIO_PORT,FSMC_A13_GPIO_PinSource,FSMC_GPIO_AF);
  93. GPIO_InitStructure.GPIO_Pin = FSMC_A14_GPIO_PIN;
  94. GPIO_Init(FSMC_A14_GPIO_PORT, &GPIO_InitStructure);
  95. GPIO_PinAFConfig(FSMC_A14_GPIO_PORT,FSMC_A14_GPIO_PinSource,FSMC_GPIO_AF);
  96. GPIO_InitStructure.GPIO_Pin = FSMC_A15_GPIO_PIN;
  97. GPIO_Init(FSMC_A15_GPIO_PORT, &GPIO_InitStructure);
  98. GPIO_PinAFConfig(FSMC_A15_GPIO_PORT,FSMC_A15_GPIO_PinSource,FSMC_GPIO_AF);
  99. GPIO_InitStructure.GPIO_Pin = FSMC_A16_GPIO_PIN;
  100. GPIO_Init(FSMC_A16_GPIO_PORT, &GPIO_InitStructure);
  101. GPIO_PinAFConfig(FSMC_A16_GPIO_PORT,FSMC_A16_GPIO_PinSource,FSMC_GPIO_AF);
  102. GPIO_InitStructure.GPIO_Pin = FSMC_A17_GPIO_PIN;
  103. GPIO_Init(FSMC_A17_GPIO_PORT, &GPIO_InitStructure);
  104. GPIO_PinAFConfig(FSMC_A17_GPIO_PORT,FSMC_A17_GPIO_PinSource,FSMC_GPIO_AF);
  105. GPIO_InitStructure.GPIO_Pin = FSMC_A18_GPIO_PIN;
  106. GPIO_Init(FSMC_A18_GPIO_PORT, &GPIO_InitStructure);
  107. GPIO_PinAFConfig(FSMC_A18_GPIO_PORT,FSMC_A18_GPIO_PinSource,FSMC_GPIO_AF);
  108. /*DQ数据信号线 针对引脚配置*/
  109. GPIO_InitStructure.GPIO_Pin = FSMC_D0_GPIO_PIN;
  110. GPIO_Init(FSMC_D0_GPIO_PORT, &GPIO_InitStructure);
  111. GPIO_PinAFConfig(FSMC_D0_GPIO_PORT,FSMC_D0_GPIO_PinSource,FSMC_GPIO_AF);
  112. GPIO_InitStructure.GPIO_Pin = FSMC_D1_GPIO_PIN;
  113. GPIO_Init(FSMC_D1_GPIO_PORT, &GPIO_InitStructure);
  114. GPIO_PinAFConfig(FSMC_D1_GPIO_PORT,FSMC_D1_GPIO_PinSource,FSMC_GPIO_AF);
  115. GPIO_InitStructure.GPIO_Pin = FSMC_D2_GPIO_PIN;
  116. GPIO_Init(FSMC_D2_GPIO_PORT, &GPIO_InitStructure);
  117. GPIO_PinAFConfig(FSMC_D2_GPIO_PORT,FSMC_D2_GPIO_PinSource,FSMC_GPIO_AF);
  118. GPIO_InitStructure.GPIO_Pin = FSMC_D3_GPIO_PIN;
  119. GPIO_Init(FSMC_D3_GPIO_PORT, &GPIO_InitStructure);
  120. GPIO_PinAFConfig(FSMC_D3_GPIO_PORT,FSMC_D3_GPIO_PinSource,FSMC_GPIO_AF);
  121. GPIO_InitStructure.GPIO_Pin = FSMC_D4_GPIO_PIN;
  122. GPIO_Init(FSMC_D4_GPIO_PORT, &GPIO_InitStructure);
  123. GPIO_PinAFConfig(FSMC_D4_GPIO_PORT,FSMC_D4_GPIO_PinSource,FSMC_GPIO_AF);
  124. GPIO_InitStructure.GPIO_Pin = FSMC_D5_GPIO_PIN;
  125. GPIO_Init(FSMC_D5_GPIO_PORT, &GPIO_InitStructure);
  126. GPIO_PinAFConfig(FSMC_D5_GPIO_PORT,FSMC_D5_GPIO_PinSource,FSMC_GPIO_AF);
  127. GPIO_InitStructure.GPIO_Pin = FSMC_D6_GPIO_PIN;
  128. GPIO_Init(FSMC_D6_GPIO_PORT, &GPIO_InitStructure);
  129. GPIO_PinAFConfig(FSMC_D6_GPIO_PORT,FSMC_D6_GPIO_PinSource,FSMC_GPIO_AF);
  130. GPIO_InitStructure.GPIO_Pin = FSMC_D7_GPIO_PIN;
  131. GPIO_Init(FSMC_D7_GPIO_PORT, &GPIO_InitStructure);
  132. GPIO_PinAFConfig(FSMC_D7_GPIO_PORT,FSMC_D7_GPIO_PinSource,FSMC_GPIO_AF);
  133. GPIO_InitStructure.GPIO_Pin = FSMC_D8_GPIO_PIN;
  134. GPIO_Init(FSMC_D8_GPIO_PORT, &GPIO_InitStructure);
  135. GPIO_PinAFConfig(FSMC_D8_GPIO_PORT,FSMC_D8_GPIO_PinSource,FSMC_GPIO_AF);
  136. GPIO_InitStructure.GPIO_Pin = FSMC_D9_GPIO_PIN;
  137. GPIO_Init(FSMC_D9_GPIO_PORT, &GPIO_InitStructure);
  138. GPIO_PinAFConfig(FSMC_D9_GPIO_PORT,FSMC_D9_GPIO_PinSource,FSMC_GPIO_AF);
  139. GPIO_InitStructure.GPIO_Pin = FSMC_D10_GPIO_PIN;
  140. GPIO_Init(FSMC_D10_GPIO_PORT, &GPIO_InitStructure);
  141. GPIO_PinAFConfig(FSMC_D10_GPIO_PORT,FSMC_D10_GPIO_PinSource,FSMC_GPIO_AF);
  142. GPIO_InitStructure.GPIO_Pin = FSMC_D11_GPIO_PIN;
  143. GPIO_Init(FSMC_D11_GPIO_PORT, &GPIO_InitStructure);
  144. GPIO_PinAFConfig(FSMC_D11_GPIO_PORT,FSMC_D11_GPIO_PinSource,FSMC_GPIO_AF);
  145. GPIO_InitStructure.GPIO_Pin = FSMC_D12_GPIO_PIN;
  146. GPIO_Init(FSMC_D12_GPIO_PORT, &GPIO_InitStructure);
  147. GPIO_PinAFConfig(FSMC_D12_GPIO_PORT,FSMC_D12_GPIO_PinSource,FSMC_GPIO_AF);
  148. GPIO_InitStructure.GPIO_Pin = FSMC_D13_GPIO_PIN;
  149. GPIO_Init(FSMC_D13_GPIO_PORT, &GPIO_InitStructure);
  150. GPIO_PinAFConfig(FSMC_D13_GPIO_PORT,FSMC_D13_GPIO_PinSource,FSMC_GPIO_AF);
  151. GPIO_InitStructure.GPIO_Pin = FSMC_D14_GPIO_PIN;
  152. GPIO_Init(FSMC_D14_GPIO_PORT, &GPIO_InitStructure);
  153. GPIO_PinAFConfig(FSMC_D14_GPIO_PORT,FSMC_D14_GPIO_PinSource,FSMC_GPIO_AF);
  154. GPIO_InitStructure.GPIO_Pin = FSMC_D15_GPIO_PIN;
  155. GPIO_Init(FSMC_D15_GPIO_PORT, &GPIO_InitStructure);
  156. GPIO_PinAFConfig(FSMC_D15_GPIO_PORT,FSMC_D15_GPIO_PinSource,FSMC_GPIO_AF);
  157. /*控制信号线*/
  158. GPIO_InitStructure.GPIO_Pin = FSMC_CS_GPIO_PIN;
  159. GPIO_Init(FSMC_CS_GPIO_PORT, &GPIO_InitStructure);
  160. GPIO_PinAFConfig(FSMC_CS_GPIO_PORT,FSMC_CS_GPIO_PinSource,FSMC_GPIO_AF);
  161. GPIO_InitStructure.GPIO_Pin = FSMC_WE_GPIO_PIN;
  162. GPIO_Init(FSMC_WE_GPIO_PORT, &GPIO_InitStructure);
  163. GPIO_PinAFConfig(FSMC_WE_GPIO_PORT,FSMC_WE_GPIO_PinSource,FSMC_GPIO_AF);
  164. GPIO_InitStructure.GPIO_Pin = FSMC_OE_GPIO_PIN;
  165. GPIO_Init(FSMC_OE_GPIO_PORT, &GPIO_InitStructure);
  166. GPIO_PinAFConfig(FSMC_OE_GPIO_PORT,FSMC_OE_GPIO_PinSource,FSMC_GPIO_AF);
  167. GPIO_InitStructure.GPIO_Pin = FSMC_UDQM_GPIO_PIN;
  168. GPIO_Init(FSMC_UDQM_GPIO_PORT, &GPIO_InitStructure);
  169. GPIO_PinAFConfig(FSMC_UDQM_GPIO_PORT,FSMC_UDQM_GPIO_PinSource,FSMC_GPIO_AF);
  170. GPIO_InitStructure.GPIO_Pin = FSMC_LDQM_GPIO_PIN;
  171. GPIO_Init(FSMC_LDQM_GPIO_PORT, &GPIO_InitStructure);
  172. GPIO_PinAFConfig(FSMC_LDQM_GPIO_PORT,FSMC_LDQM_GPIO_PinSource,FSMC_GPIO_AF);
  173. }
  174. /**
  175. * @brief 初始化FSMC外设
  176. * @param None.
  177. * @retval None.
  178. */
  179. void FSMC_SRAM_Init(void)
  180. {
  181. FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
  182. FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
  183. /*初始化SRAM相关的GPIO*/
  184. SRAM_GPIO_Config();
  185. /*使能FSMC外设时钟*/
  186. RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);
  187. //地址建立时间(ADDSET)为1个HCLK,1/120M = 8.33ns
  188. readWriteTiming.FSMC_AddressSetupTime = 0x00;
  189. //地址保持时间(ADDHLD)模式A未用到
  190. readWriteTiming.FSMC_AddressHoldTime = 0x00;
  191. //数据保持时间(DATAST)+ 1个HCLK = 2/120M=16.6ns
  192. readWriteTiming.FSMC_DataSetupTime = 0x02;
  193. //设置总线转换周期,仅用于复用模式的NOR操作
  194. readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
  195. //设置时钟分频,仅用于同步类型的存储器
  196. //readWriteTiming.FSMC_CLKDivision = 0x16;
  197. readWriteTiming.FSMC_CLKDivision = 0xf;
  198. //数据保持时间,仅用于同步型的NOR
  199. //readWriteTiming.FSMC_DataLatency = 0x17;
  200. readWriteTiming.FSMC_DataLatency = 0xf;
  201. //选择匹配SRAM的模式
  202. readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;
  203. // 选择FSMC映射的存储区域: Bank1 sram3
  204. FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;
  205. //设置地址总线与数据总线是否复用,仅用于NOR
  206. FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
  207. //设置要控制的存储器类型:SRAM类型
  208. FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;
  209. //存储器数据宽度:16位
  210. FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
  211. //设置是否使用突发访问模式,仅用于同步类型的存储器
  212. FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;
  213. //设置是否使能等待信号,仅用于同步类型的存储器
  214. FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
  215. //设置等待信号的有效极性,仅用于同步类型的存储器
  216. FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  217. //设置是否支持把非对齐的突发操作,仅用于同步类型的存储器
  218. FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
  219. //设置等待信号插入的时间,仅用于同步类型的存储器
  220. FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
  221. //存储器写使能
  222. FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
  223. //不使用等待信号
  224. FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
  225. // 不使用扩展模式,读写使用相同的时序
  226. FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
  227. //突发写操作
  228. FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  229. //读写时序配置
  230. FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;
  231. //读写同样时序,使用扩展模式时这个配置才有效
  232. FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming;
  233. FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置
  234. FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); // 使能BANK
  235. }
  236. /**
  237. * @brief 以“字”为单位向sdram写入数据
  238. * @param pBuffer: 指向数据的指针
  239. * @param uwWriteAddress: 要写入的SRAM内部地址
  240. * @param uwBufferSize: 要写入数据大小
  241. * @retval None.
  242. */
  243. void SRAM_WriteBuffer(uint32_t* pBuffer, uint32_t uwWriteAddress, uint32_t uwBufferSize)
  244. {
  245. __IO uint32_t write_pointer = (uint32_t)uwWriteAddress;
  246. /* 循环写入数据 */
  247. for (; uwBufferSize != 0; uwBufferSize--)
  248. {
  249. /* 发送数据到SRAM */
  250. *(uint32_t *) (Bank1_SRAM3_ADDR + write_pointer) = *pBuffer++;
  251. /* 地址自增*/
  252. write_pointer += 4;
  253. }
  254. }
  255. /**
  256. * @brief 从SRAM中读取数据
  257. * @param pBuffer: 指向存储数据的buffer
  258. * @param ReadAddress: 要读取数据的地十
  259. * @param uwBufferSize: 要读取的数据大小
  260. * @retval None.
  261. */
  262. void SRAM_ReadBuffer(uint32_t* pBuffer, uint32_t uwReadAddress, uint32_t uwBufferSize)
  263. {
  264. __IO uint32_t write_pointer = (uint32_t)uwReadAddress;
  265. /*读取数据 */
  266. for(; uwBufferSize != 0x00; uwBufferSize--)
  267. {
  268. *pBuffer++ = *(__IO uint32_t *)(Bank1_SRAM3_ADDR + write_pointer );
  269. /* 地址自增*/
  270. write_pointer += 4;
  271. }
  272. }
  273. /**
  274. * @brief 测试SRAM是否正常
  275. * @param None
  276. * @retval 正常返回1,异常返回0
  277. */
  278. uint8_t SRAM_Test(void)
  279. {
  280. /*写入数据计数器*/
  281. uint32_t counter=0;
  282. /* 8位的数据 */
  283. uint8_t ubWritedata_8b = 0, ubReaddata_8b = 0;
  284. /* 16位的数据 */
  285. uint16_t uhWritedata_16b = 0, uhReaddata_16b = 0;
  286. SRAM_INFO("正在检测SRAM,以8位、16位的方式读写sram...");
  287. /*按8位格式读写数据,并校验*/
  288. /* 把SRAM数据全部重置为0 ,IS62WV51216_SIZE是以8位为单位的 */
  289. for (counter = 0x00; counter < IS62WV51216_SIZE; counter++)
  290. {
  291. *(__IO uint8_t*) (Bank1_SRAM3_ADDR + counter) = (uint8_t)0x0;
  292. }
  293. /* 向整个SRAM写入数据 8位 */
  294. for (counter = 0; counter < IS62WV51216_SIZE; counter++)
  295. {
  296. *(__IO uint8_t*) (Bank1_SRAM3_ADDR + counter) = (uint8_t)(ubWritedata_8b + counter);
  297. }
  298. /* 读取 SRAM 数据并检测*/
  299. for(counter = 0; counter<IS62WV51216_SIZE;counter++ )
  300. {
  301. ubReaddata_8b = *(__IO uint8_t*)(Bank1_SRAM3_ADDR + counter); //从该地址读出数据
  302. if(ubReaddata_8b != (uint8_t)(ubWritedata_8b + counter)) //检测数据,若不相等,跳出函数,返回检测失败结果。
  303. {
  304. SRAM_ERROR("8位数据读写错误!");
  305. return 0;
  306. }
  307. }
  308. /*按16位格式读写数据,并检测*/
  309. /* 把SRAM数据全部重置为0 */
  310. for (counter = 0x00; counter < IS62WV51216_SIZE/2; counter++)
  311. {
  312. *(__IO uint16_t*) (Bank1_SRAM3_ADDR + 2*counter) = (uint16_t)0x00;
  313. }
  314. /* 向整个SRAM写入数据 16位 */
  315. for (counter = 0; counter < IS62WV51216_SIZE/2; counter++)
  316. {
  317. *(__IO uint16_t*) (Bank1_SRAM3_ADDR + 2*counter) = (uint16_t)(uhWritedata_16b + counter);
  318. }
  319. /* 读取 SRAM 数据并检测*/
  320. for(counter = 0; counter<IS62WV51216_SIZE/2;counter++ )
  321. {
  322. uhReaddata_16b = *(__IO uint16_t*)(Bank1_SRAM3_ADDR + 2*counter); //从该地址读出数据
  323. if(uhReaddata_16b != (uint16_t)(uhWritedata_16b + counter)) //检测数据,若不相等,跳出函数,返回检测失败结果。
  324. {
  325. SRAM_ERROR("16位数据读写错误!");
  326. return 0;
  327. }
  328. }
  329. SRAM_INFO("SRAM读写测试正常!");
  330. /*检测正常,return 1 */
  331. return 1;
  332. }