【STM32+cubemx】0016 HAL庫開發:USB虛擬串口(virtual COM)


stm32很多系列的芯片都帶usb接口,而且cubemx也能生成多種功能的usb初始化代碼,使得一般用戶可以不用關注usb底層復雜的實現方式,直接使用HAL函數就能方便地實現usb通信。本節我們就來學習cubemx生成虛擬串口(USB virtual COM)的使用方法。

1)生成USB虛擬串口工程

仍然使用串口工程,如下圖添加USB的配置:

可以看到,勾選usb device的功能后,右側的芯片引腳已經設置好了,DP和DM兩根線就是usb通信的差分線。

再配置USB的軟件中間件,選擇usb device,virtual port COM,也就是虛擬串口:

修改時鍾設置,把usb時鍾設置為48M:

其他的配置都不用改,就可以生成工程代碼了。

2)收、發函數的改寫

打開生成的keil工程,可以看到已經生成了幾個usb相關的源文件:

簡單說明一下這幾個文件的作用:

usb_device.c是USB設備函數初始化函數MX_USB_DEVICE_Init(),在main函數開始時會調用;

usb_desc.c包含USB的描述符,以及USB枚舉處理等函數,也屬於初始配置的一些函數;

usb_conf.c是管腳配置文件,包含引USB引腳初始化以及參數設置,中斷回調函數等;

usbd_cdc_if.c是USB的CDC類應用層文件,里面包含虛擬串口的接收,發送和控制等函數,也是我們主要關注的一個文件。

打開usbd_cdc_if.c文件,找到CDC_Receive_FSCDC_Transmit_FS這兩個函數,它們就是應用層實現收、發的函數。

先看發送函數,這個函數可以直接被用戶使用:

簡單地調用這個函數,只要輸入發送數據的首地址、長度,就能把數據從usb虛擬串口發送出去了。

這里為了更方便地使用,我們添加以下重定向代碼:

和串口輸出的重定向一樣,我們將usb輸出也重定向到一個函數USBVcom_printf,這樣我們也能像使用printf一樣使用usb向外輸出數據了。

與串口重定向的實現基本一樣,只是把串口的語句發送替換成了USB的發送。

再看接收函數:

選中的兩行是我們需要添加的,其他的都是HAL庫自動生成的。

這個函數實現了接收數據,把接收到的(*Len)個數據存放在Buf地址中。由於這個函數是static類型的,只能在該文件內使用,不要在用戶的代碼中調用它;所以我們只添加兩條語句,將數據和長度傳出來就行了。

Memcpy()函數實現了把Buf中的數拷貝到usb_rx_data中。

改寫完發送和接收函數,就可以開始測試了。

3)系統測試

在主函數的循環中添加如下測試用代碼:

這里將發送和接收都測試了一下。

USBVcom_printf()函數每1s固定從usb虛擬串口發出一串數據,用來驗證發送;

if(...) {... } 代碼段中,檢測usb虛擬串口是否有收到數,如果長度不為0則收到了數,把收到的數通過實際的串口1發送回去;再重置長度標志為0,等待下一次接收。

到這里,測試代碼就編寫完了。

在測試前,先確認一下開發板的硬件狀態,開發板的usb口需要用usb線連接到計算機的U口;另外,硬件上,DP(也就是PA12)需要用電阻上拉,否則計算機不能識別出usb設備:

編譯代碼、下載運行后,可發現計算機多識別出了一個串口5:

(有些系統較老的計算機可能需要安裝驅動程序,可在文末獲取代碼和驅動下載)

用兩個串口調試助手進行試驗。

一個打開com5,一個打開com3;可以看到com5每1s可以收到一串數據,是usb虛擬串口發出來的;從com5發送一串數據出去,可以看到com3打印了出來,說明stm32端通過虛擬串口收到了數據,並從實際的串口打印出來了:

注意,usb虛擬串口的波特率(com5)可以設為其他值,能夠自動識別。

Cubemx生成的虛擬串口,只實現了基本的功能,實際工程中使用時,還需要增加許多提高穩定性、容錯性的代碼,才能成為可靠的產品。

好了,本節usb虛擬串口的簡單使用,就講到這里了。


歡迎關注我的公眾號,可留言 “資料” 獲取相關資料和軟件:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM