0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32的USB虛擬串口介紹

CHANBAEK ? 來源:頭條號科G棧 ? 作者:頭條號科G棧 ? 2023-03-23 10:10 ? 次閱讀

通常我們使用STM32進行串口通信會選擇其硬件串口,但在某些情況下串口會不夠用,這個時候就可以選擇USB的虛擬串口,這樣可以增加一個串口。

USB是非常復(fù)雜的一個設(shè)備,要想完全搞懂它需要花費不少時間和精力。但去使用它卻相對簡單。這里我們使用STM32CubeMX構(gòu)建一個初始工程,然后實現(xiàn)將我們從電腦發(fā)下來的東西原封不動地發(fā)回電腦,使用的芯片是STM32F103zet6。

USB需要配置兩個地方,一個是Connectivity下勾選USB,在Mode下勾選Device,下面的參數(shù)保持默認即可。其他芯片類型的選項可能不同,選擇有Device字樣的就OK。

pYYBAGQbtRiANmjIAAO2-9ih4Ok121.jpg

第二在Middleware下選擇USB_DEVICE,在右邊的下拉菜單選擇Communication Device Class(Virtual Port Com),下面的參數(shù)設(shè)置可以保持默認,除非你了解各個參數(shù)是干什么的,否則不建議修改。這些參數(shù)涉及到了USB的設(shè)備描述符、字符串描述符、緩存等等。

poYBAGQbtRmAUxJWAADJU4WxWiw469.jpg

其他配置包括時鐘、工程路徑、工具鏈、驅(qū)動設(shè)置等等就不羅嗦了,配置好后點擊生成代碼,我使用gcc編譯。

USB虛擬串口涉及的文件有下面三類:

底層

pYYBAGQbtRqAR9vrAAEMBTtSclk106.jpg

中間層

poYBAGQbtRuAFUvtAACoZuEK8e8861.jpg

應(yīng)用層

pYYBAGQbtRyAU9ggAABjijYjSJQ641.jpg

實際使用的時候只需要關(guān)心應(yīng)用層即可。

在編譯下載之前,我們需要在電腦安裝STM32提供的虛擬串口驅(qū)動,這在他們的官網(wǎng)可以下載到。

pYYBAGQbtR2AXYA6AAIC5aHFJUI784.jpg

驅(qū)動安裝好后,接下來看看如何實現(xiàn)數(shù)據(jù)的收發(fā)。

在usb_device.c文件下實現(xiàn)了USB設(shè)備的初始化,只需要調(diào)用它就完成了所有的USB初始化工作。

poYBAGQbtR6AZMqTAABiJKn7J28844.jpg

通過在main中調(diào)用這個函數(shù),電腦就已經(jīng)可以將芯片的USB識別為一個串口了。進一步詳細內(nèi)容就不展開了,以后會專門發(fā)文介紹USB。

pYYBAGQbtR-ALtxCAACHSUTH-nA231.jpg

上面的VID和PID可以在文件usbd_desc.c中找到,設(shè)備描述符就在這個文件中。

poYBAGQbtSCAAQ9CAACQjrlgJf0447.jpg

OK,現(xiàn)在虛擬串口正確識別了,下面就是數(shù)據(jù)的收發(fā)了。

數(shù)據(jù)收發(fā)的接口在usbd_cdc_if.c文件下。

pYYBAGQbtSGABqWhAABZeKB5XaI083.jpg

這里可以看到接收用了static關(guān)鍵字,說明它只能在本文件中使用,不可以外部調(diào)用。發(fā)送我們可以直接調(diào)用。這里先介紹發(fā)送吧。

發(fā)送

如果是發(fā)送原始數(shù)據(jù),可以直接將數(shù)據(jù)打包成數(shù)組,然后調(diào)用函數(shù)發(fā)送即可。但通常我們用串口打log,所以這里可以構(gòu)造一個printf函數(shù)。

poYBAGQbtSGAancCAAAr1ZyymKI032.jpg

這樣使用USB虛擬串口打印東西就非常方便了。這里要注意buff要夠大,否則會出現(xiàn)發(fā)送亂碼或不全的問題。

接收

USB虛擬串口的接收采用了中斷方式,芯片接收到數(shù)據(jù)后中斷回調(diào)函數(shù)會調(diào)用CDC_Receive_FS()函數(shù)接收數(shù)據(jù),然后將數(shù)據(jù)放到接收緩存中。但是軟件沒有提供直接獲得數(shù)據(jù)和個數(shù)的接口。所以我采取了一種簡單暴力的方式來獲取數(shù)據(jù)和數(shù)據(jù)個數(shù)。

pYYBAGQbtSKASCU5AAFg2Sdy4_M943.jpg

收到數(shù)據(jù)后,數(shù)據(jù)的緩存指針通過參數(shù)Buf傳進來,數(shù)據(jù)個數(shù)通過參數(shù)Len傳進來。上面三個extern的變量在main文件中定義,get_data_flag標志是否收到數(shù)據(jù),buf存放數(shù)據(jù),data_nums存放數(shù)據(jù)個數(shù)。由于USB虛擬串口一次最多接收64字節(jié),如果收到的數(shù)據(jù)多于64字節(jié),會連續(xù)調(diào)用多次接收函數(shù),上圖中的方法理論上可以任意接收不超過buf大小個字節(jié)。

在main.c中的情況如下所示:

poYBAGQbtSSALIVAAAGMphrRRn8692.jpg

運行效果如下圖所示:

pYYBAGQbtSWAac7oAAAQjjEBwrI989.jpg

使用虛擬串口波特率不起作用,任何波特率都可以用。

在main中我們還發(fā)現(xiàn)有一個USB_Status_Init()函數(shù),這個函數(shù)用來復(fù)位USB口。如果沒有這個函數(shù),每次下載完程序后需要重新插拔usb線電腦才能識別到,有了它就可以不用拔插線了。

poYBAGQbtSaADKA4AAHUvgm3dYc893.jpg

原理也很簡單,就是讓USB的兩個Pin都是低電平持續(xù)幾個毫秒即可。

OK,關(guān)于STM32的USB虛擬串口就介紹到這里了,很多細節(jié)我也不甚了解,希望看到本文的小伙伴能指正補充。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    7945

    瀏覽量

    264657
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10900

    瀏覽量

    356006
  • 串口
    +關(guān)注

    關(guān)注

    14

    文章

    1554

    瀏覽量

    76516
  • 虛擬串口
    +關(guān)注

    關(guān)注

    3

    文章

    62

    瀏覽量

    13882
  • stm32cubemx
    +關(guān)注

    關(guān)注

    5

    文章

    283

    瀏覽量

    14809
