1. 引言
在嵌入式系統開發中,USB 虛擬串口是一種非常實用的功能。它允許 STM32 微控制器通過 USB 接口與計算機進行通信,就像使用傳統的串口一樣。這種方式不僅簡化了硬件設計,還提高了通信的靈活性和穩定性。STM32F407 系列微控制器具有強大的處理能力和豐富的外設資源,配合 HAL 庫可以方便地實現 USB 虛擬串口功能。
2. 開發環境搭建
2.1 硬件準備
- STM32F407 開發板:選擇一款基于 STM32F407 的開發板,如正點原子的探索者 STM32F407 開發板。
- USB 數據線:用于連接開發板和計算機。
2.2 軟件準備
- Keil MDK:一款專業的 ARM 微控制器開發工具,用于編寫、編譯和調試代碼。
- STM32CubeMX:ST 官方提供的圖形化配置工具,可用于快速生成 STM32 項目的初始化代碼。
?
點擊生成代碼;
注意幾處需要修改的地方:
?
?
?
3. USB 虛擬串口原理
3.1 USB 協議基礎
USB(Universal Serial Bus)是一種通用的串行總線標準,具有高速、可靠、易用等特點。USB 協議定義了設備與主機之間的通信方式,包括設備枚舉、數據傳輸等過程。
3.2 CDC 類協議
CDC(Communication Device Class)是 USB 協議中的一種設備類,專門用于實現虛擬串口通信。CDC 類協議定義了兩個接口:通信接口(Communication Interface)和數據接口(Data Interface)。通信接口用于發送和接收控制命令,數據接口用于傳輸實際的數據。
3.3 數據傳輸過程
4.2 數據接收處理
在usbd_cdc_if.c
文件中,有一個CDC_Receive_FS
回調函數,用于處理接收到的數據。以下是該函數的示例代碼:
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{/* USER CODE BEGIN 6 */USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);USBD_CDC_ReceivePacket(&hUsbDeviceFS);// 處理接收到的數據for (uint32_t i = 0; i < *Len; i++){// 這里可以添加具體的數據處理邏輯// 例如將接收到的數據原樣發送回去CDC_Transmit_FS(&Buf[i], 1);}return (USBD_OK);/* USER CODE END 6 */
}
4.3 數據發送處理
在usbd_cdc_if.c
文件中,有一個CDC_Transmit_FS
函數,用于發送數據。以下是該函數的示例代碼:
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{uint8_t result = USBD_OK;/* USER CODE BEGIN 7 */USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;if (hcdc->TxState != 0){return USBD_BUSY;}USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);/* USER CODE END 7 */return result;
}
4.4 主函數代碼
在main.c
文件中,需要對 USB 設備進行初始化,并啟動數據接收。以下是主函數的示例代碼:
5. 代碼編譯與下載
5.1 代碼編譯
打開 Keil MDK,導入 STM32CubeMX 生成的項目代碼。在 Keil MDK 中進行編譯,確保代碼沒有錯誤和警告。
5.2 代碼下載
將開發板通過 USB 數據線連接到計算機,使用 ST-Link 或 J-Link 等調試器將編譯好的代碼下載到開發板中。
6. 測試與驗證
6.1 計算機端軟件準備
在計算機上安裝串口調試助手,如串口調試精靈、SSCOM 等。
6.2 設備識別
將開發板通過 USB 數據線連接到計算機,計算機應該能夠識別出一個新的串口設備。
6.3 數據收發測試
打開串口調試助手,選擇識別到的串口,設置波特率為 115200(USB 虛擬串口的波特率不影響實際通信速度)。在串口調試助手中發送數據,開發板應該能夠接收到數據并將其原樣發送回去。
7. 常見問題及解決方法
7.1 設備無法識別
7.2 數據收發異常
8. 擴展功能
8.1 數據解析與處理
在CDC_Receive_FS
函數中添加更復雜的數據解析邏輯,例如解析特定的命令格式,實現不同的功能。
8.2 多線程處理
使用 STM32 的 RTOS(實時操作系統),如 FreeRTOS,將數據接收和處理任務分配到不同的線程中,提高系統的實時性和穩定性。
9. 總結
通過以上步驟,你可以基于 STM32F407 HAL 庫實現 USB 虛擬串口功能。USB 虛擬串口為 STM32 開發板與計算機之間的通信提供了一種方便、高效的方式,在實際應用中具有廣泛的用途。
- 設備枚舉:當 STM32 開發板通過 USB 連接到計算機時,計算機會對設備進行枚舉,獲取設備的描述符信息,確定設備的類型和功能。
- 建立通信:枚舉完成后,計算機和 STM32 開發板之間建立起 USB 通信連接。
- 數據傳輸:通過 CDC 類協議,計算機可以向 STM32 開發板發送數據,也可以接收 STM32 開發板發送的數據。
4. 代碼實現
4.1 生成的代碼結構
使用 STM32CubeMX 生成的代碼包含了 USB 虛擬串口的基本框架,主要文件有:
- usbd_cdc_if.c:實現了 CDC 類接口的回調函數,負責處理數據的發送和接收。
- usbd_cdc.c:實現了 CDC 類的核心功能,包括設備枚舉、控制命令處理等。
- usbd_core.c:實現了 USB 設備的核心功能,包括設備初始化、數據傳輸等。
- 檢查硬件連接:確保 USB 數據線連接正常,開發板的電源正常。
- 檢查 USB 驅動:在設備管理器中查看是否有未識別的設備,嘗試更新 USB 驅動。
- 檢查代碼邏輯:確保
CDC_Receive_FS
和CDC_Transmit_FS
函數的實現正確。 - 檢查緩沖區大小:確保數據緩沖區足夠大,避免數據溢出。
?