企業(yè)網(wǎng)站功能模塊長春做網(wǎng)站推廣的公司
例程:STM32USBdevice: 基于STM32的USB設備例子程序 - Gitee.com
本篇為USB虛擬串口教程,沒有知識,全是實操,按照步驟就能獲得一個STM32的USB虛擬串口。本例子是在野火F103MINI開發(fā)板上驗證的,如果代碼中出現(xiàn)一些外設的配置,可以參考野火F103MINI開發(fā)板原理圖對照。
設置外部晶振,必須要使用外部晶振,因為USB控制器需要48M的系統(tǒng)時鐘,內(nèi)部晶振無法倍頻出48M。
配置外部時鐘
配置調(diào)試口和系統(tǒng)基準源
開啟USB設備
中間件中設備USB設備類型
我使用了freertos v2
配置外部系統(tǒng)時鐘
配置獨立C和H文件
USB相關的代碼都在這個文件夾中
最常處理的只有下面四個函數(shù):
CDC_Control_FS() 來自主機請求的回調(diào)函數(shù)
CDC_Receive_FS() 接收數(shù)據(jù)回調(diào)函數(shù);
CDC_Transmit_FS() 用來發(fā)送數(shù)據(jù);
CDC_TransmitCplt_FS() 發(fā)送完成回調(diào)函數(shù);
實現(xiàn)回環(huán)測試很簡單,之需要在usbd_cdc_if.c文件中添加下面一句話
編譯后下載程序,會在設備中看到如下
可以使用串口助手進行回環(huán)測試,因為是虛擬串口,所以在這里波特率可以隨意設置
上面中在 CDC_Receive_FS 中添加了一行 CDC_Transmit_FS(Buf, *Len); 代碼,可以看到演示中實現(xiàn)了回環(huán)效果,上位機不管發(fā)送什么數(shù)據(jù)下位機都會原樣返回。并且可以發(fā)現(xiàn)不管上位機軟件中波特率設置為多少都可以正常通訊,因為使用USB虛擬串口的時候真正數(shù)據(jù)傳輸用的是USB,串口本身參數(shù)這些已經(jīng)無所謂了。
上面方式演示中其實存在一個問題,演示中并未體現(xiàn)出來,如果你嘗試在上位機一次向下發(fā)送超過64個字節(jié)數(shù)據(jù),那么你收到的返回數(shù)據(jù)可能就只有64個字節(jié)。USB數(shù)據(jù)的收發(fā)都是以一個一個包的形式進行的,包的大小一方面和USB協(xié)議有關,另一方面和程序有關。在上面工程的 usbd_cdc.h 文件中可以找到相關定義:
USB的 IN / OUT 都是從HOST而言說的,對于Device而言IN指的是發(fā)送,OUT指的是接收。 默認定義下USB_FS收發(fā)每一個包的大小均為64字節(jié)。 前面提到的大于64字節(jié)出現(xiàn)的問題中,第一次進入 CDC_Receive_FS 將接收到64個字節(jié)數(shù)據(jù),這時候調(diào)用了 CDC_Transmit_FS 回發(fā)數(shù)據(jù);接著重啟接收將立馬接到第二個包數(shù)據(jù),然后第二次調(diào)用 CDC_Transmit_FS ,這個時候前一次的發(fā)送還未處理完成,此次調(diào)用將失敗。
針對這個問題在使用的時候要合理設計數(shù)據(jù)收發(fā)邏輯。對于接收而言可以設計特殊字符用于標示一幀數(shù)據(jù)結(jié)束,或是設計超時時間來判斷一幀數(shù)據(jù)結(jié)束。對于發(fā)送而言通常不會有太大問題,一次性發(fā)送大量數(shù)據(jù)也行,在全部發(fā)送完成后會觸發(fā)發(fā)送完成回調(diào)函數(shù)CDC_TransmitCplt_FS;
設置串口參數(shù)
使用USB虛擬串口的時候真正數(shù)據(jù)傳輸用的是USB,串口本身參數(shù)這些已經(jīng)無所謂了。不過有一種情況會需要這些串口參數(shù),比如單片機一方面與上位機通過USB虛擬串口方式進行通訊,另一方面通過物理串口和其它模塊進行通訊,單片機只做數(shù)據(jù)轉(zhuǎn)發(fā)工作。這個時候單片機物理串口的參數(shù)就必須要能與其它模塊匹配,這個參數(shù)如果要通過上位機來設置的話就需要對 CDC_Control_FS() 中的 CDC_SET_LINE_CODING 節(jié)點進行處理了:
進入這個函數(shù)后會通過pbuf這個變量按照上面注釋獲得PC端配置串口的信息。
下面我們舉例一個自己打印的消息例子,方便后期理解
我還做了一個阻塞測試,我在點燈的地方主動發(fā)送了一個數(shù)據(jù),
我發(fā)現(xiàn)即使不連接USB,程序也沒有被阻塞,與這個對比的是STC8系列的單片機的虛擬串口,STC8系列單片機會阻塞程序,而STM32并不會,這很好。