[STM32H7] 【STM32H745I-DISCO试用】SDRAM读写测试

[复制链接]
 楼主| tlled 发表于 2025-3-6 23:40 | 显示全部楼层 |阅读模式
<

这篇来学习测试下SDRAM存储器数据的读写。


一、硬件部分


1.1、SDRAM部分电路图
001.png


1.2、SDRAM芯片手册部分
开发板上焊接的芯片型号是IS42S32400,128Mb的SDRAM
芯片内部框图
002.png


1.3、芯片BANK
芯片支持两个BANK段
003.png
开发板的 SDRAM使用了BANK2存储开始地址0xD0000000
004.png


二、程序部分


测试使用官方BSP中的驱动程序


2.1、stm32h745i_discovery_sdram.c

  1. /**
  2.   ******************************************************************************
  3.   * [url=home.php?mod=space&uid=288409]@file[/url]    stm32h745i_discovery_sdram.c
  4.   * [url=home.php?mod=space&uid=187600]@author[/url]  MCD Application Team
  5.   * [url=home.php?mod=space&uid=247401]@brief[/url]   This file includes the SDRAM driver for the MT48LC4M32B2B5-6A memory
  6.   *          device mounted on STM32H745I-DISCO boards.
  7.   @verbatim
  8.   How To use this driver:
  9.   -----------------------
  10.    - This driver is used to drive the MT48LC4M32B2B5-6A SDRAM external memory mounted
  11.      on STM32H745I-DISCO board.
  12.    - This driver does not need a specific component driver for the SDRAM device
  13.      to be included with.

  14.   Driver description:
  15.   ------------------
  16.   + Initialization steps:
  17.      o Initialize the SDRAM external memory using the BSP_SDRAM_Init() function. This
  18.        function includes the MSP layer hardware resources initialization and the
  19.        FMC controller configuration to interface with the external SDRAM memory.
  20.      o It contains the SDRAM initialization sequence to program the SDRAM external
  21.        device using the function BSP_SDRAM_Initialization_sequence(). Note that this
  22.        sequence is standard for all SDRAM devices, but can include some differences
  23.        from a device to another. If it is the case, the right sequence should be
  24.        implemented separately.

  25.   + SDRAM read/write operations
  26.      o SDRAM external memory can be accessed with read/write operations once it is
  27.        initialized.
  28.        Read/write operation can be performed with AHB access using the functions
  29.        BSP_SDRAM_ReadData()/BSP_SDRAM_WriteData(), or by MDMA transfer using the functions
  30.        BSP_SDRAM_ReadData_DMA()/BSP_SDRAM_WriteData_DMA().
  31.      o The AHB access is performed with 32-bit width transaction, the MDMA transfer
  32.        configuration is fixed at single (no burst) word transfer (see the
  33.        SDRAM_MspInit() static function).
  34.      o User can implement his own functions for read/write access with his desired
  35.        configurations.
  36.      o If interrupt mode is used for MDMA transfer, the function BSP_SDRAM_MDMA_IRQHandler()
  37.        is called in IRQ handler file, to serve the generated interrupt once the MDMA
  38.        transfer is complete.
  39.      o You can send a command to the SDRAM device in runtime using the function
  40.        BSP_SDRAM_Sendcmd(), and giving the desired command as parameter chosen between
  41.        the predefined commands of the "FMC_SDRAM_CommandTypeDef" structure.
  42.   @endverbatim
  43.   ******************************************************************************
  44.   * @attention
  45.   *
  46.   * Copyright (c) 2017 STMicroelectronics.
  47.   * All rights reserved.
  48.   *
  49.   * This software is licensed under terms that can be found in the LICENSE file
  50.   * in the root directory of this software component.
  51.   * If no LICENSE file comes with this software, it is provided AS-IS.
  52.   *
  53.   ******************************************************************************
  54.   */

  55. /* Includes ------------------------------------------------------------------*/
  56. #include "stm32h745i_discovery_sdram.h"

  57. /** @addtogroup BSP
  58.   * @{
  59.   */

  60. /** @addtogroup STM32H745I_DISCO
  61.   * @{
  62.   */

  63. /** @defgroup STM32H745I_DISCO_SDRAM SDRAM
  64.   * @{
  65.   */

  66. /** @defgroup STM32H745I_DISCO_SDRAM_Exported_Variables Exported Variables
  67.   * @{
  68.   */
  69. SDRAM_HandleTypeDef hsdram[SDRAM_INSTANCES_NBR];
  70. /**
  71.   * @}
  72.   */

  73. /** @defgroup STM32H745I_DISCO_SDRAM_Private_Variables Private Variables
  74.   * @{
  75.   */
  76. #if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1)
  77. static uint32_t IsMspCallbacksValid = 0;
  78. #endif
  79. /**
  80.   * @}
  81.   */

  82. /** @defgroup STM32H745I_DISCO_SDRAM_Private_Function_Prototypes Private Functions Prototypes
  83.   * @{
  84.   */
  85. static void SDRAM_MspInit(SDRAM_HandleTypeDef  *hSdram);
  86. static void SDRAM_MspDeInit(SDRAM_HandleTypeDef  *hSdram);
  87. /**
  88.   * @}
  89.   */

  90. /** @defgroup STM32H745I_DISCO_SDRAM_Exported_Functions Exported Functions
  91.   * @{
  92.   */

  93. /**
  94.   * @brief  Initializes the SDRAM device.
  95.   * @param Instance  SDRAM Instance
  96.   * @retval BSP status
  97.   */
  98. int32_t BSP_SDRAM_Init(uint32_t Instance)
  99. {
  100.   int32_t ret = BSP_ERROR_NONE;
  101.   static MT48LC4M32B2_Context_t pRegMode;
  102.   if (Instance >= SDRAM_INSTANCES_NBR)
  103.   {
  104.     ret =  BSP_ERROR_WRONG_PARAM;
  105.   }
  106.   else
  107.   {
  108. #if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1)
  109.     /* Register the SDRAM MSP Callbacks */
  110.     if (IsMspCallbacksValid == 0)
  111.     {
  112.       if (BSP_SDRAM_RegisterDefaultMspCallbacks(Instance) != BSP_ERROR_NONE)
  113.       {
  114.         return BSP_ERROR_PERIPH_FAILURE;
  115.       }
  116.     }
  117. #else
  118.     /* Msp SDRAM initialization */
  119.     SDRAM_MspInit(&hsdram[Instance]);
  120. #endif /* USE_HAL_SDRAM_REGISTER_CALLBACKS */
  121.     if (MX_SDRAM_BANK2_Init(&hsdram[Instance], FMC_SDRAM_ROW_BITS_NUM_12, FMC_SDRAM_MEM_BUS_WIDTH_16) != HAL_OK)
  122.     {
  123.       ret = BSP_ERROR_NO_INIT;
  124.     }
  125.     else
  126.     {
  127.       /* External memory mode register configuration */
  128.       pRegMode.TargetBank      = FMC_SDRAM_CMD_TARGET_BANK2;
  129.       pRegMode.RefreshMode     = MT48LC4M32B2_AUTOREFRESH_MODE_CMD;
  130.       pRegMode.RefreshRate     = REFRESH_COUNT;
  131.       pRegMode.BurstLength     = MT48LC4M32B2_BURST_LENGTH_1;
  132.       pRegMode.BurstType       = MT48LC4M32B2_BURST_TYPE_SEQUENTIAL;
  133.       pRegMode.CASLatency      = MT48LC4M32B2_CAS_LATENCY_3;
  134.       pRegMode.OperationMode   = MT48LC4M32B2_OPERATING_MODE_STANDARD;
  135.       pRegMode.WriteBurstMode  = MT48LC4M32B2_WRITEBURST_MODE_SINGLE;

  136.       /* SDRAM initialization sequence */
  137.       if (MT48LC4M32B2_Init(&hsdram[Instance], &pRegMode) != MT48LC4M32B2_OK)
  138.       {
  139.         ret =  BSP_ERROR_COMPONENT_FAILURE;
  140.       }
  141.     }
  142.   }

  143.   return ret;
  144. }

  145. /**
  146.   * @brief  DeInitializes the SDRAM device.
  147.   * @param  Instance  SDRAM Instance
  148.   * @retval BSP status
  149.   */
  150. int32_t BSP_SDRAM_DeInit(uint32_t Instance)
  151. {
  152.   int32_t ret = BSP_ERROR_NONE;

  153.   if (Instance >= SDRAM_INSTANCES_NBR)
  154.   {
  155.     ret =  BSP_ERROR_WRONG_PARAM;
  156.   }
  157.   else
  158.   {
  159.     (void)HAL_SDRAM_DeInit(&hsdram[Instance]);
  160. #if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 0)
  161.     /* SDRAM controller de-initialization */
  162.     SDRAM_MspDeInit(&hsdram[Instance]);
  163. #endif /* (USE_HAL_SDRAM_REGISTER_CALLBACKS == 0) */
  164.   }

  165.   return ret;
  166. }

  167. /**
  168.   * @brief  Initializes the SDRAM periperal.
  169.   * @param  hSdram SDRAM handle
  170.   * @param  RowBitsNumber Number of row to set
  171.   * @param  MemoryDataWidth The momory width 16 or 32bits
  172.   * @retval HAL status
  173.   */
  174. __weak HAL_StatusTypeDef MX_SDRAM_BANK2_Init(SDRAM_HandleTypeDef *hSdram, uint32_t RowBitsNumber,
  175.                                              uint32_t MemoryDataWidth)
  176. {
  177.   FMC_SDRAM_TimingTypeDef sdram_timing;

  178.   /* SDRAM device configuration */
  179.   hsdram->Instance = FMC_SDRAM_DEVICE;

  180.   /* SDRAM handle configuration */
  181.   hSdram->Init.SDBank             = FMC_SDRAM_BANK2;
  182.   hSdram->Init.ColumnBitsNumber   = FMC_SDRAM_COLUMN_BITS_NUM_8;
  183.   hSdram->Init.RowBitsNumber      = RowBitsNumber;
  184.   hSdram->Init.MemoryDataWidth    = MemoryDataWidth;
  185.   hsdram->Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
  186.   hSdram->Init.CASLatency         = FMC_SDRAM_CAS_LATENCY_3;
  187.   hSdram->Init.WriteProtection    = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
  188.   hSdram->Init.SDClockPeriod      = FMC_SDRAM_CLOCK_PERIOD_2;
  189.   hSdram->Init.ReadBurst          = FMC_SDRAM_RBURST_ENABLE;
  190.   hSdram->Init.ReadPipeDelay      = FMC_SDRAM_RPIPE_DELAY_0;

  191.   /* Timing configuration for as SDRAM */
  192.   sdram_timing.LoadToActiveDelay    = 2;
  193.   sdram_timing.ExitSelfRefreshDelay = 7;
  194.   sdram_timing.SelfRefreshTime      = 4;
  195.   sdram_timing.RowCycleDelay        = 7;
  196.   sdram_timing.WriteRecoveryTime    = 2;
  197.   sdram_timing.RPDelay              = 2;
  198.   sdram_timing.RCDDelay             = 2;

  199.   /* SDRAM controller initialization */
  200.   if (HAL_SDRAM_Init(hSdram, &sdram_timing) != HAL_OK)
  201.   {
  202.     return  HAL_ERROR;
  203.   }
  204.   return HAL_OK;
  205. }


  206. #if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1)
  207. /**
  208.   * @brief Default BSP SDRAM Msp Callbacks
  209.   * @param Instance      SDRAM Instance
  210.   * @retval BSP status
  211.   */
  212. int32_t BSP_SDRAM_RegisterDefaultMspCallbacks(uint32_t Instance)
  213. {
  214.   int32_t ret = BSP_ERROR_NONE;

  215.   /* Check if the instance is supported */
  216.   if (Instance >= SDRAM_INSTANCES_NBR)
  217.   {
  218.     ret = BSP_ERROR_WRONG_PARAM;
  219.   }
  220.   else
  221.   {
  222.     /* Register MspInit/MspDeInit Callbacks */
  223.     if (HAL_SDRAM_RegisterCallback(&hsdram[Instance], HAL_SDRAM_MSP_INIT_CB_ID, SDRAM_MspInit) != HAL_OK)
  224.     {
  225.       ret = BSP_ERROR_PERIPH_FAILURE;
  226.     }
  227.     if (HAL_SDRAM_RegisterCallback(&hsdram[Instance], HAL_SDRAM_MSP_DEINIT_CB_ID, SDRAM_MspDeInit) != HAL_OK)
  228.     {
  229.       ret = BSP_ERROR_PERIPH_FAILURE;
  230.     }
  231.     else
  232.     {
  233.       IsMspCallbacksValid = 1;
  234.     }
  235.   }
  236.   /* Return BSP status */
  237.   return ret;
  238. }

  239. /**
  240.   * @brief BSP SDRAM Msp Callback registering
  241.   * @param Instance     SDRAM Instance
  242.   * @param CallBacks    pointer to MspInit/MspDeInit callbacks functions
  243.   * @retval BSP status
  244.   */
  245. int32_t BSP_SDRAM_RegisterMspCallbacks(uint32_t Instance, BSP_SDRAM_Cb_t *CallBacks)
  246. {
  247.   int32_t ret = BSP_ERROR_NONE;

  248.   /* Check if the instance is supported */
  249.   if (Instance >= SDRAM_INSTANCES_NBR)
  250.   {
  251.     ret = BSP_ERROR_WRONG_PARAM;
  252.   }
  253.   else
  254.   {
  255.     /* Register MspInit/MspDeInit Callbacks */
  256.     if (HAL_SDRAM_RegisterCallback(&hsdram[Instance], HAL_SDRAM_MSP_INIT_CB_ID, CallBacks->pMspInitCb) != HAL_OK)
  257.     {
  258.       ret = BSP_ERROR_PERIPH_FAILURE;
  259.     }
  260.     if (HAL_SDRAM_RegisterCallback(&hsdram[Instance], HAL_SDRAM_MSP_DEINIT_CB_ID, CallBacks->pMspDeInitCb) != HAL_OK)
  261.     {
  262.       ret = BSP_ERROR_PERIPH_FAILURE;
  263.     }
  264.     else
  265.     {
  266.       IsMspCallbacksValid = 1;
  267.     }
  268.   }
  269.   /* Return BSP status */
  270.   return ret;
  271. }
  272. #endif /* (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1) */

  273. /**
  274.   * @brief  Sends command to the SDRAM bank.
  275.   * @param  Instance  SDRAM Instance
  276.   * @param  SdramCmd  Pointer to SDRAM command structure
  277.   * @retval BSP status
  278.   */
  279. int32_t BSP_SDRAM_SendCmd(uint32_t Instance, FMC_SDRAM_CommandTypeDef *SdramCmd)
  280. {
  281.   int32_t ret;

  282.   if (Instance >= SDRAM_INSTANCES_NBR)
  283.   {
  284.     ret =  BSP_ERROR_WRONG_PARAM;
  285.   }
  286.   else if (MT48LC4M32B2_Sendcmd(&hsdram[Instance], SdramCmd) != MT48LC4M32B2_OK)
  287.   {
  288.     ret = BSP_ERROR_PERIPH_FAILURE;
  289.   }
  290.   else
  291.   {
  292.     ret = BSP_ERROR_NONE;
  293.   }

  294.   return ret;
  295. }

  296. /**
  297.   * @brief  This function handles SDRAM MDMA interrupt request.
  298.   * @param  Instance SDRAM instance
  299.   * @retval None
  300.   */
  301. void BSP_SDRAM_IRQHandler(uint32_t Instance)
  302. {
  303.   HAL_MDMA_IRQHandler(hsdram[Instance].hmdma);
  304. }

  305. /**
  306.   * @}
  307.   */

  308. /** @defgroup STM32H745I_DISCO_SDRAM_Private_Functions Private Functions
  309.   * @{
  310.   */
  311. /**
  312.   * @brief  Initializes SDRAM MSP.
  313.   * @param  hSdram SDRAM handle
  314.   * @retval None
  315.   */
  316. static void SDRAM_MspInit(SDRAM_HandleTypeDef  *hSdram)
  317. {
  318.   static MDMA_HandleTypeDef mdma_handle;
  319.   GPIO_InitTypeDef gpio_init_structure;

  320.   /* Enable FMC clock */
  321.   __HAL_RCC_FMC_CLK_ENABLE();

  322.   /* Enable chosen MDMAx clock */
  323.   SDRAM_MDMAx_CLK_ENABLE();

  324.   /* Enable GPIOs clock */
  325.   __HAL_RCC_GPIOD_CLK_ENABLE();
  326.   __HAL_RCC_GPIOE_CLK_ENABLE();
  327.   __HAL_RCC_GPIOF_CLK_ENABLE();
  328.   __HAL_RCC_GPIOG_CLK_ENABLE();
  329.   __HAL_RCC_GPIOH_CLK_ENABLE();

  330.   /* Common GPIO configuration */
  331.   gpio_init_structure.Mode      = GPIO_MODE_AF_PP;
  332.   gpio_init_structure.Pull      = GPIO_PULLUP;
  333.   gpio_init_structure.Speed     = GPIO_SPEED_FREQ_VERY_HIGH;
  334.   gpio_init_structure.Alternate = GPIO_AF12_FMC;

  335.   /* GPIOD configuration */
  336.   gpio_init_structure.Pin   = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | \
  337.                               GPIO_PIN_14 | GPIO_PIN_15;


  338.   HAL_GPIO_Init(GPIOD, &gpio_init_structure);

  339.   /* GPIOE configuration */
  340.   gpio_init_structure.Pin   = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | \
  341.                               GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | \
  342.                               GPIO_PIN_15;

  343.   HAL_GPIO_Init(GPIOE, &gpio_init_structure);

  344.   /* GPIOF configuration */
  345.   gpio_init_structure.Pin   = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | \
  346.                               GPIO_PIN_5 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | \
  347.                               GPIO_PIN_15;

  348.   HAL_GPIO_Init(GPIOF, &gpio_init_structure);

  349.   /* GPIOG configuration */
  350.   gpio_init_structure.Pin   = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_15;
  351.   HAL_GPIO_Init(GPIOG, &gpio_init_structure);

  352.   /* GPIOH configuration */
  353.   gpio_init_structure.Pin   = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 ;
  354.   HAL_GPIO_Init(GPIOH, &gpio_init_structure);


  355.   /* Configure common MDMA parameters */
  356.   mdma_handle.Init.Request = MDMA_REQUEST_SW;
  357.   mdma_handle.Init.TransferTriggerMode = MDMA_BLOCK_TRANSFER;
  358.   mdma_handle.Init.Priority = MDMA_PRIORITY_HIGH;
  359.   mdma_handle.Init.Endianness = MDMA_LITTLE_ENDIANNESS_PRESERVE;
  360.   mdma_handle.Init.SourceInc = MDMA_SRC_INC_WORD;
  361.   mdma_handle.Init.DestinationInc = MDMA_DEST_INC_WORD;
  362.   mdma_handle.Init.SourceDataSize = MDMA_SRC_DATASIZE_WORD;
  363.   mdma_handle.Init.DestDataSize = MDMA_DEST_DATASIZE_WORD;
  364.   mdma_handle.Init.DataAlignment = MDMA_DATAALIGN_PACKENABLE;
  365.   mdma_handle.Init.SourceBurst = MDMA_SOURCE_BURST_SINGLE;
  366.   mdma_handle.Init.DestBurst = MDMA_DEST_BURST_SINGLE;
  367.   mdma_handle.Init.BufferTransferLength = 128;
  368.   mdma_handle.Init.SourceBlockAddressOffset = 0;
  369.   mdma_handle.Init.DestBlockAddressOffset = 0;


  370.   mdma_handle.Instance = SDRAM_MDMAx_CHANNEL;

  371.   /* Associate the DMA handle */
  372.   __HAL_LINKDMA(hsdram, hmdma, mdma_handle);

  373.   /* Deinitialize the stream for new transfer */
  374.   HAL_MDMA_DeInit(&mdma_handle);

  375.   /* Configure the DMA stream */
  376.   HAL_MDMA_Init(&mdma_handle);

  377.   /* NVIC configuration for DMA transfer complete interrupt */
  378.   HAL_NVIC_SetPriority(SDRAM_MDMAx_IRQn, 0x0F, 0);
  379.   HAL_NVIC_EnableIRQ(SDRAM_MDMAx_IRQn);
  380. }

  381. /**
  382.   * @brief  DeInitializes SDRAM MSP.
  383.   * @param  hSdram SDRAM handle
  384.   * @retval None
  385.   */
  386. static void SDRAM_MspDeInit(SDRAM_HandleTypeDef  *hSdram)
  387. {
  388.   static MDMA_HandleTypeDef mdma_handle;

  389.   /* Prevent unused argument(s) compilation warning */
  390.   UNUSED(hSdram);

  391.   /* Disable NVIC configuration for DMA interrupt */
  392.   HAL_NVIC_DisableIRQ(SDRAM_MDMAx_IRQn);

  393.   /* Deinitialize the stream for new transfer */
  394.   mdma_handle.Instance = SDRAM_MDMAx_CHANNEL;
  395.   (void)HAL_MDMA_DeInit(&mdma_handle);
  396. }

  397. /**
  398.   * @}
  399.   */

  400. /**
  401.   * @}
  402.   */

  403. /**
  404.   * @}
  405.   */

  406. /**
  407.   * @}
  408.   */


