社区导航

 

搜索
查看: 771|回复: 3

[经验分享] [GD32E231 DIY大赛]——09.基于V1.0硬件版本的打样、焊接、调试

[复制链接]

50

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-4-28 10:26 | 显示全部楼层 |阅读模式
本帖最后由 xld0932 于 2019-4-28 10:27 编辑

    1.硬件打样回板焊接

    这个是基于V1.0的原理图布的PCB,收到样板后发现布局实在是空旷呀^_^好久没有布PCB了……对于嘉立创的打样的速度、质量和服务还是点赞的!焊接用了一个小时

    回板靓照:
   

9-1

9-1


    PCB正面照片
   

9-2

9-2


    焊接完成啦:
   

9-3

9-3


    2.硬件上电、烧录程序

    2.1.硬件通过Mini USB供电,通过AMS1117-3.3V这颗LDO将USB 5V电压转换到3.3V,为整体系统提供电源。使用万用表测量各个电压点、通过稳压源查看工作电流,确认电源部分在硬件设计和焊接上没有问题。

    2.2.调试CH340E部分的USB转串口电路,在接入USB到PC后,无法识别USB设备,提示设备枚举不成功;做了重新焊接了芯片、对照原厂的原理图设计等操作,也没找到问题。后续再调试吧……虽然USB转串口没通,但串口的TTL电平我接出来了呀,还是可以引线出来调试、监测数据的。

    2.3.烧录ESP-12F模块二次开发的程序,通过引线的方式将ESP-12F模块的RX、TX、GND接出来,通过乐鑫官网提供的flash_download_tools_v3.6.5下载工具进行下载:
    将RX、TX、GND与外接的USB转串口TTL工具接好;
    通过USB给整个硬件供电;
    按住PCB上的ESP_BOOT按键,再按一下ESP_RST按键,ESP-12F模块就进入了下载模式;
    打开烧录软件,加载烧录程序,选择对应的串口和波特率,点击START开始进行程序烧录;
   

9-4

9-4


    程序烧录完成后,打开PC端的串口监控工具对ESP-12F模块的运行打印数据进行监控,使用手机微信通过AIRKISS的方式配置连接的无线网络,可以看到连接Wi-Fi成功了,成功获取取了IP地址,但MQTT服务器还没有打开:
   

9-5

9-5


    打开MQTT服务器和花生壳软件,打开MQTT.fx客户端连接MQTT服务器,监测ESP-12F的连接和数据发送情况:
   

9-6

9-6


    按下板子上ESP_RST按键对ESP-12F模块进行复位,可以看到模块连网成功,成功同步到了网络时间,与MQTT服务器也连接成功了。
   

9-7

9-7


    通过MQTT.fx客户端工具也监控到了ESP-12F模块上传的Online和Alive Topic。
   

9-8

9-8


    2.4.调试烧录GD32E231部分,这个部分遇到了MDK软件与JLINK工具调试和下载程序的问题,具体的可以参照我发的上一个帖子。http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=1075663&extra=

    3.调试各个硬件模块


    硬件调试效果如下图所示:
   

9-9

9-9


    3.1.调试LED灯和按键检测
    对LED灯控制和按键检测的GPIO口进行初始化,定义了LED灯的控制宏和读取按键状态的函数。

  1. #define KEY_1_PORT      GPIOA
  2. #define KEY_1_PIN       GPIO_PIN_15

  3. #define KEY_2_PORT      GPIOB
  4. #define KEY_2_PIN       GPIO_PIN_3

  5. #define LED_1_PORT      GPIOB
  6. #define LED_1_PIN       GPIO_PIN_4

  7. #define LED_2_PORT      GPIOB
  8. #define LED_2_PIN       GPIO_PIN_5
复制代码


  1. #define LED1_ON()   gpio_bit_set(  LED_1_PORT, LED_1_PIN)
  2. #define LED1_OFF()  gpio_bit_reset(LED_1_PORT, LED_1_PIN)

  3. #define LED2_ON()   gpio_bit_set(  LED_2_PORT, LED_2_PIN)
  4. #define LED2_OFF()  gpio_bit_reset(LED_2_PORT, LED_2_PIN)
复制代码


  1. /**
  2. * [url=home.php?mod=space&uid=159083]@brief[/url]  :
  3. * @param  :
  4. * @returns:
  5. * @details:
  6. */
  7. void LED_Init(void)
  8. {
  9.     /* enable the LED GPIO clock */
  10.     rcu_periph_clock_enable(RCU_GPIOA);
  11.     rcu_periph_clock_enable(RCU_GPIOB);

  12.     /* configure LED1 GPIO port */
  13.     gpio_mode_set(LED_1_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED_1_PIN);
  14.     gpio_output_options_set(LED_1_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LED_1_PIN);

  15.     /* configure LED2 GPIO port */
  16.     gpio_mode_set(LED_2_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED_2_PIN);
  17.     gpio_output_options_set(LED_2_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LED_2_PIN);

  18.     /* turn off all LED */
  19.     LED1_OFF(); LED2_OFF();
  20. }
复制代码


  1. /**
  2. * @brief  :
  3. * @param  :
  4. * @returns:
  5. * @details:
  6. */
  7. void KEY_Init(void)
  8. {
  9.     /* enable the key clock */
  10.     rcu_periph_clock_enable(RCU_GPIOA);
  11.     rcu_periph_clock_enable(RCU_GPIOB);
  12.     //rcu_periph_clock_enable(RCU_CFGCMP);

  13.     /* configure key pin as input */
  14.     gpio_mode_set(KEY_1_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_1_PIN);
  15.     gpio_mode_set(KEY_2_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_2_PIN);
  16. }
复制代码


  1. /**
  2. * @brief  :
  3. * @param  :
  4. * @returns:
  5. * @details:
  6. */
  7. static eKEY_VALUE KEY_Read(void)
  8. {
  9.     eKEY_VALUE value = KEY_VALUE_NULL;

  10.     if(SET == gpio_input_bit_get(KEY_1_PORT, KEY_1_PIN)) value |= 0x01;
  11.     if(SET == gpio_input_bit_get(KEY_2_PORT, KEY_2_PIN)) value |= 0x02;

  12.     return value;
  13. }
复制代码



    3.2.调试与ESP-12F串口通讯、调试与PC端串口软件通讯
    对串口进行初始化操作,并使能串口接收中断。在中断程序中,将接收到的数据缓存在消息队列中,然后再从消息队列中取出数据进行处理,这种方式适用在对实时性要求不苛刻的应用。如下仅给出了初始化操作和中断程序。

  1. /**
  2. * @brief  :
  3. * @param  :
  4. * @returns:
  5. * @details:
  6. */
  7. static void MCU_InitUSART0(void)
  8. {
  9.     /* enable USART GPIO clock */
  10.     rcu_periph_clock_enable(RCU_GPIOA);

  11.     /* enable USART clock */
  12.     rcu_periph_clock_enable(RCU_USART0);


  13.     /* connect port to USARTx_Tx */
  14.     gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);

  15.     /* connect port to USARTx_Rx */
  16.     gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);

  17.     /* configure USART Tx as alternate function push-pull */
  18.     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9);
  19.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_9);

  20.     /* configure USART Rx as alternate function push-pull */
  21.     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);
  22.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_10);


  23.     /* USART configure */
  24.     usart_deinit(USART0);
  25.     usart_baudrate_set(USART0, 115200);
  26.     usart_word_length_set(USART0, USART_WL_8BIT);
  27.     usart_stop_bit_set(USART0, USART_STB_1BIT);
  28.     usart_parity_config(USART0, USART_PM_NONE);

  29.     usart_receive_config(USART0,  USART_RECEIVE_ENABLE);
  30.     usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);

  31.     /* enable the USART0 interrupt */
  32.     nvic_irq_enable(USART0_IRQn, 0);

  33.     usart_interrupt_enable(USART0, USART_INT_RBNE);

  34.     /* enable USART0 */
  35.     usart_enable(USART0);
  36. }


  37. /**
  38. * @brief  :
  39. * @param  :
  40. * @returns:
  41. * @details:
  42. */
  43. static void MCU_InitUSART1(void)
  44. {
  45.     /* enable COM GPIO clock */
  46.     rcu_periph_clock_enable(RCU_GPIOA);

  47.     /* enable USART clock */
  48.     rcu_periph_clock_enable(RCU_USART1);


  49.     /* connect port to USARTx_Tx */
  50.     gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2);

  51.     /* connect port to USARTx_Rx */
  52.     gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3);

  53.     /* configure USART Tx as alternate function push-pull */
  54.     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);
  55.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);

  56.     /* configure USART Rx as alternate function push-pull */
  57.     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3);
  58.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3);


  59.     /* USART configure */
  60.     usart_deinit(USART1);
  61.     usart_baudrate_set(USART1, 115200);
  62.     usart_word_length_set(USART1, USART_WL_8BIT);
  63.     usart_stop_bit_set(USART1, USART_STB_1BIT);
  64.     usart_parity_config(USART1, USART_PM_NONE);

  65.     usart_receive_config(USART1, USART_RECEIVE_ENABLE);
  66.     usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);

  67.     /* enable the USART1 interrupt */
  68.     nvic_irq_enable(USART1_IRQn, 0);

  69.     usart_interrupt_enable(USART1, USART_INT_RBNE);

  70.     /* enable USART1 */
  71.     usart_enable(USART1);
  72. }
复制代码


  1. /**
  2. * @brief  : this function handles USART0 exception
  3. * @param  :
  4. * @returns:
  5. * @details:
  6. */
  7. void USART0_IRQHandler(void)
  8. {
  9.     if(SET == usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE))
  10.     {
  11.         QUEUE_WRITE(QUEUE_WIFIn_RX_IDX, usart_data_receive(USART0));
  12.     }
  13. }


  14. /**
  15. * @brief  : this function handles USART1 exception
  16. * @param  :
  17. * @returns:
  18. * @details:
  19. */
  20. void USART1_IRQHandler(void)
  21. {
  22.     if(SET == usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE))
  23.     {
  24.         QUEUE_WRITE(QUEUE_DEBUG_RX_IDX, usart_data_receive(USART1));
  25.     }
  26. }
复制代码




    3.3.调试AM2322温湿度传感器
    AM2322使用的是标准的I2C总线通讯,在通讯的数据格式上采用了MODBUS的通讯形式,所以厂家称这种通讯方式为I2C_MODBUS通讯。在操作AM2322时需要先进行唤醒操作,然后通过I2C总线发送MODBUS读取指令,然后再通过I2C总线读取MODBUS数据,对读出的数据进行CRC校验,校验正确则显示在TFT显示屏上。I2C程序使用的是模拟I2C程序,对模拟I2C程序的进行结构化设计,这样就算是多个I2C器件也可以共用一个模拟I2C程序。如何代码仅给出了部分初始化和实现程序。

  1. #define AM2322_SCL_RCU  RCU_GPIOB
  2. #define AM2322_SCL_PORT GPIOB
  3. #define AM2322_SCL_PIN  GPIO_PIN_6

  4. #define AM2322_SDA_RCU  RCU_GPIOB
  5. #define AM2322_SDA_PORT GPIOB
  6. #define AM2322_SDA_PIN  GPIO_PIN_7
复制代码


  1. /**
  2. * @brief  :
  3. * @param  :
  4. * @returns:
  5. * @details:
  6. */
  7. void AM2322_Init(void)
  8. {
  9.     sI2C_Init(&AM2322_sI2C);
  10. }



  11. /**
  12. * @brief  :
  13. * @param  :
  14. * @returns:
  15. * @details:
  16. */
  17. static uint8_t AM2322_CheckCRC(uint8_t *buffer, uint8_t length)
  18. {
  19.     uint8_t  i = 0, j = 0;
  20.     uint16_t result = 0xFFFF, check = 0;

  21.     check  |= buffer[length - 1];
  22.     check <<= 8;
  23.     check  |= buffer[length - 2];

  24.     for(i = 0; i < length - 2; i++)
  25.     {
  26.         result ^= buffer[i];

  27.         for(j = 0; j < 8; j++)
  28.         {
  29.             if(result & 0x01)
  30.             {
  31.                 result >>= 1;
  32.                 result  ^= 0xA001;
  33.             }
  34.             else
  35.             {
  36.                 result >>= 1;
  37.             }
  38.         }
  39.     }

  40.     if(result == check) return 1;
  41.     else                return 0;
  42. }


  43. /**
  44. * @brief  :
  45. * @param  :
  46. * @returns:
  47. * @details:
  48. */
  49. void AM2322_Handler(void)
  50. {
  51.     static uint8_t interval = 0;

  52.     uint8_t buffer[8];
  53.     char display[100];

  54.     if(interval++ >= 2)
  55.     {
  56.         interval = 0;

  57.         if(sI2C_ReadAM2322(&AM2322_sI2C, buffer, 8) == 0)
  58.         {
  59.             if(AM2322_CheckCRC(buffer, sizeof(buffer)) == 1)
  60.             {
  61.                 gfHumidity    = (float)((buffer[2]*256)+(buffer[3]&0xF0)+(buffer[3]&0x0F)) / 10;
  62.                 gfTemperature = (float)((buffer[4]*256)+(buffer[5]&0xF0)+(buffer[5]&0x0F)) / 10;

  63.                 memset(display, 0, sizeof(display));
  64.                 sprintf(display, "H:%0.2f", gfHumidity);

  65.                 LCD_DrawString(0, 220, display, RGB(255,255,0), RGB(255,0,0));

  66.                 memset(display, 0, sizeof(display));
  67.                 sprintf(display, "T:%0.2f", gfTemperature);

  68.                 LCD_DrawString(0, 240, display, RGB(255,255,0), RGB(255,0,0));
  69.             }
  70.         }
  71.     }
  72. }
