通常我們使用STM32進行串口通信會選擇其硬件串口,但在某些情況下串口會不夠用,這個時候就可以選擇USB的虛擬串口,這樣可以增加一個串口。
USB是非常復雜的一個設備,要想完全搞懂它需要花費不少時間和精力。但去使用它卻相對簡單。這里我們使用STM32CubeMX構建一個初始工程,然后實現將我們從電腦發下來的東西原封不動地發回電腦,使用的芯片是STM32F103zet6。
USB需要配置兩個地方,一個是Connectivity下勾選USB,在Mode下勾選Device,下面的參數保持默認即可。其他芯片類型的選項可能不同,選擇有Device字樣的就OK。
第二在Middleware下選擇USB_DEVICE,在右邊的下拉菜單選擇Communication Device Class(Virtual Port Com),下面的參數設置可以保持默認,除非你了解各個參數是干什么的,否則不建議修改。這些參數涉及到了USB的設備描述符、字符串描述符、緩存等等。
其他配置包括時鐘、工程路徑、工具鏈、驅動設置等等就不羅嗦了,配置好后點擊生成代碼,我使用gcc編譯。
USB虛擬串口涉及的文件有下面三類:
底層
中間層
應用層
實際使用的時候只需要關心應用層即可。
在編譯下載之前,我們需要在電腦安裝STM32提供的虛擬串口驅動,這在他們的官網可以下載到。
驅動安裝好后,接下來看看如何實現數據的收發。
在usb_device.c文件下實現了USB設備的初始化,只需要調用它就完成了所有的USB初始化工作。
通過在main中調用這個函數,電腦就已經可以將芯片的USB識別為一個串口了。進一步詳細內容就不展開了,以后會專門發文介紹USB。
上面的VID和PID可以在文件usbd_desc.c中找到,設備描述符就在這個文件中。
OK,現在虛擬串口正確識別了,下面就是數據的收發了。
這里可以看到接收用了static關鍵字,說明它只能在本文件中使用,不可以外部調用。發送我們可以直接調用。這里先介紹發送吧。
發送
如果是發送原始數據,可以直接將數據打包成數組,然后調用函數發送即可。但通常我們用串口打log,所以這里可以構造一個printf函數。
這樣使用USB虛擬串口打印東西就非常方便了。這里要注意buff要夠大,否則會出現發送亂碼或不全的問題。
接收
USB虛擬串口的接收采用了中斷方式,芯片接收到數據后中斷回調函數會調用CDC_Receive_FS()函數接收數據,然后將數據放到接收緩存中。但是軟件沒有提供直接獲得數據和個數的接口。所以我采取了一種簡單暴力的方式來獲取數據和數據個數。
收到數據后,數據的緩存指針通過參數Buf傳進來,數據個數通過參數Len傳進來。上面三個extern的變量在main文件中定義,get_data_flag標志是否收到數據,buf存放數據,data_nums存放數據個數。由于USB虛擬串口一次最多接收64字節,如果收到的數據多于64字節,會連續調用多次接收函數,上圖中的方法理論上可以任意接收不超過buf大小個字節。
在main.c中的情況如下所示:
運行效果如下圖所示:
使用虛擬串口波特率不起作用,任何波特率都可以用。
在main中我們還發現有一個USB_Status_Init()函數,這個函數用來復位USB口。如果沒有這個函數,每次下載完程序后需要重新插拔usb線電腦才能識別到,有了它就可以不用拔插線了。
原理也很簡單,就是讓USB的兩個Pin都是低電平持續幾個毫秒即可。
OK,關于STM32的USB虛擬串口就介紹到這里了,很多細節我也不甚了解,希望看到本文的小伙伴能指正補充。
-
usb
+關注
關注
60文章
7980瀏覽量
266077 -
STM32
+關注
關注
2272文章
10923瀏覽量
357553 -
串口
+關注
關注
14文章
1557瀏覽量
77036 -
虛擬串口
+關注
關注
3文章
62瀏覽量
13941 -
stm32cubemx
+關注
關注
5文章
284瀏覽量
15002
發布評論請先 登錄
相關推薦
評論