收藏 人收藏

    評論

    相關(guān)推薦

    STM32USB虛擬串口

    里面有很多資料STM32開發(fā)軟件目錄編譯軟件Keil MDKSTM32CubeMX下載軟件STM32 ISP for F1軟件Flash Loader軟件STVPST-link下載STM32
    發(fā)表于 08-23 09:17

    USB虛擬串口是什么

    USB虛擬串口是什么?STM32 USB虛擬串口有何
    發(fā)表于 10-08 08:52

    介紹STM32F407 USB轉(zhuǎn)串口功能的實現(xiàn)

    之前的文章中介紹STM32USB接口虛擬串口的功能。《STM32CubeMX之
    發(fā)表于 02-22 06:29

    stm32f103&gd32的usb虛擬串口,打印類printer組合設(shè)備

    stm32f103&gd32的usb虛擬串口+打印類printer組合設(shè)備@TOCstm32f103&gd32的
    發(fā)表于 12-02 16:06 ?55次下載
    <b class='flag-5'>stm32</b>f103&gd32的<b class='flag-5'>usb</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>,打印類printer組合設(shè)備

    STM32 USB虛擬串口ISP在線更新

    通過STM32虛擬串口實現(xiàn)Flash Loader協(xié)議的具體流程
    發(fā)表于 12-03 19:36 ?10次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>USB</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>ISP在線更新

    STM32 USB CDC 虛擬串口

    虛擬串口和上位機進行數(shù)據(jù)通信,通常只枚舉一個串口基本就能滿足要求。但是STM32 USB提供了足夠的的端點可以在需要的情況下枚舉出多個
    發(fā)表于 12-27 19:06 ?25次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>USB</b> CDC <b class='flag-5'>虛擬</b>多<b class='flag-5'>串口</b>

    STM32CUBEMX F103 HAL庫開發(fā)之 USB虛擬串口

    今天心血來潮想寫點東西做比賽這么久了,應(yīng)該寫點東西,一是為了給自己學的知識一個總結(jié),二是可以鍛煉自己的寫作能力與表達能力,幫助他人避免自己走過的坑stm32 USB VPC虛擬串口簡介
    發(fā)表于 12-28 19:44 ?8次下載
    <b class='flag-5'>STM32</b>CUBEMX F103 HAL庫開發(fā)之 <b class='flag-5'>USB</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>

    stm32 usb虛擬串口收發(fā)數(shù)據(jù)

    stm32 usb虛擬串口收發(fā)數(shù)據(jù)1.stm32 usb虛擬
    發(fā)表于 12-28 19:45 ?44次下載
    <b class='flag-5'>stm32</b> <b class='flag-5'>usb</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>收發(fā)數(shù)據(jù)

    USB虛擬串口

    STM32實現(xiàn)虛擬串口功能廢話不多說直接上代碼,Gitlab下載鏈接。USB虛擬串口用的是正點原
    發(fā)表于 12-28 19:49 ?11次下載
    <b class='flag-5'>USB</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>

    STM32 USB虛擬串口波特率問題(含源碼)

    之前的文章中介紹STM32USB接口虛擬串口的功能?!?b class='flag-5'>STM32CubeMX之
    發(fā)表于 12-28 19:51 ?21次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>USB</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>波特率問題(含源碼)

    STM32實現(xiàn)USB轉(zhuǎn)串口功能(含源碼)

    之前的文章中介紹STM32USB接口虛擬串口的功能?!?b class='flag-5'>STM32CubeMX之
    發(fā)表于 12-28 20:03 ?55次下載
    <b class='flag-5'>STM32</b>實現(xiàn)<b class='flag-5'>USB</b>轉(zhuǎn)<b class='flag-5'>串口</b>功能(含源碼)

    基于 RT-Thread 在 STM32 上實現(xiàn) USB 虛擬串口

    之前由于工作需要,基于 RT-Thread 在 STM32 上實現(xiàn)了 USB 虛擬串口。為了方便大家,我在這里把在正點原子 F429 阿波羅開發(fā)板上實現(xiàn)
    發(fā)表于 02-10 10:01 ?4次下載
    基于 RT-Thread 在 <b class='flag-5'>STM32</b> 上實現(xiàn) <b class='flag-5'>USB</b> <b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>

    基于 RT-Thread 在 STM32 上實現(xiàn) USB 虛擬串口

    之前由于工作需要,基于 RT-Thread 在 STM32 上實現(xiàn)了 USB 虛擬串口。為了方便大家,我在這里把在正點原子 F429 阿波羅開發(fā)板上實現(xiàn)
    發(fā)表于 02-10 10:28 ?9次下載
    基于 RT-Thread 在 <b class='flag-5'>STM32</b> 上實現(xiàn) <b class='flag-5'>USB</b> <b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>

    STM32 USB虛擬串口驅(qū)動

    電子發(fā)燒友網(wǎng)站提供《STM32 USB虛擬串口驅(qū)動.rar》資料免費下載
    發(fā)表于 10-09 15:25 ?103次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>USB</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>驅(qū)動

    stm32虛擬串口接收的數(shù)據(jù)處理

    STM32中使用虛擬串口時,我們需要處理接收的數(shù)據(jù)。接收到的數(shù)據(jù)可能是來自其他設(shè)備的傳感器數(shù)據(jù)、用戶輸入的命令或其他任何信息。在本篇文章中,我將詳細介紹
    的頭像 發(fā)表于 12-20 11:22 ?2300次閱讀