【GD32450I-EVAL】+ 06SDRAM介绍

[复制链接]
683|2
手机看帖
扫描二维码
随时随地手机跟帖
flycamelaaa|  楼主 | 2021-5-7 10:16 | 显示全部楼层 |阅读模式
1 SDRAM

         RAM,可以理解为内存,程序在运行时需要的空间,GD32F450IK自带256K的RAM,当需要大内存的场合,就需要扩展RAM了。这块开发板上就搭配了一颗MT48LC16M16A2P的SDRAM。

1.1 SDRAM数据存储基本原理

          板子上的SDRAM型号为:MT48LC16M16A2P-6AIT,它的原理图如下:

170943cnqvhm9m9j9q936v.png.thumb.jpg


           每个引脚的作用如下表所示:

170944s7zztgbuncn0o7t7.png.thumb.jpg


         SDRAM内部分为多个叫做 Bank 的 区域,允许设备以交错的方式进行访问,以获取更大的并发性和数据传输量。 每个Bank 可以认为是一个矩阵,其中每个地址对应存储器存储宽度的空间,矩阵 由行和列构成,因此存储器的Bank大小可以认为是存储器数据宽度行数列 数。

        如下图所示,对于这个存储阵列,我们可以将其看成是一个表格,只需要给定行地址和列地址,就可以确定其唯一位置,这就是SDRAM寻址的基本原理。而一个SDRAM芯片内部,一般又有4个这样的存储单元(BANK0~BANK3),所以,在SDRAM内部寻址的时候,先指定BANK号和行地址,然后再指定列地址,就可以查找到目标地址。

170946gms2797ss89enzqs.png.thumb.jpg


      SDRAM寻址的时候:

           1 首先RAS信号为低电平,选通行地址,地址线A0~A12所表示的地址,会被传输并锁存到行地址译码器里面,作为行地址,

           2 同时BANK地址线上面的BS0,BS1所表示的BANK地址,也会被锁存,选中对应的BANK,

           3 然后,CAS信号为低电平,选通列地址,地址线A0~A12所表示的地址,会被传输并锁存到列地址译码器里面,作为列地址,

      这样,就完成了一次寻址。


1.2 板载SDRAM型号分析

      再来看一下MT48LC16M16A2P-6AIT这个型号的命名含义,可以查看它的数据手册:

172226sdwwrtt00wf28r9t.png.thumb.jpg


      这里还有一些表格介绍:

170946lfel51vb6kaxlr2f.png.thumb.jpg


      MT48LC16M16A2P-6AIT的存储结构为:

  • 行地址:8192个(8K)
  • 列地址:512个
  • BANK数:4个
  • 位宽:16位

     这样,整个芯片的容量为8192*512*4*16=32M 字节。

1.3 SDRAM控制逻辑

       控制SDRAM需要用到一系列的命令,各种信号线状态组合产生不同的控制命令。

      由于数据易失的特性, SDRAM 需要周期性的刷新。 EXMC 支持两种刷新模式,自刷新和自动刷新 。 自刷新是在EXMC挂起的低功耗模式 中使用, 由 SDRAM 内部计数提供 时钟,内部进行刷新。 自动刷新是由EXMC 周期 性的 提供 刷新命令, 因为此时SDRAM 需要进行数据传输 ,刷新间隔由寄存器 EXMC_SDARI 位 ARINTV 决定 ,连续刷新次数由寄存器 EXMC_SDCMD 位NARF 决定 。

170947rb64migm0myjiipy.png.thumb.jpg


         DRAM并不是上电后立即就可以开始读写数据的,它需要按步骤进行初始化,对存储矩阵进行预充电、刷新并设置模式寄存器等。

        SDRAM初始化过程:

170947ithsb8szujs0g0s5.png.thumb.jpg


  • 上电

               给SDRAM供电,使能CLK时钟,注意上电后,要等待最少200us,再发送其他指令。

  • 发送NOP

               发送NOP(No Operation命令)

  • 发送PRECHARGE

              发送预充电命令,给所有Bank预充电。

  • 发送AUTO REFRESH

               至少要发送发送8次自刷新命令, 每一个自刷新命令之间的间隔时间为tRFC。

  • 设置LOAD MODE REGISTER

               发送模式寄存器的值,配置SDRAM的工作参数。配置完成后,需要等待tMRD(也叫tRSC),使模式寄存器的配置生效,才能发送其他命令。

  • 完成

              经过前面的操作,SDRAM的初始化就完成了,接下来就可以发送激活命令和读/写命令,进行数据的读/写了。

2 EXMC

         GD32的外部存储器控制器 EXMC ,用来访问各种片外存储器,通过配置寄存器, EXMC 可以把 AMBA协议转换为专用的片外存储器通信协议, 包括 SRAM、ROM、NOR Flash、NAND Flash、PC Card 和 SDRAM 。用户还可以调整相关的时间参数来提高通信效率 。 EXMC模块划分为许多个子Bank ,每个Bank支持特定的存储器类型,用户可以通过对 Bank 的寄存器配置来控制外部存储器。

         EXMC由 6 个模块组成: AHB总线 接口, EXMC 配置 寄存器, NOR/PSRAM 控制器 NAND/PC Card 控制器 SDRAM 控制器 和外部设备接口。 AHB 时钟 HCLK 是参考 时钟。

170949tdxd22oc2oc227rr.png.thumb.jpg


          EXMC将外部存储器分成多个Bank,每个Bank占256M字节,其中Bank0又分为4个Region,每个Region占64M字节。Bank1和Bank2又都被分成2个Section,分别是属性存储空间和通用存储空间。Bank3分成3个Section,分别是属性存储空间,通用存储空间和I/O存储空间。每个Bank和Region都有独立的片选控制信号,也都能进行独立的配置。

  • Bank0用于访问NOR、PSRAM设备。
  • Bank1和Bank2用于连接NAND Flash,且每个Bank连接一个NAND。
  • Bank3用于连接PC卡。
  • SDRAM Device0和SDRAM Device1用于连接SDRAM。

170948mx07zy01zv1hexon.png.thumb.jpg


           EXMC 把SDRAM的存储区域分成了device0 和device01两块,SDRAM 地址映射如下图:

170948npcflpp9gj1waf8m.png.thumb.jpg


3 程序分析

       看一下SDRAM例程,首先是主函数:

  • int main(void)
  • {
  •     uint16_t i = 0;
  •     /* LED initialize */
  •     gd_eval_led_init(LED1);
  •     gd_eval_led_init(LED3);
  •     /* systick clock configure */
  •     systick_config();
  •     /* config the USART */
  •     gd_eval_com_init(EVAL_COM1);
  •        
  •         /* fill txbuffer */
  •     fill_buffer(txbuffer, BUFFER_SIZE, 0x0000);
  •         //===============SDRAM初始化===================
  •     /* config the EXMC access mode */
  •     exmc_synchronous_dynamic_ram_init(EXMC_SDRAM_DEVICE0);//SDRAM device0: 0x00000004U
  •     printf("\r\nSDRAM initialized!");
  •     delay_1ms(1000);
  •         //===============写入SDRAM===================
  •     printf("\r\nSDRAM write data...");
  •     delay_1ms(1000);
  •     /* write data to SDRAM */
  •     sdram_writebuffer_8(EXMC_SDRAM_DEVICE0,txbuffer, WRITE_READ_ADDR, BUFFER_SIZE);
  •         //===============读取SDRAM===================
  •     printf("\r\nSDRAM read data...");
  •     delay_1ms(1000);
  •     /* read data from SDRAM */
  •     sdram_readbuffer_8(EXMC_SDRAM_DEVICE0,rxbuffer, WRITE_READ_ADDR, BUFFER_SIZE);
  •         //===============检查写入与读出的是否相同===================
  •     printf("\r\nCheck the data!");
  •     delay_1ms(1000);
  •     /* compare two buffers */
  •     for(i = 0;i < BUFFER_SIZE;i++)
  •         {
  •         if (rxbuffer != txbuffer)
  •                 {
  •             writereadstatus ++;
  •             break;
  •         }
  •     }
  •     if(writereadstatus)
  •         {
  •         printf("\r\nSDRAM test failed!");
  •         /* failure, light on LED3 */
  •         gd_eval_led_on(LED3);
  •     }
  •         else
  •         {
  •         printf("\r\nSDRAM test successed!");
  •         delay_1ms(1000);
  •         printf("\r\nThe data is:\r\n");
  •         delay_1ms(1000);
  •         for(i=0;i < BUFFER_SIZE;i++)
  •                 {
  •             printf("%6x",rxbuffer);
  •             if(((i+1)%16) == 0)
  •                         {
  •                 printf("\r\n");
  •             }
  •         }
  •         /* success, light on LED1 */
  •         gd_eval_led_on(LED1);
  •     }
  •     while(1);
  • }

       先是各种外设初始化以及SDRAM的初始化,然后写入特定数据到SDRAM,再读出数据,最后比较写入与读出的是否相同。

       这里再来看一下SDRAM初始化的具体过程:

  • void exmc_synchronous_dynamic_ram_init(uint32_t sdram_device)
  • {
  •     exmc_sdram_parameter_struct        sdram_init_struct;
  •     exmc_sdram_timing_parameter_struct  sdram_timing_init_struct;
  •     exmc_sdram_command_parameter_struct     sdram_command_init_struct;
  •     uint32_t command_content = 0, bank_select;
  •     uint32_t timeout = SDRAM_TIMEOUT;
  •     /* enable EXMC clock*/
  •     rcu_periph_clock_enable(RCU_EXMC);
  •     rcu_periph_clock_enable(RCU_GPIOB);
  •     rcu_periph_clock_enable(RCU_GPIOC);
  •     rcu_periph_clock_enable(RCU_GPIOD);
  •     rcu_periph_clock_enable(RCU_GPIOE);
  •     rcu_periph_clock_enable(RCU_GPIOF);
  •     rcu_periph_clock_enable(RCU_GPIOG);
  •     rcu_periph_clock_enable(RCU_GPIOH);
  •     /* common GPIO configuration */
  •     /* SDNE0(PC2),SDCKE0(PC5) pin configuration */
  •     gpio_af_set(GPIOC, GPIO_AF_12, GPIO_PIN_2 | GPIO_PIN_5);
  •     gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2 | GPIO_PIN_5);
  •     gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2 | GPIO_PIN_5);
  •     /* D2(PD0),D3(PD1),D13(PD8),D14(PD9),D15(PD10),D0(PD14),D1(PD15) pin configuration */
  •     gpio_af_set(GPIOD, GPIO_AF_12, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_8 | GPIO_PIN_9 |
  •                                    GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);
  •     gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_8 | GPIO_PIN_9 |
  •                                                          GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);
  •     gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_8 | GPIO_PIN_9 |
  •                                                                      GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);
  •     /* NBL0(PE0),NBL1(PE1),D4(PE7),D5(PE8),D6(PE9),D7(PE10),D8(PE11),D9(PE12),D10(PE13),D11(PE14),D12(PE15) pin configuration */
  •     gpio_af_set(GPIOE, GPIO_AF_12, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_7  | GPIO_PIN_8 |
  •                                    GPIO_PIN_9  | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 |
  •                                    GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
  •     gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_7  | GPIO_PIN_8 |
  •                                                          GPIO_PIN_9  | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 |
  •                                                          GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
  •     gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_7  | GPIO_PIN_8 |
  •                                                                      GPIO_PIN_9  | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 |
  •                                                                      GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
  •     /* A0(PF0),A1(PF1),A2(PF2),A3(PF3),A4(PF4),A5(PF5),NRAS(PF11),A6(PF12),A7(PF13),A8(PF14),A9(PF15) pin configuration */
  •     gpio_af_set(GPIOF, GPIO_AF_12, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_2  | GPIO_PIN_3  |
  •                                    GPIO_PIN_4  | GPIO_PIN_5  | GPIO_PIN_11 | GPIO_PIN_12 |
  •                                    GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
  •     gpio_mode_set(GPIOF, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_2  | GPIO_PIN_3  |
  •                                                          GPIO_PIN_4  | GPIO_PIN_5  | GPIO_PIN_11 | GPIO_PIN_12 |
  •                                                          GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
  •     gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_2  | GPIO_PIN_3  |
  •                                                                      GPIO_PIN_4  | GPIO_PIN_5  | GPIO_PIN_11 | GPIO_PIN_12 |
  •                                                                      GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
  •     /* A10(PG0),A11(PG1),A12(PG2),A14(PG4),A15(PG5),SDCLK(PG8),NCAS(PG15) pin configuration */
  •     gpio_af_set(GPIOG, GPIO_AF_12, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 |
  •                                    GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_15);
  •     gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 |
  •                                                          GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_15);
  •     gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 |
  •                                                                      GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_15);
  •     /* SDNWE(PH5) pin configuration */
  •     gpio_af_set(GPIOH, GPIO_AF_12, GPIO_PIN_5);
  •     gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_5);
  •     gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5);
  •     /* specify which SDRAM to read and write */
  •     if(EXMC_SDRAM_DEVICE0 == sdram_device)
  •     {
  •         bank_select = EXMC_SDRAM_DEVICE0_SELECT;
  •     }
  •     else
  •     {
  •         bank_select = EXMC_SDRAM_DEVICE1_SELECT;
  •     }
  •     /* EXMC SDRAM device initialization sequence --------------------------------*/
  •         //【1】配置SDRAM时间寄存器
  •     /* Step 1 : configure SDRAM timing registers --------------------------------*/
  •     /* LMRD: 2 clock cycles */
  •     sdram_timing_init_struct.load_mode_register_delay = 2;
  •     /* XSRD: min = 67ns */
  •     sdram_timing_init_struct.exit_selfrefresh_delay = 7;
  •     /* RASD: min=42ns , max=120k (ns) */
  •     sdram_timing_init_struct.row_address_select_delay = 5;
  •     /* ARFD: min=60ns */
  •     sdram_timing_init_struct.auto_refresh_delay = 6;
  •     /* WRD:  min=1 Clock cycles +6ns */
  •     sdram_timing_init_struct.write_recovery_delay = 2;
  •     /* RPD:  min=18ns */
  •     sdram_timing_init_struct.row_precharge_delay = 2;
  •     /* RCD:  min=18ns */
  •     sdram_timing_init_struct.row_to_column_delay = 2;
  •         //【2】配置SDRAM控制寄存器
  •     /* step 2 : configure SDRAM control registers ---------------------------------*/
  •     sdram_init_struct.sdram_device = sdram_device;
  •     sdram_init_struct.column_address_width = EXMC_SDRAM_COW_ADDRESS_9;
  •     sdram_init_struct.row_address_width = EXMC_SDRAM_ROW_ADDRESS_13;
  •     sdram_init_struct.data_width = EXMC_SDRAM_DATABUS_WIDTH_16B;
  •     sdram_init_struct.internal_bank_number = EXMC_SDRAM_4_INTER_BANK;
  •     sdram_init_struct.cas_latency = EXMC_CAS_LATENCY_3_SDCLK;
  •     sdram_init_struct.write_protection = DISABLE;
  •     sdram_init_struct.sdclock_config = EXMC_SDCLK_PERIODS_2_HCLK;
  •     sdram_init_struct.brust_read_switch = ENABLE;
  •     sdram_init_struct.pipeline_read_delay = EXMC_PIPELINE_DELAY_1_HCLK;
  •     sdram_init_struct.timing  = &sdram_timing_init_struct;
  •     /* EXMC SDRAM bank initialization */
  •     exmc_sdram_init(&sdram_init_struct);
  •     //【3】配置CKE?
  •     /* step 3 : configure CKE high command---------------------------------------*/
  •     sdram_command_init_struct.command = EXMC_SDRAM_CLOCK_ENABLE;
  •     sdram_command_init_struct.bank_select = bank_select;
  •     sdram_command_init_struct.auto_refresh_number = EXMC_SDRAM_AUTO_REFLESH_1_SDCLK;
  •     sdram_command_init_struct.mode_register_content = 0;
  •     /* wait until the SDRAM controller is ready */
  •     while((exmc_flag_get(sdram_device, EXMC_SDRAM_FLAG_NREADY) != RESET) && (timeout > 0))
  •     {
  •         timeout--;
  •     }
  •     /* send the command */
  •     exmc_sdram_command_config(&sdram_command_init_struct);
  •         //【4】延时10ms
  •     /* step 4 : insert 10ms delay----------------------------------------------*/
  •     delay_1ms(10);
  •         //【5】配置预充电
  •     /* step 5 : configure precharge all command----------------------------------*/
  •     sdram_command_init_struct.command = EXMC_SDRAM_PRECHARGE_ALL;
  •     sdram_command_init_struct.bank_select = bank_select;
  •     sdram_command_init_struct.auto_refresh_number = EXMC_SDRAM_AUTO_REFLESH_1_SDCLK;
  •     sdram_command_init_struct.mode_register_content = 0;
  •     /* wait until the SDRAM controller is ready */
  •     timeout = SDRAM_TIMEOUT;
  •     while((exmc_flag_get(sdram_device, EXMC_SDRAM_FLAG_NREADY) != RESET) && (timeout > 0))
  •     {
  •         timeout--;
  •     }
  •     /* send the command */
  •     exmc_sdram_command_config(&sdram_command_init_struct);
  •         //【6】配置自动刷新
  •     /* step 6 : configure Auto-Refresh command-----------------------------------*/
  •     sdram_command_init_struct.command = EXMC_SDRAM_AUTO_REFRESH;
  •     sdram_command_init_struct.bank_select = bank_select;
  •     sdram_command_init_struct.auto_refresh_number = EXMC_SDRAM_AUTO_REFLESH_8_SDCLK;
  •     sdram_command_init_struct.mode_register_content = 0;
  •     /* wait until the SDRAM controller is ready */
  •     timeout = SDRAM_TIMEOUT;
  •     while((exmc_flag_get(sdram_device, EXMC_SDRAM_FLAG_NREADY) != RESET) && (timeout > 0))
  •     {
  •         timeout--;
  •     }
  •     /* send the command */
  •     exmc_sdram_command_config(&sdram_command_init_struct);
  •         //【7】配置装载模式寄存器
  •     /* step 7 : configure load mode register command-----------------------------*/
  •     /* program mode register */
  •     command_content = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1        |
  •                                 SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |
  •                                 SDRAM_MODEREG_CAS_LATENCY_3           |
  •                                 SDRAM_MODEREG_OPERATING_MODE_STANDARD |
  •                                 SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
  •     sdram_command_init_struct.command = EXMC_SDRAM_LOAD_MODE_REGISTER;
  •     sdram_command_init_struct.bank_select = bank_select;
  •     sdram_command_init_struct.auto_refresh_number = EXMC_SDRAM_AUTO_REFLESH_1_SDCLK;
  •     sdram_command_init_struct.mode_register_content = command_content;
  •     /* wait until the SDRAM controller is ready */
  •     timeout = SDRAM_TIMEOUT;
  •     while((exmc_flag_get(sdram_device, EXMC_SDRAM_FLAG_NREADY) != RESET) && (timeout > 0))
  •     {
  •         timeout--;
  •     }
  •     /* send the command */
  •     exmc_sdram_command_config(&sdram_command_init_struct);
  •         //【8】配置自动刷新频率
  •     /* step 8 : set the auto-refresh rate counter--------------------------------*/
  •     /* 64ms, 8192-cycle refresh, 64ms/8192=7.81us */
  •     /* SDCLK_Freq = SYS_Freq/2 */
  •     /* (7.81 us * SDCLK_Freq) - 20 */
  •     exmc_sdram_refresh_count_set(761);
  •     /* wait until the SDRAM controller is ready */
  •     timeout = SDRAM_TIMEOUT;
  •     while((exmc_flag_get(sdram_device, EXMC_SDRAM_FLAG_NREADY) != RESET) && (timeout > 0))
  •     {
  •         timeout--;
  •     }
  • }