2.2、main.c
程序中定义0xD0070000地址开始的一段存储区域
  1. #include "main.h"

  2. uint16_t sdram[2000] __attribute__((at(0xD0070000)));

  3. static void MPU_Config(void);
  4. static void SystemClock_Config(void);
  5. static void CPU_CACHE_Enable(void);
  6. static void Error_Handler(void);


  7. void sdram_test(void)
  8. {
  9.         uint32_t ts=0;
  10.         printf("\r\nwrite data test:\r\n");
  11.        
  12.         for(ts=0;ts<1024;ts++)
  13.         {
  14.                 sdram[ts]=ts;
  15.                 if(ts%60==0)
  16.                 {
  17.                         printf("\r\n");
  18.                 }
  19.                 printf("%x ",sdram[ts]);
  20.         }
  21.        
  22.         printf("\r\n");
  23.         printf("\r\n");
  24.         printf("\r\nread data test:\r\n");
  25.        

  26.         for(ts=0;ts<1024;ts++)
  27.         {
  28.                 sdram[ts]=ts;
  29.                 if(ts%60==0)
  30.                 {
  31.                         printf("\r\n");
  32.                 }
  33.                 printf("%x ",sdram[ts]);
  34.         }       
  35. }


  36. int main(void)
  37. {
  38.         uint32_t i=0;
  39.   MPU_Config();
  40.   CPU_CACHE_Enable();
  41.   HAL_Init();
  42.   SystemClock_Config();

  43.         init_delay(400);
  44.         init_led();
  45.         init_uart3(115200);

  46.         if(BSP_SDRAM_Init(0) != BSP_ERROR_NONE)
  47.         {
  48.                 printf("SDRAM Initialization : FAILED.\r\n");
  49.         }
  50.         else
  51.         {
  52.                 printf("SDRAM Initialization : OK.");
  53.         }
  54.        
  55.         sdram_test();

  56.   while (1)
  57.   {
  58.                 LED6_TOGGLE();
  59.                 HAL_Delay(100);
  60.   }
  61. }


三、运行结果

下载程序后,串口输出写入和读出数据的内容
005.png




flycamelaaa 发表于 2025-4-9 12:29 | 显示全部楼层
进来了就学习学习。
yangjiaxu 发表于 2025-4-9 14:31 | 显示全部楼层
话说,SDRAM的电路设计,需要等长吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

701

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部

132

主题

701

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部