国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

STM32 USB學(xué)習(xí)筆記6

發(fā)布者:MoonlightStar最新更新時(shí)間:2019-05-29 來(lái)源: eefocus關(guān)鍵字:STM32  USB  學(xué)習(xí)筆記 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

主機(jī)環(huán)境:Windows 7 SP1


開(kāi)發(fā)環(huán)境:MDK5.14


目標(biāo)板:STM32F103C8T6


開(kāi)發(fā)庫(kù):STM32F1Cube庫(kù)和STM32_USB_Device_Library


現(xiàn)在來(lái)分析哈USB器件庫(kù)代碼,先來(lái)看usbd_core文件,其頭文件只有一些函數(shù)聲明,沒(méi)啥可說(shuō)的,只有一點(diǎn),之前分析usbd_conf.c文件時(shí)里面USB中斷回調(diào)函數(shù)中調(diào)用的底層接口都是在usbd_core.h文件中聲明的,同樣由用戶(hù)實(shí)現(xiàn)的底層接口也是在該文件中聲明的,在usbd_core.c文件中實(shí)現(xiàn),該文件是很重要的一個(gè)文件,因?yàn)樗猩蠈硬僮髯罱K都會(huì)調(diào)用該文件中的API來(lái)實(shí)現(xiàn)。在器件庫(kù)文檔中提到了核心庫(kù)的作用,如下:


第一個(gè)分析的函數(shù)是USB棧的初始化以及重新初始化,如下:



/**

* @brief  USBD_Init

*         Initializes the device stack and load the class driver

* @param  pdev: device instance

* @param  pdesc: Descriptor structure address

* @param  id: Low level core index

* @retval None

*/

USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id)

{

  /* Check whether the USB Host handle is valid */

  if(pdev == NULL)

  {

    USBD_ErrLog("Invalid Device handle");

    return USBD_FAIL; 

  }

  

  /* Unlink previous class*/

  if(pdev->pClass != NULL)

  {

    pdev->pClass = NULL;

  }

  

  /* Assign USBD Descriptors */

  if(pdesc != NULL)

  {

    pdev->pDesc = pdesc;

  }

  

  /* Set Device initial State */

  pdev->dev_state  = USBD_STATE_DEFAULT;

  pdev->id = id;

  /* Initialize low level driver */

  USBD_LL_Init(pdev);

  

  return USBD_OK; 

}

 

/**

* @brief  USBD_DeInit 

*         Re-Initialize th device library

* @param  pdev: device instance

* @retval status: status

*/

USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev)

{

  /* Set Default State */

  pdev->dev_state  = USBD_STATE_DEFAULT;

  

  /* Free Class Resources */

  pdev->pClass->DeInit(pdev, pdev->dev_config);  

  

    /* Stop the low level driver  */

  USBD_LL_Stop(pdev); 

  

  /* Initialize low level driver */

  USBD_LL_DeInit(pdev);

  

  return USBD_OK;

}

USB初始化函數(shù)很簡(jiǎn)單,將USB句柄的設(shè)備類(lèi)指針置NULL,同時(shí)將USB的描述符加載上去,將USB設(shè)備狀態(tài)置為默認(rèn)狀態(tài),該函數(shù)里面的id目前不清楚是作何用,最后調(diào)用USB_LL_Init()函數(shù)來(lái)初始化底層驅(qū)動(dòng)。USB器件庫(kù)中USB設(shè)備有四種狀態(tài),定義在usbd_def.h文件中,如下:


/*  Device Status */

#define USBD_STATE_DEFAULT                                1

#define USBD_STATE_ADDRESSED                              2

#define USBD_STATE_CONFIGURED                             3

#define USBD_STATE_SUSPENDED                              4

默認(rèn)狀態(tài)、地址狀態(tài)、配置狀態(tài)、掛起狀態(tài)。在USB2.0協(xié)議文檔的第9章節(jié)中規(guī)定了USB設(shè)備的6種狀態(tài):連接狀態(tài)、上電狀態(tài)、默認(rèn)狀態(tài)、地址狀態(tài)、配置狀態(tài)、掛起狀態(tài),六者之間的關(guān)系圖如下所示:


在USB庫(kù)中是省略了連接和上電兩個(gè)狀態(tài),剩下四種狀態(tài)的說(shuō)明可以在USB2.0協(xié)議的第九章節(jié)找到,由此可以看出USB2.0協(xié)議中第九章節(jié)有多重要了。在USB分配地址之前其使用默認(rèn)地址,處在默認(rèn)狀態(tài)下的USB設(shè)備不能響應(yīng)正常的請(qǐng)求,當(dāng)USB設(shè)備分配了唯一的地址后即進(jìn)入地址狀態(tài),響應(yīng)正常請(qǐng)求,USB設(shè)備配置完成后進(jìn)入配置狀態(tài),USB設(shè)備在指定時(shí)間長(zhǎng)度內(nèi)沒(méi)有檢測(cè)到總線通信時(shí)會(huì)進(jìn)入掛起狀態(tài),但會(huì)保持任何內(nèi)部狀態(tài),包括地址和配置。在USB重新初始化函數(shù)中,需要釋放類(lèi)資源,且停止USB底層驅(qū)動(dòng),重新初始化底層驅(qū)動(dòng)。接著是注冊(cè)類(lèi)函數(shù):



/**

  * @brief  USBD_RegisterClass 

  *         Link class driver to Device Core.

  * @param  pDevice : Device Handle

  * @param  pclass: Class handle

  * @retval USBD Status

  */

USBD_StatusTypeDef  USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass)

{

  USBD_StatusTypeDef   status = USBD_OK;

  if(pclass != 0)

  {

    /* link the class to the USB Device handle */

    pdev->pClass = pclass;

    status = USBD_OK;

  }

  else

  {

    USBD_ErrLog("Invalid Class handle");

    status = USBD_FAIL; 

  }

  

  return status;

}

注冊(cè)設(shè)備類(lèi)函數(shù)也很簡(jiǎn)單,把設(shè)備類(lèi)指針傳遞給USB設(shè)備句柄即可,通過(guò)指針USB句柄包含了我們所用的所有資源,接著來(lái)看USB的一些基本操作,如下:


/**

  * @brief  USBD_Start 

  *         Start the USB Device Core.

  * @param  pdev: Device Handle

  * @retval USBD Status

  */

USBD_StatusTypeDef  USBD_Start  (USBD_HandleTypeDef *pdev)

{

  

  /* Start the low level driver  */

  USBD_LL_Start(pdev); 

  

  return USBD_OK;  

}

 

/**

  * @brief  USBD_Stop 

  *         Stop the USB Device Core.

  * @param  pdev: Device Handle

  * @retval USBD Status

  */

USBD_StatusTypeDef  USBD_Stop   (USBD_HandleTypeDef *pdev)

{

  /* Free Class Resources */

  pdev->pClass->DeInit(pdev, pdev->dev_config);  

 

  /* Stop the low level driver  */

  USBD_LL_Stop(pdev); 

  

  return USBD_OK;  

}

 

/**

* @brief  USBD_RunTestMode 

*         Launch test mode process

* @param  pdev: device instance

* @retval status

*/

USBD_StatusTypeDef  USBD_RunTestMode (USBD_HandleTypeDef  *pdev) 

{

  return USBD_OK;

}

 

 

/**

* @brief  USBD_SetClassConfig 

*        Configure device and start the interface

* @param  pdev: device instance

* @param  cfgidx: configuration index

* @retval status

*/

 

USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef  *pdev, uint8_t cfgidx)

{

  USBD_StatusTypeDef   ret = USBD_FAIL;

  

  if(pdev->pClass != NULL)

  {

    /* Set configuration  and Start the Class*/

    if(pdev->pClass->Init(pdev, cfgidx) == 0)

    {

      ret = USBD_OK;

    }

  }

  return ret; 

}

 

