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

歷史上的今天

今天是:2025年05月29日(星期四)

2019年05月29日 | STM32 USB學習筆記9

發(fā)布者:溫馨小屋 來源: eefocus關(guān)鍵字:STM32  USB  學習筆記 手機看文章 掃描二維碼
隨時隨地手機看文章

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


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


目標板:STM32F103C8T6


開發(fā)庫:STM32F1Cube庫和STM32_USB_Device_Library


現(xiàn)在我們來分析VCP例程的最后一個文件USB設(shè)備類的usbd_cdc文件,該文件跟CDC類緊密相關(guān),看下其頭文件的一些定義:



/** @defgroup usbd_cdc_Exported_Defines

  * @{

  */ 

#define CDC_IN_EP                                   0x81  /* EP1 for data IN */

#define CDC_OUT_EP                                  0x01  /* EP1 for data OUT */

#define CDC_CMD_EP                                  0x82  /* EP2 for CDC commands */

 

/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */

#define CDC_DATA_HS_MAX_PACKET_SIZE                 512  /* Endpoint IN & OUT Packet size */

#define CDC_DATA_FS_MAX_PACKET_SIZE                 64  /* Endpoint IN & OUT Packet size */

#define CDC_CMD_PACKET_SIZE                         8  /* Control Endpoint Packet size */ 

 

#define USB_CDC_CONFIG_DESC_SIZ                     67

#define CDC_DATA_HS_IN_PACKET_SIZE                  CDC_DATA_HS_MAX_PACKET_SIZE

#define CDC_DATA_HS_OUT_PACKET_SIZE                 CDC_DATA_HS_MAX_PACKET_SIZE

 

#define CDC_DATA_FS_IN_PACKET_SIZE                  CDC_DATA_FS_MAX_PACKET_SIZE

#define CDC_DATA_FS_OUT_PACKET_SIZE                 CDC_DATA_FS_MAX_PACKET_SIZE

這些宏定義指明了CDC類使用的端點,以及最大包大小,對于STM32F103C8T6來說最大包大小是是64字節(jié),其中命令控制端點最大包大小為8字節(jié)。在頭文件中還有一個CDC類的結(jié)構(gòu)聲明,如下:


typedef struct

{

  uint32_t data[CDC_DATA_HS_MAX_PACKET_SIZE/4];      /* Force 32bits alignment */

  uint8_t  CmdOpCode;

  uint8_t  CmdLength;    

  uint8_t  *RxBuffer;  

  uint8_t  *TxBuffer;   

  uint32_t RxLength;

  uint32_t TxLength;    

  

  __IO uint32_t TxState;     

  __IO uint32_t RxState;    

}

USBD_CDC_HandleTypeDef; 

該句柄管理著CDC類的數(shù)據(jù)信息,接著我們來查看usbd_cdc.c文件,該文件需要配合CDC1.20以及PSTN1.20協(xié)議文檔來查看,在usbd_cdc,c中有我們CDC類的具體實現(xiàn),如下:


/* CDC interface class callbacks structure */

USBD_ClassTypeDef  USBD_CDC = 

{

  USBD_CDC_Init,

  USBD_CDC_DeInit,

  USBD_CDC_Setup,

  NULL,                 /* EP0_TxSent, */

  USBD_CDC_EP0_RxReady,

  USBD_CDC_DataIn,

  USBD_CDC_DataOut,

  NULL,

  NULL,

  NULL,     

  USBD_CDC_GetHSCfgDesc,  

  USBD_CDC_GetFSCfgDesc,    

  USBD_CDC_GetOtherSpeedCfgDesc, 

  USBD_CDC_GetDeviceQualifierDescriptor,

};

其中EP0_TxSent、SOF、IsoINIncomplete、ISOOUTIncomplete為空。該文件中函數(shù)比較多,先從簡單的分析,首先看下注冊接口的函數(shù),如下:


/**

* @brief  USBD_CDC_RegisterInterface

  * @param  pdev: device instance

  * @param  fops: CD  Interface callback

  * @retval status

  */

uint8_t  USBD_CDC_RegisterInterface  (USBD_HandleTypeDef   *pdev, 

                                      USBD_CDC_ItfTypeDef *fops)

{

  uint8_t  ret = USBD_FAIL;

  

  if(fops != NULL)

  {

    pdev->pUserData= fops;

    ret = USBD_OK;    

  }

  

  return ret;

}

注冊接口很簡單,即把CDC接口指針鏈接到USB句柄中的UserData即可。接著是在CDC接口文件中提到的兩個設(shè)置緩存區(qū)的函數(shù),如下:


/**

  * @brief  USBD_CDC_SetTxBuffer

  * @param  pdev: device instance

  * @param  pbuff: Tx Buffer

  * @retval status

  */

uint8_t  USBD_CDC_SetTxBuffer  (USBD_HandleTypeDef   *pdev,

                                uint8_t  *pbuff,

                                uint16_t length)

{

  USBD_CDC_HandleTypeDef   *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData;

  

  hcdc->TxBuffer = pbuff;

  hcdc->TxLength = length;  

  

  return USBD_OK;  

}

 

 

/**

  * @brief  USBD_CDC_SetRxBuffer

  * @param  pdev: device instance

  * @param  pbuff: Rx Buffer

  * @retval status

  */

uint8_t  USBD_CDC_SetRxBuffer  (USBD_HandleTypeDef   *pdev,

                                   uint8_t  *pbuff)

{

  USBD_CDC_HandleTypeDef   *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData;

  

  hcdc->RxBuffer = pbuff;

  

  return USBD_OK;

}

給CDC句柄的相應(yīng)字段賦值即可。再有兩個是CDC接口文件中提到的數(shù)據(jù)發(fā)送和接收函數(shù),如下:


/**

  * @brief  USBD_CDC_DataOut

  *         Data received on non-control Out endpoint

  * @param  pdev: device instance

  * @param  epnum: endpoint number

  * @retval status

  */

uint8_t  USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev)

{      

  USBD_CDC_HandleTypeDef   *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData;

  

  if(pdev->pClassData != NULL)

  {

    if(hcdc->TxState == 0)

    {

      /* Tx Transfer in progress */

      hcdc->TxState = 1;

      

      /* Transmit next packet */

      USBD_LL_Transmit(pdev,

                       CDC_IN_EP,

                       hcdc->TxBuffer,

                       hcdc->TxLength);

      

      return USBD_OK;

    }

    else

    {

      return USBD_BUSY;

    }

  }

  else

  {

    return USBD_FAIL;

  }

}

 

 

/**

  * @brief  USBD_CDC_ReceivePacket

  *         prepare OUT Endpoint for reception

  * @param  pdev: device instance

  * @retval status

  */

uint8_t  USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev)

{      

  USBD_CDC_HandleTypeDef   *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData;

  

  /* Suspend or Resume USB Out process */

  if(pdev->pClassData != NULL)

  {

    if(pdev->dev_speed == USBD_SPEED_HIGH  ) 

    {      

      /* Prepare Out endpoint to receive next packet */

      USBD_LL_PrepareReceive(pdev,

                             CDC_OUT_EP,

                             hcdc->RxBuffer,

                             CDC_DATA_HS_OUT_PACKET_SIZE);

    }

    else

    {

      /* Prepare Out endpoint to receive next packet */

      USBD_LL_PrepareReceive(pdev,

                             CDC_OUT_EP,

                             hcdc->RxBuffer,

                             CDC_DATA_FS_OUT_PACKET_SIZE);

    }

    return USBD_OK;

  }

  else

  {

    return USBD_FAIL;

  }

}

發(fā)送函數(shù)很簡單,檢測到發(fā)送狀態(tài)處于空閑時則執(zhí)行發(fā)送操作,并設(shè)置發(fā)送狀態(tài)有BUSY,這里這里使用的發(fā)送端點是0x81,不是端點0。而且數(shù)據(jù)的發(fā)送和發(fā)送數(shù)據(jù)的緩存區(qū)設(shè)置二者是成對使用的。接收函數(shù)也比較簡單只是區(qū)分了高速和全速模式下的最大包大小不同,這里使用的端點同樣不是端點0而是端點0x001。CDC類接口使用的函數(shù)補充完畢,現(xiàn)在來看CDC類各個函數(shù),依然從簡單的開始幾個描述符的獲取,這個有四個描述符的獲取,如下:


/**

  * @brief  USBD_CDC_GetFSCfgDesc 

  *         Return configuration descriptor

  * @param  speed : current device speed

  * @param  length : pointer data length

  * @retval pointer to descriptor buffer

  */

static uint8_t  *USBD_CDC_GetFSCfgDesc (uint16_t *length)

{

  *length = sizeof (USBD_CDC_CfgFSDesc);

  return USBD_CDC_CfgFSDesc;

}

 

/**

  * @brief  USBD_CDC_GetHSCfgDesc 

  *         Return configuration descriptor

  * @param  speed : current device speed

  * @param  length : pointer data length

  * @retval pointer to descriptor buffer

  */

static uint8_t  *USBD_CDC_GetHSCfgDesc (uint16_t *length)

{

  *length = sizeof (USBD_CDC_CfgHSDesc);

  return USBD_CDC_CfgHSDesc;

}

 

/**

  * @brief  USBD_CDC_GetCfgDesc 

  *         Return configuration descriptor

  * @param  speed : current device speed

  * @param  length : pointer data length

  * @retval pointer to descriptor buffer

  */

static uint8_t  *USBD_CDC_GetOtherSpeedCfgDesc (uint16_t *length)

{

  *length = sizeof (USBD_CDC_OtherSpeedCfgDesc);

  return USBD_CDC_OtherSpeedCfgDesc;

}

 

/**

* @brief  DeviceQualifierDescriptor 

*         return Device Qualifier descriptor

* @param  length : pointer data length

* @retval pointer to descriptor buffer

[1] [2] [3] [4]
關(guān)鍵字:STM32  USB  學習筆記 引用地址:STM32 USB學習筆記9

上一篇:直接通過寄存器地址操作控制LED燈(STM32_01)
下一篇:STM32 USB學習筆記8

推薦閱讀

弗里蒙特村頭有間廠子叫拓速樂,拓速樂家的老板姓馬,馬老板其人一向是不怕事兒的,什么《華爾巷日報》也好、《經(jīng)濟學沒有人》也罷,從村東頭罵到村西頭,馬老板就沒怕過誰。??(圖自:edmunds)可老師傅也有翻車的時候,馬老板終歸會有理直氣壯不起來的那么一天。這天發(fā)難的對手叫《消費者報告》。5月21號,《Consumer Report》發(fā)表聲明,將特斯拉Model...
5月28日,國家互聯(lián)網(wǎng)信息辦公室(以下簡稱國家網(wǎng)信辦)正式發(fā)布了《數(shù)據(jù)安全管理辦法(征求意見稿)》,向社會公開征求意見。該意見稿的出臺,不僅呼應(yīng)了社會各界的殷殷期盼,也有利于切實保護公民、法人和其他組織在網(wǎng)絡(luò)空間的合法權(quán)益,保障個人信息和重要數(shù)據(jù)安全,維護國家安全與社會公共利益。六大重點值得關(guān)注《數(shù)據(jù)安全管理辦法(征求意見稿)》涵蓋了數(shù)...
C端四變量 B端三層面 2019年,全球開啟5G商用部署,華為迎來了新增長機遇。 雖然已手握近100個5G商業(yè)合同,但這家中國的通訊巨頭仍面臨諸多不利因素:全球疫情,多個國家的5G網(wǎng)絡(luò)建設(shè)進程受到波及;美國封殺,華為在全球5G業(yè)務(wù)發(fā)展仍然充滿變數(shù)…… 不過,華為在中國的發(fā)展順風順...

史海拾趣

問答坊 | AI 解惑

RPM遠程電源管理服務(wù)器

一.隨著計算機及網(wǎng)絡(luò)設(shè)備的普及化,計算機及網(wǎng)絡(luò)系統(tǒng)對企業(yè)的重要性愈來愈高,其配套的環(huán)境設(shè)備也日益增多。因此,機房的管理及 監(jiān)控是現(xiàn)代計算機及網(wǎng)絡(luò)通信機房非常重要的一個環(huán)節(jié)。ePowerSwitch是專為現(xiàn)代計算機及網(wǎng)絡(luò)通信機房而設(shè)計的遠程電源控 ...…

查看全部問答∨

兄弟姐妹們,珍惜我們的家園

都是好人 物以類聚,人以群分 這是我們電氣工作者的家園 我愛這個家…

查看全部問答∨

一直都是以菜鳥身份出現(xiàn),從來不敢發(fā)貼.今天發(fā)個595控制4進8出的程序,希望大俠拍磚!

希望大俠能多多拍磚,我這是第一次在這人論壇發(fā)貼.一直都很喜歡這個論壇,只是一直都沒有勇氣(因為實在很菜)..今天我終于鼓起勇氣來,向你表達: /******************32個按鍵掃描控制4進8出信號************************** ******************* ...…

查看全部問答∨

出售:WINDOWS MOBILE下導(dǎo)航軟件(具備源代碼)。

WINDOWS MOBILE下導(dǎo)航軟件(具備源代碼)。 開發(fā)平臺:EVC4.0 使用平臺:WINDOWS MOBILE5,6 電子地圖格式:MM4 地圖轉(zhuǎn)換工具:MAPINFO格式轉(zhuǎn)到MM4(具備源代碼)。 該軟件是為臺灣使用編寫的,在大陸還沒有版本問題。 Email:ljycdw ...…

查看全部問答∨

帶數(shù)據(jù)緩存的低電平輸出

什么叫帶數(shù)據(jù)緩存的低電平輸出??? 帶下拉的低電平輸入????…

查看全部問答∨

blog中發(fā)表文章為什么有時候無法打開頁面,一直處于loading狀態(tài)

blog中發(fā)表文章為什么有時候無法打開頁面,一直處于loading狀態(tài).其它的頁面能夠正常打開. 不知是什么原因, …

查看全部問答∨

通過注冊表實現(xiàn)dll inject的問題, 添加了"InjectDLL" 項卻無法被加載.

wm5/wm6 ppc 模擬器環(huán)境下,寫了一個測試用的abc.dll,在dllmain函數(shù)中會MessageBox一個窗口. 然后按照msdn里的介紹, HKEY_LOCAL_MACHINE\\SYSTEM\\KERNEL     "InjectDLL" = REG_MULTI_SZ : "MyDLL1.DLL","MyDLL2.DLL", .. ...…

查看全部問答∨

下載一個圖片轉(zhuǎn)換成的大數(shù)組到SDRAM提示錯誤

裸奔2440,在SDRAM中調(diào)試程序。下載一個圖片轉(zhuǎn)換成的大數(shù)組到SDRAM,數(shù)組是unsigned short型的,總共320×240×2 = 153600個字節(jié),總提示錯誤如下,無法下載,是怎么回事?而且每次提示的錯誤地址都不一樣。 …

查看全部問答∨

gprs模塊通信問題

        本人寫GPRS模塊通信遇到一點問題,希望大家有空幫忙分析一下,不甚感激。我用的是博創(chuàng)upnetarm2410的開發(fā)箱,模塊是通過pci插槽連接的,串口通過16c550和cpu相連的。調(diào)試程序一直不理想 ...…

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

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