4 运行效果

       通过串口与LED显示运行效果,把读写的操作进行比较,如果数据一致,点亮LED1,否则点亮LED3,同时串口输出信息如下:

  • SDRAM initialized!
  • SDRAM write data...
  • SDRAM read data...
  • Check the data!
  • SDRAM test successed!
  • The data is:
  •      0     1     2     3     4     5     6     7     8     9     a     b     c     d     e     f
  •     10    11    12    13    14    15    16    17    18    19    1a    1b    1c    1d    1e    1f
  •     20    21    22    23    24    25    26    27    28    29    2a    2b    2c    2d    2e    2f
  •     30    31    32    33    34    35    36    37    38    39    3a    3b    3c    3d    3e    3f
  •     40    41    42    43    44    45    46    47    48    49    4a    4b    4c    4d    4e    4f
  •     50    51    52    53    54    55    56    57    58    59    5a    5b    5c    5d    5e    5f
  •     60    61    62    63    64    65    66    67    68    69    6a    6b    6c    6d    6e    6f
  •     70    71    72    73    74    75    76    77    78    79    7a    7b    7c    7d    7e    7f
  •     80    81    82    83    84    85    86    87    88    89    8a    8b    8c    8d    8e    8f
  •     90    91    92    93    94    95    96    97    98    99    9a    9b    9c    9d    9e    9f
  • ...略

       这个例程,有时会运行失败。SDRAM的操作过程有些复杂,我还么有完全搞懂,有时间继续研究。


使用特权

评论回复
powerantone| | 2021-5-7 10:17 | 显示全部楼层
SDRAM是用来存放数据的吗?还是什么用处?

使用特权

评论回复
stormwind123| | 2021-5-7 10:18 | 显示全部楼层

时钟调低点

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

509

主题

1661

帖子

0

粉丝