test_sdram.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. /*
  2. * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-12-30 CDT first version
  9. */
  10. /*
  11. * 程序清单:SDRAM 设备使用例程,例程导出了sdram_sample命令到控制终端
  12. * 命令调用格式:sdram_sample
  13. * 程序功能:以8/16/32bit方式分别对整个SDRAM存储空间进行写和读操作,比较数据是否一致
  14. *
  15. * 注意:
  16. * F4A0: 修改函数SystemClock_Config,调用函数CLK_SetClockDiv参数,CLK_EXCLK_DIV2改为CLK_EXCLK_DIV8(EXCLK: 30MHz);
  17. *
  18. * menuconfig:
  19. * Hardware Drivers Config ---> Onboard Peripheral Drivers ----> Enable EXMC ----> Using SDRAM or NAND ----> Using SDRAM
  20. */
  21. #include <rtthread.h>
  22. #include <rtdevice.h>
  23. #include <board.h>
  24. #if defined(BSP_USING_EXMC) && defined(BSP_USING_SDRAM)
  25. #include "sdram_port.h"
  26. static rt_err_t sdram_8bit_test(void)
  27. {
  28. rt_uint32_t i;
  29. rt_uint32_t start_time;
  30. rt_uint32_t time_cast;
  31. const char data_width = 1;
  32. rt_uint8_t data = 0;
  33. rt_err_t err = RT_EOK;
  34. rt_kprintf("\r\n************************* %s *************************\r\n", __func__);
  35. /* write data */
  36. rt_kprintf("writing the 0x%08X bytes data, waiting....\r\n", SDRAM_SIZE);
  37. start_time = rt_tick_get();
  38. for (i = 0; i < SDRAM_SIZE / data_width; i++)
  39. {
  40. *(__IO uint8_t *)(SDRAM_BANK_ADDR + i * data_width) = (uint8_t)(i % 100);
  41. }
  42. time_cast = rt_tick_get() - start_time;
  43. rt_kprintf("write data success, total time: %d.%03dS.\r\n", time_cast / RT_TICK_PER_SECOND,
  44. time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000));
  45. /* read data */
  46. rt_kprintf("start reading and verifying data, waiting....\r\n");
  47. for (i = 0; i < SDRAM_SIZE / data_width; i++)
  48. {
  49. data = *(__IO uint8_t *)(SDRAM_BANK_ADDR + i * data_width);
  50. if (data != i % 100)
  51. {
  52. err = -RT_ERROR;
  53. rt_kprintf("SDRAM test failed!\r\n");
  54. break;
  55. }
  56. }
  57. if (i >= SDRAM_SIZE / data_width)
  58. {
  59. rt_kprintf("SDRAM test success!\r\n");
  60. }
  61. return err;
  62. }
  63. static rt_err_t sdram_16bit_test(void)
  64. {
  65. rt_uint32_t i;
  66. rt_uint32_t start_time;
  67. rt_uint32_t time_cast;
  68. const char data_width = 2;
  69. rt_uint16_t data = 0;
  70. rt_err_t err = RT_EOK;
  71. rt_kprintf("\r\n************************* %s *************************\r\n", __func__);
  72. /* write data */
  73. rt_kprintf("writing the 0x%08X haflword data, waiting....\r\n", SDRAM_SIZE / data_width);
  74. start_time = rt_tick_get();
  75. for (i = 0; i < SDRAM_SIZE / data_width; i++)
  76. {
  77. *(__IO uint16_t *)(SDRAM_BANK_ADDR + i * data_width) = (uint16_t)(i % 1000);
  78. }
  79. time_cast = rt_tick_get() - start_time;
  80. rt_kprintf("write data success, total time: %d.%03dS.\r\n", time_cast / RT_TICK_PER_SECOND,
  81. time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000));
  82. /* read data */
  83. rt_kprintf("start reading and verifying data, waiting....\r\n");
  84. for (i = 0; i < SDRAM_SIZE / data_width; i++)
  85. {
  86. data = *(__IO uint16_t *)(SDRAM_BANK_ADDR + i * data_width);
  87. if (data != i % 1000)
  88. {
  89. err = -RT_ERROR;
  90. rt_kprintf("SDRAM test failed!\r\n");
  91. break;
  92. }
  93. }
  94. if (i >= SDRAM_SIZE / data_width)
  95. {
  96. rt_kprintf("SDRAM test success!\r\n");
  97. }
  98. return err;
  99. }
  100. static rt_err_t sdram_32bit_test(void)
  101. {
  102. rt_uint32_t i;
  103. rt_uint32_t start_time;
  104. rt_uint32_t time_cast;
  105. const char data_width = 4;
  106. rt_uint32_t data = 0;
  107. rt_err_t err = RT_EOK;
  108. rt_kprintf("\r\n************************* %s *************************\r\n", __func__);
  109. /* write data */
  110. rt_kprintf("writing the 0x%08X bytes data, waiting....\r\n", SDRAM_SIZE / data_width);
  111. start_time = rt_tick_get();
  112. for (i = 0; i < SDRAM_SIZE / data_width; i++)
  113. {
  114. *(__IO uint32_t *)(SDRAM_BANK_ADDR + i * data_width) = (uint32_t)(i % 10000);
  115. }
  116. time_cast = rt_tick_get() - start_time;
  117. rt_kprintf("write data success, total time: %d.%03dS.\r\n", time_cast / RT_TICK_PER_SECOND,
  118. time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000));
  119. /* read data */
  120. rt_kprintf("start reading and verifying data, waiting....\r\n");
  121. for (i = 0; i < SDRAM_SIZE / data_width; i++)
  122. {
  123. data = *(__IO uint32_t *)(SDRAM_BANK_ADDR + i * data_width);
  124. if (data != i % 10000)
  125. {
  126. err = -RT_ERROR;
  127. rt_kprintf("SDRAM test failed!\r\n");
  128. break;
  129. }
  130. }
  131. if (i >= SDRAM_SIZE / data_width)
  132. {
  133. rt_kprintf("SDRAM test success!\r\n");
  134. }
  135. return err;
  136. }
  137. static void sdram_thread_entry(void *parameter)
  138. {
  139. while (1)
  140. {
  141. sdram_8bit_test();
  142. rt_thread_mdelay(1000);
  143. sdram_16bit_test();
  144. rt_thread_mdelay(1000);
  145. sdram_32bit_test();
  146. rt_thread_mdelay(1000);
  147. }
  148. }
  149. static void sdram_sample(int argc, char *argv[])
  150. {
  151. rt_thread_t thread = rt_thread_create("sdram", sdram_thread_entry, RT_NULL, 2048, 15, 10);
  152. if (thread != RT_NULL)
  153. {
  154. rt_thread_startup(thread);
  155. }
  156. }
  157. MSH_CMD_EXPORT(sdram_sample, sdram sample);
  158. #endif