drv_sram.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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. * 2020-02-23 Malongwei first version
  9. */
  10. #include <rtthread.h>
  11. #include <rtdevice.h>
  12. #include <board.h>
  13. #ifdef BSP_USING_SRAM
  14. #include "drv_sram.h"
  15. #define DRV_DEBUG
  16. #define LOG_TAG "drv.sram"
  17. #include <drv_log.h>
  18. #ifdef RT_USING_MEMHEAP_AS_HEAP
  19. static struct rt_memheap system_heap;
  20. #endif
  21. static SRAM_HandleTypeDef hsram;
  22. static int rt_hw_sram_init(void)
  23. {
  24. int result = RT_EOK;
  25. FSMC_NORSRAM_TimingTypeDef Timing = {0};
  26. /** Perform the SRAM2 memory initialization sequence
  27. */
  28. hsram.Instance = FSMC_NORSRAM_DEVICE;
  29. hsram.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
  30. /* hsram.Init */
  31. hsram.Init.NSBank = FSMC_NORSRAM_BANK3;
  32. hsram.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
  33. hsram.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
  34. #if SRAM_DATA_WIDTH == 8
  35. hsram.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_8;
  36. #elif SRAM_DATA_WIDTH == 16
  37. hsram.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;
  38. #else
  39. hsram.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_32;
  40. #endif
  41. hsram.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
  42. hsram.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
  43. hsram.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
  44. hsram.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
  45. hsram.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
  46. hsram.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
  47. hsram.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
  48. hsram.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
  49. hsram.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
  50. hsram.Init.PageSize = FSMC_PAGE_SIZE_NONE;
  51. /* Timing */
  52. Timing.AddressSetupTime = 0;
  53. Timing.AddressHoldTime = 0;
  54. Timing.DataSetupTime = 8;
  55. Timing.BusTurnAroundDuration = 0;
  56. Timing.CLKDivision = 0;
  57. Timing.DataLatency = 0;
  58. Timing.AccessMode = FSMC_ACCESS_MODE_A;
  59. /* ExtTiming */
  60. if (HAL_SRAM_Init(&hsram, &Timing, &Timing) != HAL_OK)
  61. {
  62. LOG_E("SRAM init failed!");
  63. result = -RT_ERROR;
  64. }
  65. else
  66. {
  67. 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);
  68. #ifdef RT_USING_MEMHEAP_AS_HEAP
  69. /* If RT_USING_MEMHEAP_AS_HEAP is enabled, SRAM is initialized to the heap */
  70. rt_memheap_init(&system_heap, "sram", (void *)SRAM_BANK_ADDR, SRAM_SIZE);
  71. #endif
  72. }
  73. return result;
  74. }
  75. INIT_BOARD_EXPORT(rt_hw_sram_init);
  76. #ifdef DRV_DEBUG
  77. #ifdef FINSH_USING_MSH
  78. static int sram_test(void)
  79. {
  80. int i = 0;
  81. uint32_t start_time = 0, time_cast = 0;
  82. #if SRAM_DATA_WIDTH == 8
  83. char data_width = 1;
  84. uint8_t data = 0;
  85. #elif SRAM_DATA_WIDTH == 16
  86. char data_width = 2;
  87. uint16_t data = 0;
  88. #else
  89. char data_width = 4;
  90. uint32_t data = 0;
  91. #endif
  92. /* write data */
  93. LOG_D("Writing the %ld bytes data, waiting....", SRAM_SIZE);
  94. start_time = rt_tick_get();
  95. for (i = 0; i < SRAM_SIZE / data_width; i++)
  96. {
  97. #if SRAM_DATA_WIDTH == 8
  98. *(__IO uint8_t *)(SRAM_BANK_ADDR + i * data_width) = (uint8_t)0x55;
  99. #elif SRAM_DATA_WIDTH == 16
  100. *(__IO uint16_t *)(SRAM_BANK_ADDR + i * data_width) = (uint16_t)0x5555;
  101. #else
  102. *(__IO uint32_t *)(SRAM_BANK_ADDR + i * data_width) = (uint32_t)0x55555555;
  103. #endif
  104. }
  105. time_cast = rt_tick_get() - start_time;
  106. LOG_D("Write data success, total time: %d.%03dS.", time_cast / RT_TICK_PER_SECOND,
  107. time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000));
  108. /* read data */
  109. LOG_D("start Reading and verifying data, waiting....");
  110. for (i = 0; i < SRAM_SIZE / data_width; i++)
  111. {
  112. #if SRAM_DATA_WIDTH == 8
  113. data = *(__IO uint8_t *)(SRAM_BANK_ADDR + i * data_width);
  114. if (data != 0x55)
  115. {
  116. LOG_E("SRAM test failed!");
  117. break;
  118. }
  119. #elif SRAM_DATA_WIDTH == 16
  120. data = *(__IO uint16_t *)(SRAM_BANK_ADDR + i * data_width);
  121. if (data != 0x5555)
  122. {
  123. LOG_E("SRAM test failed!");
  124. break;
  125. }
  126. #else
  127. data = *(__IO uint32_t *)(SRAM_BANK_ADDR + i * data_width);
  128. if (data != 0x55555555)
  129. {
  130. LOG_E("SRAM test failed!");
  131. break;
  132. }
  133. #endif
  134. }
  135. if (i >= SRAM_SIZE / data_width)
  136. {
  137. LOG_D("SRAM test success!");
  138. }
  139. return RT_EOK;
  140. }
  141. MSH_CMD_EXPORT(sram_test, sram test);
  142. #endif /* FINSH_USING_MSH */
  143. #endif /* DRV_DEBUG */
  144. #endif /* BSP_USING_SRAM */