复制代码


  1. /**
  2. * @brief  :
  3. * @param  :
  4. * @returns:
  5. * @details:
  6. */
  7. uint8_t sI2C_ReadAM2322(sI2C_STRUCT* sI2C, uint8_t* buffer, uint8_t size)
  8. {
  9.     /*  Wake Up AM2322 */
  10.     sI2C_START(sI2C);
  11.     sI2C_WRITE(sI2C, 0xB8);
  12.     sI2C_GetACK(sI2C);
  13.     /* IDLE T1 : 800us ~ 3ms */
  14.     delay(2*DELAY_UNIT_MS);
  15.     sI2C_STOP(sI2C);

  16.     /* IDLE */
  17.     delay(5*DELAY_UNIT_MS);

  18.     /* Send Read Temperature Command */
  19.     sI2C_START(sI2C);
  20.     sI2C_WRITE(sI2C, 0xB8); /* AM2322 I2C Address  */
  21.     if(sI2C_GetACK(sI2C)){sI2C_STOP(sI2C); return 1;}
  22.     sI2C_WRITE(sI2C, 0x03); /* Function Code       */
  23.     if(sI2C_GetACK(sI2C)){sI2C_STOP(sI2C); return 1;}
  24.     sI2C_WRITE(sI2C, 0x00); /* Start Register      */
  25.     if(sI2C_GetACK(sI2C)){sI2C_STOP(sI2C); return 1;}
  26.     sI2C_WRITE(sI2C, 0x04); /* Regisgter Number    */
  27.     if(sI2C_GetACK(sI2C)){sI2C_STOP(sI2C); return 1;}
  28.     sI2C_STOP(sI2C);

  29.     /* IDLE T2 : > 1.5ms */
  30.     delay(3*DELAY_UNIT_MS);

  31.     /* Read Temperature */
  32.     sI2C_START(sI2C);
  33.     sI2C_WRITE(sI2C, 0xB9); /* AM2322 I2C Address  */
  34.     if(sI2C_GetACK(sI2C)){sI2C_STOP(sI2C); return 1;}

  35.     /* IDLE T3 : > 30us */
  36.     sI2C_Delay(sI2C->TIME);

  37.     for(;;)
  38.     {
  39.         *buffer++ = sI2C_READ(sI2C);

  40.         if(--size == 0)
  41.         {
  42.             sI2C_PutACK(sI2C, 1); break;
  43.         }

  44.         sI2C_PutACK(sI2C, 0);
  45.     }

  46.     sI2C_STOP(sI2C);

  47.     return 0;
  48. }
复制代码




    3.4.调试SPI接口的TFT液晶屏
    TFT液晶屏使用的是SPI接口连接方式,液晶屏的驱动芯片为ILI9341,相关具体的操作可以参考数据手册,下面仅给出了部分定义的初始化代码。
    当前硬件设计上使用的是GPIO口模拟SPI串行通讯的方式对TFT液晶屏进行控制的,在操作速度上很受影响,显示上感觉到明显的延时,所以希望后面改板成硬件SPI接口通讯。

  1. #define LCD_CS_PORT     GPIOA
  2. #define LCD_CS_PIN      GPIO_PIN_4

  3. #define LCD_RST_PORT    GPIOA
  4. #define LCD_RST_PIN     GPIO_PIN_5

  5. #define LCD_DC_PORT     GPIOA
  6. #define LCD_DC_PIN      GPIO_PIN_7

  7. #define LCD_MOSI_PORT   GPIOB
  8. #define LCD_MOSI_PIN    GPIO_PIN_0

  9. #define LCD_SCK_PORT    GPIOB
  10. #define LCD_SCK_PIN     GPIO_PIN_2

  11. #define LCD_LED_PORT    GPIOB
  12. #define LCD_LED_PIN     GPIO_PIN_10

  13. #define LCD_MISO_PORT   GPIOB
  14. #define LCD_MISO_PIN    GPIO_PIN_11
复制代码


  1. /**
  2. * @brief  :
  3. * @param  :
  4. * @returns:
  5. * @details:
  6. */
  7. static void ILI9341_InitGPIO(void)
  8. {
  9.     /* configure LCD driver GPIO port : CS */
  10.     gpio_mode_set(LCD_CS_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LCD_CS_PIN);
  11.     gpio_output_options_set(LCD_CS_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LCD_CS_PIN);

  12.     /* configure LCD driver GPIO port : RST */
  13.     gpio_mode_set(LCD_RST_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LCD_RST_PIN);
  14.     gpio_output_options_set(LCD_RST_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LCD_RST_PIN);

  15.     /* configure LCD driver GPIO port : DC/RS */
  16.     gpio_mode_set(LCD_DC_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LCD_DC_PIN);
  17.     gpio_output_options_set(LCD_DC_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LCD_DC_PIN);

  18.     /* configure LCD driver GPIO port : SCK */
  19.     gpio_mode_set(LCD_SCK_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LCD_SCK_PIN);
  20.     gpio_output_options_set(LCD_SCK_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LCD_SCK_PIN);

  21.     /* configure LCD driver GPIO port : MISO */
  22.     gpio_mode_set(LCD_MISO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, LCD_MISO_PIN);

  23.     /* configure LCD driver GPIO port : MOSI */
  24.     gpio_mode_set(LCD_MOSI_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LCD_MOSI_PIN);
  25.     gpio_output_options_set(LCD_MOSI_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LCD_MOSI_PIN);

  26.     /* configure LCD driver GPIO port : LED */
  27.     gpio_mode_set(LCD_LED_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LCD_LED_PIN);
  28.     gpio_output_options_set(LCD_LED_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LCD_LED_PIN);

  29.     gpio_bit_set(LCD_LED_PORT, LCD_LED_PIN);
  30. }
复制代码


  1. /**
  2. * @brief  :
  3. * @param  :
  4. * @returns:
  5. * @details:
  6. */
  7. void ILI9341_Init(void)
  8. {
  9.     ILI9341_InitGPIO();

  10.     ILI9341_HardwareReset();

  11.     //---Sleep Out
  12.         ILI9341_WriteCommand(0x11);

  13.         //---Memory Access Control
  14.     ILI9341_WriteCommand(0x36);
  15.     ILI9341_WriteData(0x48);   // 0xE8

  16.     //---COLMOD:Pixel Format Set = 16 bits / pixel
  17.         ILI9341_WriteCommand(0x3A);
  18.         ILI9341_WriteData(0x55);

  19.     //---Display ON
  20.         ILI9341_WriteCommand(0x29);
  21. }
复制代码


  1. /**
  2. * @brief  :
  3. * @param  :
  4. * @returns:
  5. * @details:
  6. */
  7. void LCD_Init(void)
  8. {
  9.     uint8_t i = 0;

  10.     ILI9341_Init();

  11.     LCD_Clear(RGB(255,0,0));

  12.     for(i = 0; i < 10; i++)
  13.     {
  14.         LCD_DrawFontLED(i * 24, 10, i, RGB(255,255,0), RGB(255,0,0));
  15.     }

  16.     LCD_DrawString(0, 200, "Hello World", RGB(255,255,0), RGB(255,0,0));
  17. }
复制代码




来源:EEWorld GD32 MCU板块,转载请附上链接

评分

1

查看全部评分

We are a team and we work as a team !


回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-4-28 10:36 | 显示全部楼层
赞一个,支持下


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-4-28 10:46 | 显示全部楼层
支持


回复

使用道具 举报

8587

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2019-4-28 11:12 | 显示全部楼层
usb换成type c就更好了。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-9-21 03:12 , Processed in 0.158862 second(s), 20 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表