drv_sram.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-12-04 zylx first version
  9. */
  10. #include <rtthread.h>
  11. #include <rtdevice.h>
  12. #include <board.h>
  13. #ifdef BSP_USING_SRAM
  14. #include <sram_port.h>
  15. #define DRV_DEBUG
  16. #define LOG_TAG "drv.sram"
  17. #include <drv_log.h>
  18. static SRAM_HandleTypeDef hsram;
  19. static FMC_NORSRAM_TimingTypeDef SRAM_Timing;
  20. #ifdef RT_USING_MEMHEAP_AS_HEAP
  21. static struct rt_memheap system_heap;
  22. #endif
  23. static int SRAM_Init(void)
  24. {
  25. int result = RT_EOK;
  26. /* SRAM device configuration */
  27. hsram.Instance = FMC_NORSRAM_DEVICE;
  28. hsram.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
  29. /* SRAM device configuration */
  30. SRAM_Timing.AddressSetupTime = ADDRESSSETUPTIME;
  31. SRAM_Timing.AddressHoldTime = ADDRESSHOLDTIME; /* Min value, Don't care on SRAM Access mode A */
  32. SRAM_Timing.DataSetupTime = DATASETUPTIME;
  33. SRAM_Timing.DataHoldTime = DATAHOLDTIME;
  34. SRAM_Timing.BusTurnAroundDuration = BUSTURNAROUNDDURATION;
  35. SRAM_Timing.CLKDivision = CLKDIVISION; /* Min value, Don't care on SRAM Access mode A */
  36. SRAM_Timing.DataLatency = DATALATENCY; /* Min value, Don't care on SRAM Access mode A */
  37. SRAM_Timing.AccessMode = ACCESSMODE;
  38. hsram.Init.NSBank = FMC_NORSRAM_BANK1;
  39. hsram.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
  40. hsram.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
  41. #if SRAM_DATA_WIDTH == 8
  42. hsram.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_8;
  43. #elif SRAM_DATA_WIDTH == 16
  44. hsram.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
  45. #else
  46. hsram.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_32;
  47. #endif
  48. hsram.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
  49. hsram.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
  50. hsram.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
  51. hsram.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
  52. hsram.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
  53. hsram.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
  54. hsram.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
  55. hsram.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
  56. hsram.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  57. hsram.Init.WriteFifo = FMC_WRITE_FIFO_DISABLE;
  58. hsram.Init.NBLSetupTime = 0;
  59. hsram.Init.PageSize = FMC_PAGE_SIZE_NONE;
  60. /* Initialize the SRAM controller */
  61. if (HAL_SRAM_Init(&hsram, &SRAM_Timing, &SRAM_Timing) != HAL_OK)
  62. {
  63. LOG_E("SRAM init failed!");
  64. result = -RT_ERROR;
  65. }
  66. else
  67. {
  68. LOG_D("sram init success, mapped at 0x%X, size is %d bytes, data width is %d", SRAM_BANK_ADDR, SRAM_SIZE, SRAM_DATA_WIDTH);
  69. #ifdef RT_USING_MEMHEAP_AS_HEAP
  70. /* If RT_USING_MEMHEAP_AS_HEAP is enabled, SRAM is initialized to the heap */
  71. rt_memheap_init(&system_heap, "sram", (void *)SRAM_BANK_ADDR, SRAM_SIZE);
  72. #endif
  73. }
  74. return result;
  75. }
  76. INIT_BOARD_EXPORT(SRAM_Init);
  77. #ifdef DRV_DEBUG
  78. #ifdef FINSH_USING_MSH
  79. int sram_test(void)
  80. {
  81. int i = 0;
  82. uint32_t start_time = 0, time_cast = 0;
  83. #if SRAM_DATA_WIDTH == 8
  84. char data_width = 1;
  85. uint8_t data = 0;
  86. uint8_t *ptr = (uint8_t *)SRAM_BANK_ADDR;
  87. #elif SRAM_DATA_WIDTH == 16
  88. char data_width = 2;
  89. uint16_t data = 0;
  90. uint16_t *ptr = (uint16_t *)SRAM_BANK_ADDR;
  91. #else
  92. char data_width = 4;
  93. uint32_t data = 0;
  94. uint32_t *ptr = (uint32_t *)SRAM_BANK_ADDR;
  95. #endif
  96. /* write data */
  97. LOG_D("Writing the %ld bytes data, waiting....", SRAM_SIZE);
  98. start_time = rt_tick_get();
  99. for (i = 0; i < SRAM_SIZE / data_width; i++)
  100. {
  101. #if SRAM_DATA_WIDTH == 8
  102. ((__IO uint8_t *)ptr)[i] = (uint8_t)0x55;
  103. #elif SRAM_DATA_WIDTH == 16
  104. ((__IO uint16_t *)ptr)[i] = (uint16_t)0x5555;
  105. #else
  106. ((__IO uint32_t *)ptr)[i] = (uint32_t)0x55555555;
  107. #endif
  108. }
  109. time_cast = rt_tick_get() - start_time;
  110. LOG_D("Write data success, total time: %d.%03dS.", time_cast / RT_TICK_PER_SECOND,
  111. time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000));
  112. /* read data */
  113. LOG_D("start Reading and verifying data, waiting....");
  114. for (i = 0; i < SRAM_SIZE / data_width; i++)
  115. {
  116. #if SRAM_DATA_WIDTH == 8
  117. data = ((__IO uint8_t *)ptr)[i];
  118. if (data != 0x55)
  119. {
  120. LOG_E("SRAM test failed!");
  121. break;
  122. }
  123. #elif SRAM_DATA_WIDTH == 16
  124. data = ((__IO uint16_t *)ptr)[i];
  125. if (data != 0x5555)
  126. {
  127. LOG_E("SRAM test failed!");
  128. break;
  129. }
  130. #else
  131. data = ((__IO uint32_t *)ptr)[i];
  132. if (data != 0x55555555)
  133. {
  134. LOG_E("SRAM test failed!");
  135. break;
  136. }
  137. #endif
  138. }
  139. if (i >= SRAM_SIZE / data_width)
  140. {
  141. LOG_D("SRAM test success!");
  142. }
  143. return RT_EOK;
  144. }
  145. MSH_CMD_EXPORT(sram_test, sram test);
  146. #endif /* FINSH_USING_MSH */
  147. #endif /* DRV_DEBUG */
  148. #endif /* BSP_USING_SRAM */