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

STM32 USB學習筆記9

發(fā)布者:溫馨小屋最新更新時間:2019-05-29 來源: eefocus關鍵字:STM32  USB  學習筆記 手機看文章 掃描二維碼
隨時隨地手機看文章

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


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


目標板:STM32F103C8T6


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


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



/** @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類的結構聲明,如下:


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接口文件中提到的兩個設置緩存區(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句柄的相應字段賦值即可。再有兩個是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ā)送操作,并設置發(fā)送狀態(tài)有BUSY,這里這里使用的發(fā)送端點是0x81,不是端點0。而且數(shù)據(jù)的發(fā)送和發(fā)送數(shù)據(jù)的緩存區(qū)設置二者是成對使用的。接收函數(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]
關鍵字:STM32  USB  學習筆記 引用地址:STM32 USB學習筆記9

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

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

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

最新單片機文章
隨便看看

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

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