1. 目標
本文介紹CubeMX生成 USB CDC類虛擬串口工程的操作步驟。
2. 配置流程
-
時鐘配置
- usb外設需要48M時鐘輸入
- stm32405使用外部時鐘源HSE,否則配不出來48M時鐘
- stm32h750內部有一個48M時鐘
- stm32f405時鐘配置
- stm32h750時鐘配置
-
Connectivity ->USB_OTG_FS 和 Connectivity ->USB_OTG_FS 配置
- stm32 usb內置了一個全速PHY,如果要使用內置PHY則選中 Connectivity ->USB_OTG_FS。
- stm32 usb同時引出一個ULPI接口,可以外接高速PHY,如果要使用外部高速PHY則選中 Connectivity ->USB_OTG_HS。
- PC機作為主機 選擇 Device_Only。
- USB_OTG_FS 和 USB_OTG_HS 可以同時配置
-
Middleware and Software Packs ->USB_DEVICE配置
- 如圖,選擇cdc設備
- 如圖,選擇cdc設備
-
配置結束,生成工程。
3. 測試
- 將代碼下載進板子,插入電腦,即可看見枚舉出兩個com口
- 用戶接口說明
usbd_cdc_if.h 和 usbd_cdc_if.c 提供用戶接口
函數 | 說明 |
---|---|
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) | 全速設備,向主機發送內容,通過批量IN端點發送 |
uint8_t CDC_Transmit_HS(uint8_t* Buf, uint16_t Len) | 高速設備,向主機發送內容,通過批量IN端點發送 |
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) | 全速設備,接收到主機發送的內容時會調用這個函數,通過批量OUT端點發接收 |
static int8_t CDC_Receive_HS(uint8_t* Buf, uint32_t *Len) | 高速設備,接收到主機發送的內容時會調用這個函數,通過批量OUT端點發接收 |
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length) | 全速設備,CDC類請求處理函數,控制傳輸,例如:可以設置或讀取線路編碼,包括波特率、停止位、校驗位和數據位 |
static int8_t CDC_Control_HS(uint8_t cmd, uint8_t* pbuf, uint16_t length) | 高速設備,CDC類請求處理函數,控制傳輸,例如:可以設置或讀取線路編碼,包括波特率、停止位、校驗位和數據位 |
- 回環測試
在接收函數CDC_Receive_FS中將接收到的數據通過CDC_Transmit_FS發送,代碼如下:
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{/* USER CODE BEGIN 6 */CDC_Transmit_FS(Buf, *Len);USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);USBD_CDC_ReceivePacket(&hUsbDeviceFS);return (USBD_OK);/* USER CODE END 6 */
}