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

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

發(fā)布者:溫馨小屋最新更新時(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)分析VCP例程的最后一個(gè)文件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類使用的端點(diǎn),以及最大包大小,對(duì)于STM32F103C8T6來(lái)說(shuō)最大包大小是是64字節(jié),其中命令控制端點(diǎn)最大包大小為8字節(jié)。在頭文件中還有一個(gè)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ù)信息,接著我們來(lái)查看usbd_cdc.c文件,該文件需要配合CDC1.20以及PSTN1.20協(xié)議文檔來(lái)查看,在usbd_cdc,c中有我們CDC類的具體實(shí)現(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ù)比較多,先從簡(jiǎn)單的分析,首先看下注冊(cè)接口的函數(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;

}

注冊(cè)接口很簡(jiǎn)單,即把CDC接口指針鏈接到USB句柄中的UserData即可。接著是在CDC接口文件中提到的兩個(gè)設(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)字段賦值即可。再有兩個(gè)是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ù)很簡(jiǎn)單,檢測(cè)到發(fā)送狀態(tài)處于空閑時(shí)則執(zhí)行發(fā)送操作,并設(shè)置發(fā)送狀態(tài)有BUSY,這里這里使用的發(fā)送端點(diǎn)是0x81,不是端點(diǎn)0。而且數(shù)據(jù)的發(fā)送和發(fā)送數(shù)據(jù)的緩存區(qū)設(shè)置二者是成對(duì)使用的。接收函數(shù)也比較簡(jiǎn)單只是區(qū)分了高速和全速模式下的最大包大小不同,這里使用的端點(diǎn)同樣不是端點(diǎn)0而是端點(diǎn)0x001。CDC類接口使用的函數(shù)補(bǔ)充完畢,現(xiàn)在來(lái)看CDC類各個(gè)函數(shù),依然從簡(jiǎn)單的開(kāi)始幾個(gè)描述符的獲取,這個(gè)有四個(gè)描述符的獲取,如下:


/**

  * @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  學(xué)習(xí)筆記 引用地址:STM32 USB學(xué)習(xí)筆記9

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

推薦閱讀最新更新時(shí)間:2025-06-17 00:25

STM32 USB學(xué)習(xí)筆記6
主機(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文件中聲明的,同樣由用戶實(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è)
[單片機(jī)]
<font color='red'>STM32</font> <font color='red'>USB</font><font color='red'>學(xué)習(xí)</font><font color='red'>筆記</font>6
STM32學(xué)習(xí)筆記(五)RCC(Reset and Clock Control)
時(shí)鐘 時(shí)鐘樹(shù) 外部時(shí)鐘 外部時(shí)鐘更為精確 高速外部時(shí)鐘信號(hào) --- HSE(High-Speed External Clock Signal) 復(fù)用端口:OSC_OUT 和 OSC_IN 管腳信息可在 數(shù)據(jù)手冊(cè) 中查看 OSC_OUT 和 OSC_IN 對(duì)應(yīng)管腳 頻率:4~16 MHz(一般連接 8MHz 晶振) 低速外部時(shí)鐘信號(hào)# --- LSE(Low-Speed External Clock Signal) 復(fù)用端口:OSC32_OUT 和 OSC32_IN 管腳信息可在 數(shù)據(jù)手冊(cè) 中查看 OSC32_OUT 和 OSC32_IN 對(duì)應(yīng)管腳 頻率:32.768 kHz(只能連接 32.768kHz 晶振
[單片機(jī)]
STM32學(xué)習(xí)筆記— 電源管理及低功耗設(shè)計(jì)要點(diǎn)
STM32電源介紹 每一塊STM32芯片中都有一個(gè)電源控制器(PWR),不同系列的STM32有相似,也有差異。 1.電壓 絕大部分STM32的電壓要求介于 1.8 V 到 3.6 V 之間,嵌入式線性調(diào)壓器用于提供內(nèi)部 1.2 V 數(shù)字電源。 2.類型 STM32的電源通常分為三類:數(shù)字電源、模擬電源、備份電源。 數(shù)字電源:VDD也是其主電源,主要用于數(shù)字部分; 模擬電源:VDDA用于模擬部分的電源,比如ADC,這樣可以單獨(dú)濾波并屏蔽 PCB 上的噪聲。 備份電源:VBAT用于備份區(qū)域的電源,比如RTC、備份SRAM等,一旦主電源斷開(kāi),VBAT可以為這些區(qū)域提供電源。 ▲ STM32F4備份域 3.調(diào)壓器多數(shù)STM3
[單片機(jī)]
<font color='red'>STM32</font><font color='red'>學(xué)習(xí)</font><font color='red'>筆記</font>— 電源管理及低功耗設(shè)計(jì)要點(diǎn)
STM32的時(shí)鐘系統(tǒng)學(xué)習(xí)筆記(基于STM32F407)
RCC(Reset clock Control 復(fù)位時(shí)鐘控制器) 時(shí)鐘源(時(shí)鐘生成) 常規(guī):外部晶振、芯片內(nèi)部振蕩器、鎖相環(huán)(PLL) PS:(Phase Locked Loop): 為鎖相回路或鎖相環(huán) 其他:以太網(wǎng)、USB OTG FS、或其他外設(shè)的時(shí)鐘源 STM32F407時(shí)鐘樹(shù)關(guān)系圖(重點(diǎn)理解經(jīng)常用到) 時(shí)鐘總線 RCC通過(guò)多個(gè)預(yù)分頻器配置時(shí)鐘總線 PS:預(yù)分頻器 (Prescaler-PSC)用來(lái)將定時(shí)器時(shí)鐘源進(jìn)行分頻輸出 總線類型:AHB、低速APB1、高速APB2 PS: AHB(Advanced High Performance Bus),高級(jí)高性能總線 APB(Advanc
[單片機(jī)]
<font color='red'>STM32</font>的時(shí)鐘系統(tǒng)<font color='red'>學(xué)習(xí)</font><font color='red'>筆記</font>(基于STM32F407)
STM32學(xué)習(xí)筆記(1) GPIO初始化及點(diǎn)亮LED
一、led.h頭文件分析 #ifndef __LED_H #define __LED_H #include sys.h #define LED0 PAout(8) // PA8 #define LED1 PDout(2) // PD2 void LED_Init(void);//初始化 #endif 問(wèn):ifndef,endif有什么用? 在這一段代碼中,假設(shè)同時(shí)有A.h和B.h同時(shí)包含了這個(gè)頭文件,在編譯器編譯A時(shí),會(huì)先判斷LED.H有沒(méi)有被定義(這里肯定是未被定義的),那么就定義(define __LED_H),然后再(endif),在編譯器編譯B時(shí),同樣會(huì)判斷LED.H有沒(méi)有被定義(這里經(jīng)過(guò)A的編譯,肯定是被定義的),那么
[單片機(jī)]
<font color='red'>STM32</font><font color='red'>學(xué)習(xí)</font><font color='red'>筆記</font>(1) GPIO初始化及點(diǎn)亮LED
STM32學(xué)習(xí)筆記 — 之GPIO端口篇
最近剛開(kāi)始學(xué)習(xí)STM32,所以從最基本的GPIO開(kāi)始學(xué)起;首先看看STM32的datasheet上對(duì)GPIO口的簡(jiǎn)單介紹: 每個(gè)GPI/O 端口有兩個(gè)32 位配置寄存器(GPIOx_CRL,GPIOx_CRH),兩個(gè)32位數(shù)據(jù)寄存器(GPIOx_IDR,GPIOx_ODR),一個(gè)32 位置位/復(fù)位寄存器(GPIOx_BSRR),一個(gè)16 位復(fù)位寄存器(GPIOx_BRR)和一個(gè)32 位鎖定寄存器(GPIOx_LCKR)。 GPIO 端口的每個(gè)位可以由軟件分別配置成多種模式。每個(gè)I/O 端口位可以自由編程,然而I/0 端口寄存器必須按32 位字被訪問(wèn)(不允許半字或字節(jié)訪問(wèn))。GPIOx_BSRR 和GPIOx_BRR 寄存器
[單片機(jī)]
stm32學(xué)習(xí)筆記——外部中斷的使用
基本概念 stm32中,每一個(gè)GPIO都可以觸發(fā)一個(gè)外部中斷,但是,GPIO的中斷是以組為一個(gè)單位的,同組間的外部中斷同一時(shí)間只能使用一個(gè)。比如說(shuō),PA0,PB0,PC0,PD0,PE0,PF0,PG0這些為1組,如果我們使用PA0作為外部中斷源,那么別的就不能再使用了。在此情況下,我們只能使用類似于PB1,PC2這種末端序號(hào)不同的外部中斷源。每一組使用一個(gè)中斷標(biāo)志EXTIx。EXTI0-EXTI4這5個(gè)外部中斷有著自己?jiǎn)为?dú)的中斷響應(yīng)函數(shù),EXIT5-EXIT9共用一個(gè)中斷響應(yīng)函數(shù),EXIT10-EXIT15共用一個(gè)中斷響應(yīng)函數(shù)。 對(duì)于中斷的控制,stm32有一個(gè)專用的管理機(jī)構(gòu):NVIC。對(duì)于NVIC的詳細(xì)解釋,可以參考《AR
[單片機(jī)]
藍(lán)橋杯嵌入式STM32學(xué)習(xí)筆記(一)——MDK下C語(yǔ)言基礎(chǔ)復(fù)習(xí)
MDK下C語(yǔ)言基礎(chǔ)復(fù)習(xí) 寫在前面:就在前幾天我剛剛參加完了藍(lán)橋杯的省賽,在比賽之前我閱讀了社區(qū)里許多優(yōu)秀博主的文章,所以也想把自己的收獲當(dāng)作筆記記下,希望能夠幫助后面也要參賽的同學(xué),順便也總結(jié)一下自己這段時(shí)間的收獲。 這一部分是MDK中有關(guān)C語(yǔ)言的部分,如果大家C語(yǔ)言都學(xué)得很好就忽略,主要是講一些基本操作。 1.1位操作 在MDK下常用的位操作符和微操作技巧 C語(yǔ)言支持如下6鐘位操作 其中這里與、或、異或和取反不用我多講我在這里講一下移位運(yùn)算。 移位運(yùn)算包括左移和右移 左移運(yùn)算:x K 表示:x左移k位,并在右端補(bǔ)零 右移運(yùn)算:x K 表示:x右移k位,并在左端正數(shù)補(bǔ)0,負(fù)數(shù)補(bǔ)1(算術(shù)移位) 例子: 假設(shè)u8 A=
[單片機(jī)]
藍(lán)橋杯嵌入式<font color='red'>STM32</font><font color='red'>學(xué)習(xí)</font><font color='red'>筆記</font>(一)——MDK下C語(yǔ)言基礎(chǔ)復(fù)習(xí)
小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章
隨便看看

 
EEWorld訂閱號(hào)

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

 
汽車開(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