/**

* @brief  USBD_ClrClassConfig 

*         Clear current configuration

* @param  pdev: device instance

* @param  cfgidx: configuration index

* @retval status: USBD_StatusTypeDef

*/

USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef  *pdev, uint8_t cfgidx)

{

  /* Clear configuration  and De-initialize the Class process*/

  pdev->pClass->DeInit(pdev, cfgidx);  

  return USBD_OK;

}

 

/**

* @brief  USBD_LL_Reset 

*         Handle Reset event

* @param  pdev: device instance

* @retval status

*/

USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef  *pdev, USBD_SpeedTypeDef speed)

{

  pdev->dev_speed = speed;

  return USBD_OK;

}

其中USBD_Start和USBD_Stop跟USBD的初始化類(lèi)似都是調(diào)用usbd_conf中的底層基本操作,USBD_RunTestMode()函數(shù)為空,表明不支持測(cè)試模式,測(cè)試模式在USB2.0協(xié)議文檔有提及,既然這里不支持就么有去細(xì)研究該功能。另外兩個(gè)函數(shù)USBD_SetClassConfig()、USBD_ClrClassConfig()函數(shù)則是跟USB設(shè)備類(lèi)相關(guān),這里我們還沒(méi)有分析到USB設(shè)備類(lèi)中,所以也略過(guò),知道其功能即可。最后有一個(gè)USBD_LL_SetSpeed()函數(shù),USB通信有三種通信速度:低速、全速、高速,STM32F103C8T6支持全速模式,USB速度的定義如下:

/* Following USB Device Speed */

typedef enum 

{

  USBD_SPEED_HIGH  = 0,

  USBD_SPEED_FULL  = 1,

  USBD_SPEED_LOW   = 2,  

}USBD_SpeedTypeDef;

usbd_core.c中剩下的一些函數(shù)體則是在usbd_conf.cUSB中斷回調(diào)函數(shù)中調(diào)用的USB通信處理的真正實(shí)現(xiàn)者,如下:

/**

* @brief  USBD_SetupStage 

*         Handle the setup stage

* @param  pdev: device instance

* @retval status

*/

USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup)

{

 

  USBD_ParseSetupRequest(&pdev->request, psetup);

  

  pdev->ep0_state = USBD_EP0_SETUP;

  pdev->ep0_data_len = pdev->request.wLength;

  

  switch (pdev->request.bmRequest & 0x1F) 

  {

  case USB_REQ_RECIPIENT_DEVICE:   

    USBD_StdDevReq (pdev, &pdev->request);

    break;

    

  case USB_REQ_RECIPIENT_INTERFACE:     

    USBD_StdItfReq(pdev, &pdev->request);

    break;

    

  case USB_REQ_RECIPIENT_ENDPOINT:        

    USBD_StdEPReq(pdev, &pdev->request);   

    break;

    

  default:           

    USBD_LL_StallEP(pdev , pdev->request.bmRequest & 0x80);

    break;

  }  

  return USBD_OK;  

}

 

/**

* @brief  USBD_DataOutStage 

*         Handle data OUT stage

* @param  pdev: device instance

* @param  epnum: endpoint index

* @retval status

*/

USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata)

{

  USBD_EndpointTypeDef    *pep;

  

  if(epnum == 0) 

  {

    pep = &pdev->ep_out[0];

    

    if ( pdev->ep0_state == USBD_EP0_DATA_OUT)

    {

      if(pep->rem_length > pep->maxpacket)

      {

        pep->rem_length -=  pep->maxpacket;

       

        USBD_CtlContinueRx (pdev, 

                            pdata,

                            MIN(pep->rem_length ,pep->maxpacket));

      }

      else

      {

        if((pdev->pClass->EP0_RxReady != NULL)&&

           (pdev->dev_state == USBD_STATE_CONFIGURED))

        {

          pdev->pClass->EP0_RxReady(pdev); 

        }

        USBD_CtlSendStatus(pdev);

      }

    }

  }

  else if((pdev->pClass->DataOut != NULL)&&

          (pdev->dev_state == USBD_STATE_CONFIGURED))

  {

    pdev->pClass->DataOut(pdev, epnum); 

  }  

  return USBD_OK;

}

 

