STM32 USB_Device(CDC_Standalone)
前言
使用USB中的CDC類來虛擬串口 Virtual COM Port (VCP)進行通訊,一方面對於上位機來說顯示出來的就是個串口,所有操作都還是對串口的操作;另一方面實際數據傳輸是基於USB的,數據傳輸速度得到大大提升。本文將對STM32作為從設備使用USB的CDC類虛擬串口(VCP)進行通訊的相關內容做個說明。
USB簡介
從USB版本來說目前STM32系列MCU可以認為都是USB2.0的(現在還有了UCPD,對外接口外形可以是Type-C的,但是這個是只能用於PD3.0充電使用的,無法用於數據通訊)。
對於STM32系列MCU而言,USB FS的使用只要使用 DM / D- 和 DP / D+ 這兩個引腳就行了,最多也就加上ID、SOF、VBUS這三個引腳。而使用USB HS大多數還需要外接PHY芯片(比如USB3300),這樣使用的引腳就多了,至少也要用到12個引腳。
STM32系列MCU在使用USB功能的時候建議使用外部時鐘,外部無源晶體或有源晶振這些,因為USB對時鐘精度要求比較高。
STM32 CDC VCP對於win10和較新版本的linux來說是免驅的,對於低版本的windows系統需要安裝驅動,驅動下載地址如下:
STSW-STM32102 STM32 Virtual COM Port Driver
STM32CubeMX建置
#注意這邊VCP USB中斷必須要開啟USB才能被電腦認到
Code結構
上述配置生成的代碼中,對於用戶來說USB使用相關的代碼都在 USB_DEVICE > App 中,這其中最重要的就是 usbd_cdc_if.c 文件,大多數時候我們只要改寫這個文件就可以實現相關需求了,該文件主要結構與說明如下:
static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum)
{
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *) pdev->pClassData;
/* Get the received data length */
hcdc->RxLength = USBD_LL_GetRxDataSize(pdev, epnum);
/* USB data will be immediately processed, this allow next USB traffic being
NAKed till the end of the application Xfer */
if (pdev->pClassData != NULL)
{
((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Receive(hcdc->RxBuffer, &hcdc->RxLength);
return USBD_OK;
}
else
{
return USBD_FAIL;
}
}
- CDC_Control_FS() 來自主機請求的回調函數
- CDC_Receive_FS() 接收數據回調函數;
- CDC_Transmit_FS() 用來發送數據;
- CDC_TransmitCplt_FS() 發送完成回調函數;