/**

* @brief  USBD_DataInStage 

*         Handle data in stage

[1] [2] [3]
關(guān)鍵字:STM32  USB  學(xué)習(xí)筆記 引用地址:STM32 USB學(xué)習(xí)筆記6

上一篇:STM32 USB學(xué)習(xí)筆記7
下一篇:STM32 USB學(xué)習(xí)筆記5

推薦閱讀最新更新時(shí)間:2025-04-30 23:51

STM32 USB學(xué)習(xí)筆記2
主機(jī)環(huán)境:Windows 7 SP1 開(kāi)發(fā)環(huán)境:MDK5.14 目標(biāo)板:STM32F103C8T6 開(kāi)發(fā)庫(kù):STM32F1Cube庫(kù)和STM32_USB_Device_Library STM32Cube庫(kù)中提供了一些有關(guān)USB的例程,在其工程目錄下的Applications目錄中,這里打開(kāi)STM3210E_EVAL目錄,可以看到如下例程: 這里選取一個(gè)簡(jiǎn)單的例子CDC_Standalone,為一個(gè)USB通信例程,具體實(shí)現(xiàn)是一個(gè)USB轉(zhuǎn)串口的功能,相當(dāng)于USB串口線。把示例里面的inc和src目錄下的文件拷貝到新建工程中,這里是把跟usb通信相關(guān)的文件放到了vcp目錄下。文件目錄結(jié)構(gòu)如下: 其中BSP目錄很簡(jiǎn)單,由于所購(gòu)
[單片機(jī)]
基于STM32USB枚舉過(guò)程學(xué)習(xí)筆記(二)
接下來(lái)介紹USB設(shè)備的枚舉,枚舉就是從設(shè)備讀取各種描述符信息,這樣主機(jī)就可以根據(jù)這些信息來(lái)加載合適的驅(qū)動(dòng),從而知道是什么樣的設(shè)備,如何進(jìn)行通信。 枚舉過(guò)程使用的是控制傳輸。控制傳輸可以保證數(shù)據(jù)的正確性。控制傳輸分三個(gè)過(guò)程:建立過(guò)程,可選數(shù)據(jù)過(guò)程及狀態(tài)過(guò)程。 下面介紹枚舉的詳細(xì)過(guò)程。 USB主機(jī)檢測(cè)到USB設(shè)備插入后,就會(huì)先對(duì)設(shè)備復(fù)位,并通過(guò)一個(gè)帶數(shù)據(jù)過(guò)程的控制傳輸完成設(shè)備描述符的獲取。 第一步,USB主機(jī)會(huì)往地址0的端點(diǎn)0發(fā)送獲取設(shè)備描述符的標(biāo)準(zhǔn)請(qǐng)求,發(fā)送請(qǐng)求屬于控制傳輸?shù)慕⑦^(guò)程。建立過(guò)程是一個(gè)事務(wù)。首先是令牌包,即主機(jī)發(fā)送一個(gè)SETUP令牌,令牌的格式如上一篇描述的那樣,有令牌的PID,地址和端點(diǎn)號(hào)等;其次是
[單片機(jī)]
基于<font color='red'>STM32</font>的<font color='red'>USB</font>枚舉過(guò)程<font color='red'>學(xué)習(xí)</font><font color='red'>筆記</font>(二)
STM32學(xué)習(xí)筆記7.2】定時(shí)器計(jì)時(shí)
前言 本系列文章統(tǒng)一圍繞STM32F103C8T6最小系統(tǒng)開(kāi)發(fā)板進(jìn)行記錄,如涉及其他開(kāi)發(fā)板將會(huì)特別說(shuō)明。 定時(shí)器時(shí)鐘頻率 SystemInit()- SetSysClock()- SetSysClockTo72()- 設(shè)置APB1為2分頻 - 通用定時(shí)器時(shí)鐘頻率為2*36MHz = 72MHz image.png 定時(shí)器計(jì)時(shí)配置思路 開(kāi)啟定時(shí)器時(shí)鐘 通用定時(shí)器掛載在APB1總線下。 配置定時(shí)器時(shí)基單元+使能定時(shí)器 image.png 溢出時(shí)間為1ms:arr = 1, psc = 35999 TIM_CounterMode_Up:向上計(jì)數(shù)模式 TIM_CKD_DIV1:決定數(shù)字濾波器采樣頻率的參數(shù),在輸入
[單片機(jī)]
STM32學(xué)習(xí)筆記整理之(2)——外部中斷
學(xué)習(xí)STM32也快一年了,現(xiàn)在工作的內(nèi)容跟用的是STM32平臺(tái)的,趁著年前工作量比較小,總結(jié)一下STM32的基礎(chǔ)知識(shí),不出意外的話將會(huì)連續(xù)發(fā)布完整的筆記整理,學(xué)習(xí)的時(shí)候主要是跟著野火教程學(xué)的,然后在整理出適合自己的筆記。 2.1 NVIC配置 1、中斷分組 在配置優(yōu)先級(jí)的時(shí)候,NVIC 只可以配置 16 種中斷向量的優(yōu)先級(jí),搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)的數(shù)量由一個(gè) 4 位的數(shù)字來(lái)決定,把這個(gè) 4 位數(shù)字的位數(shù)分配成搶占優(yōu)先級(jí)部分和響應(yīng)優(yōu)先級(jí)部分。 有 5 組分配方式: 第0組:所有4位用來(lái)配置響應(yīng)優(yōu)先級(jí)。 第1組:最高1位配搶占優(yōu)先級(jí),低3位配響應(yīng)優(yōu)先級(jí)。2^1=2 種搶占優(yōu)先級(jí)(0,1),2^3=8 種響應(yīng)優(yōu)先級(jí), 第2組:2位
[單片機(jī)]
STM32學(xué)習(xí)筆記-STM32堆棧區(qū)(一)
一個(gè)由C/C++編譯的程序占用的內(nèi)存分為以下幾個(gè)部分: 棧區(qū)(stack):編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。操作方式類(lèi)似于數(shù)據(jù)結(jié)構(gòu)中的棧。 堆區(qū)(heap):一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)可能由OS回收。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類(lèi)似于鏈表。 全局區(qū)(靜態(tài)區(qū))(static):全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束后由系統(tǒng)釋放。 文字常量區(qū) —常量字符串就是放在這里的。 程序結(jié)束后由系統(tǒng)釋放 程序代碼區(qū)—存放函數(shù)體的二進(jìn)制代碼 編譯后,各個(gè)區(qū)存儲(chǔ)內(nèi)容舉例說(shuō)明如下:
[單片機(jī)]
STM32學(xué)習(xí)筆記——獨(dú)立看門(mén)狗IWDG介紹及配置
STM32 的獨(dú)立看門(mén)狗由內(nèi)部專(zhuān)門(mén)的 40Khz 低速時(shí)鐘驅(qū)動(dòng),即使主時(shí)鐘發(fā)生故障,它也仍然有效。這里需要注意獨(dú)立看門(mén)狗的時(shí)鐘是一個(gè)內(nèi)部 RC 時(shí)鐘,所以并不是準(zhǔn)確的 40Khz,而是在 30~60Khz 之間的一個(gè)可變化的時(shí)鐘,只是我們?cè)诠浪愕臅r(shí)候,以 40Khz 的頻率來(lái)計(jì)算,看門(mén)狗對(duì)時(shí)間的要求不是很精確,所以,時(shí)鐘有些偏差,都是可以接受的。 看門(mén)狗的原理 單片機(jī)系統(tǒng)在外界的干擾下會(huì)出現(xiàn)程序跑飛的現(xiàn)象導(dǎo)致出現(xiàn)死循環(huán),看門(mén)狗電路就是為了避免這種情況的發(fā)生??撮T(mén)狗的作用就是在一定時(shí)間內(nèi)(通過(guò)定時(shí)計(jì)數(shù)器實(shí)現(xiàn))沒(méi)有接收喂狗信號(hào)(表示MCU已經(jīng)掛了),便實(shí)現(xiàn)處理器的自動(dòng)復(fù)位重啟(發(fā)送復(fù)位信號(hào)) 下面我們?cè)诹私鈳讉€(gè)與獨(dú)立看門(mén)狗相關(guān)
[單片機(jī)]
<font color='red'>STM32</font><font color='red'>學(xué)習(xí)</font><font color='red'>筆記</font>——獨(dú)立看門(mén)狗IWDG介紹及配置
STM32 TFT學(xué)習(xí)筆記——刷圖
主機(jī)環(huán)境:Windows 7 SP1 開(kāi)發(fā)環(huán)境:MDK5.14 目標(biāo)板:ST NUCLEO-F303RE TFT型號(hào):2.4英寸,帶觸摸,SD卡,240*320分辨率,26萬(wàn)色 驅(qū)動(dòng)IC:ILI9325 ST庫(kù)版本:STM32Cube_FW_F3_V1.1.0 做完刷屏之后就可以很容易實(shí)現(xiàn)刷圖操作,唯一不同的是刷屏是我們自己寫(xiě)入顏色數(shù)據(jù),而刷圖你得獲取圖像的像素顏色數(shù)據(jù)先才能寫(xiě)入到ILI9325,看起來(lái)數(shù)據(jù)量很大,但是還好我們有工具可以很輕松的實(shí)現(xiàn),該工具就是Image2Lcd,使用它可以生成16bit的RGB565格式顏色數(shù)據(jù),如圖 當(dāng)前圖像為240*320,保存結(jié)果會(huì)產(chǎn)生一個(gè)數(shù)組,數(shù)組大小為1
[單片機(jī)]
<font color='red'>STM32</font> TFT<font color='red'>學(xué)習(xí)</font><font color='red'>筆記</font>——刷圖
STM32學(xué)習(xí)筆記:?jiǎn)纹瑱C(jī)按鍵單擊、雙擊、長(zhǎng)按功能實(shí)現(xiàn)
由于項(xiàng)目產(chǎn)品的需要,只能設(shè)置一個(gè)按鍵,但是需要實(shí)現(xiàn)短按(即單擊)切換工作模式、長(zhǎng)按開(kāi)關(guān)機(jī)、雙擊暫停等復(fù)用功能。下圖是三種情況下的按鍵波形。按鍵未按下時(shí)是高電平,按下去是低電平。按鍵單擊時(shí),判斷時(shí)間門(mén)檻設(shè)置為50~2000ms;長(zhǎng)按門(mén)檻為持續(xù)按下2000ms。雙擊可以視為時(shí)間間隔很短的倆次有效單擊,從第一次單擊上升沿到第二次單擊上升沿延時(shí)門(mén)檻為100~500ms。 //按鍵按下去會(huì)出現(xiàn)下降沿,設(shè)置按鍵IO口所在的外部端口為下降沿觸發(fā)中斷。void EXTIX_Init(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;
[單片機(jī)]
<font color='red'>STM32</font><font color='red'>學(xué)習(xí)</font><font color='red'>筆記</font>:?jiǎn)纹瑱C(jī)按鍵單擊、雙擊、長(zhǎng)按功能實(shí)現(xiàn)
小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車(chē)開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京B2-20211791 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved