0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32的USB虚拟串口介绍

CHANBAEK 来源:头条号科G栈 作者:头条号科G栈 2023-03-23 10:10 次阅读

通常我们使用STM32进行串口通信会选择其硬件串口,但在某些情况下串口会不够用,这个时候就可以选择USB的虚拟串口,这样可以增加一个串口。

USB是非常复杂的一个设备,要想完全搞懂它需要花费不少时间和精力。但去使用它却相对简单。这里我们使用STM32CubeMX构建一个初始工程,然后实现将我们从电脑发下来的东西原封不动地发回电脑,使用的芯片是STM32F103zet6。

USB需要配置两个地方,一个是Connectivity下勾选USB,在Mode下勾选Device,下面的参数保持默认即可。其他芯片类型的选项可能不同,选择有Device字样的就OK。

pYYBAGQbtRiANmjIAAO2-9ih4Ok121.jpg

第二在Middleware下选择USB_DEVICE,在右边的下拉菜单选择Communication Device Class(Virtual Port Com),下面的参数设置可以保持默认,除非你了解各个参数是干什么的,否则不建议修改。这些参数涉及到了USB的设备描述符、字符串描述符、缓存等等。

poYBAGQbtRmAUxJWAADJU4WxWiw469.jpg

其他配置包括时钟、工程路径、工具链、驱动设置等等就不罗嗦了,配置好后点击生成代码,我使用gcc编译。

USB虚拟串口涉及的文件有下面三类:

底层

pYYBAGQbtRqAR9vrAAEMBTtSclk106.jpg

中间层

poYBAGQbtRuAFUvtAACoZuEK8e8861.jpg

应用层

pYYBAGQbtRyAU9ggAABjijYjSJQ641.jpg

实际使用的时候只需要关心应用层即可。

在编译下载之前,我们需要在电脑安装STM32提供的虚拟串口驱动,这在他们的官网可以下载到。

pYYBAGQbtR2AXYA6AAIC5aHFJUI784.jpg

驱动安装好后,接下来看看如何实现数据的收发。

在usb_device.c文件下实现了USB设备的初始化,只需要调用它就完成了所有的USB初始化工作。

poYBAGQbtR6AZMqTAABiJKn7J28844.jpg

通过在main中调用这个函数,电脑就已经可以将芯片的USB识别为一个串口了。进一步详细内容就不展开了,以后会专门发文介绍USB。

pYYBAGQbtR-ALtxCAACHSUTH-nA231.jpg

上面的VID和PID可以在文件usbd_desc.c中找到,设备描述符就在这个文件中。

poYBAGQbtSCAAQ9CAACQjrlgJf0447.jpg

OK,现在虚拟串口正确识别了,下面就是数据的收发了。

数据收发的接口在usbd_cdc_if.c文件下。

pYYBAGQbtSGABqWhAABZeKB5XaI083.jpg

这里可以看到接收用了static关键字,说明它只能在本文件中使用,不可以外部调用。发送我们可以直接调用。这里先介绍发送吧。

发送

如果是发送原始数据,可以直接将数据打包成数组,然后调用函数发送即可。但通常我们用串口打log,所以这里可以构造一个printf函数。

poYBAGQbtSGAancCAAAr1ZyymKI032.jpg

这样使用USB虚拟串口打印东西就非常方便了。这里要注意buff要够大,否则会出现发送乱码或不全的问题。

接收

USB虚拟串口的接收采用了中断方式,芯片接收到数据后中断回调函数会调用CDC_Receive_FS()函数接收数据,然后将数据放到接收缓存中。但是软件没有提供直接获得数据和个数的接口。所以我采取了一种简单暴力的方式来获取数据和数据个数。

pYYBAGQbtSKASCU5AAFg2Sdy4_M943.jpg

收到数据后,数据的缓存指针通过参数Buf传进来,数据个数通过参数Len传进来。上面三个extern的变量在main文件中定义,get_data_flag标志是否收到数据,buf存放数据,data_nums存放数据个数。由于USB虚拟串口一次最多接收64字节,如果收到的数据多于64字节,会连续调用多次接收函数,上图中的方法理论上可以任意接收不超过buf大小个字节。

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

poYBAGQbtSSALIVAAAGMphrRRn8692.jpg

运行效果如下图所示:

pYYBAGQbtSWAac7oAAAQjjEBwrI989.jpg

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

在main中我们还发现有一个USB_Status_Init()函数,这个函数用来复位USB口。如果没有这个函数,每次下载完程序后需要重新插拔usb线电脑才能识别到,有了它就可以不用拔插线了。

poYBAGQbtSaADKA4AAHUvgm3dYc893.jpg

原理也很简单,就是让USB的两个Pin都是低电平持续几个毫秒即可。

OK,关于STM32的USB虚拟串口就介绍到这里了,很多细节我也不甚了解,希望看到本文的小伙伴能指正补充。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • usb
    usb
    +关注

    关注

    59

    文章

    7422

    浏览量

    258046
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348720
  • 串口
    +关注

    关注

    14

    文章

    1483

    浏览量

    74502
  • 虚拟串口
    +关注

    关注

    3

    文章

    56

    浏览量

    13737
  • stm32cubemx
    +关注

    关注

    5

    文章

    260

    浏览量

    14447
收藏 人收藏

    评论

    相关推荐

    USB虚拟串口

    USB虚拟串口是使用USB的CDC类实现的一种通讯接口。使用STM32自带的USBslave功能在电脑上实现一个
    发表于 08-03 08:15

    USB虚拟串口

    今天心血来潮想写点东西做比赛这么久了,应该写点东西,一是为了给自己学的知识一个总结,二是可以锻炼自己的写作能力与表达能力,帮助他人避免自己走过的坑stm32 USB VPC虚拟串口简介
    发表于 08-11 06:14

    如何使用STM32 HAL库来实现USB虚拟串口打印功能

    概述 本篇文章介绍如何使用STM32使用HAL库,来实现USB虚拟串口打印功能,代替传统中的串口
    发表于 08-12 08:05

    STM32USB虚拟串口

    里面有很多资料STM32开发软件目录编译软件Keil MDKSTM32CubeMX下载软件STM32 ISP for F1软件Flash Loader软件STVPST-link下载STM32
    发表于 08-23 09:17

    USB虚拟串口是什么

    USB虚拟串口是什么?STM32 USB虚拟串口有何
    发表于 10-08 08:52

    介绍STM32F407 USB串口功能的实现

    之前的文章中介绍STM32USB接口虚拟串口的功能。《STM32CubeMX之
    发表于 02-22 06:29

    STM32 USB CDC 虚拟串口

    虚拟串口和上位机进行数据通信,通常只枚举一个串口基本就能满足要求。但是STM32 USB提供了足够的的端点可以在需要的情况下枚举出多个
    发表于 12-27 19:06 21次下载
    <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库开发之 USB虚拟串口

    今天心血来潮想写点东西做比赛这么久了,应该写点东西,一是为了给自己学的知识一个总结,二是可以锻炼自己的写作能力与表达能力,帮助他人避免自己走过的坑stm32 USB VPC虚拟串口简介
    发表于 12-28 19:44 8次下载
    <b class='flag-5'>STM32</b>CUBEMX F103 HAL库开发之 <b class='flag-5'>USB</b><b class='flag-5'>虚拟</b><b class='flag-5'>串口</b>

    stm32 usb虚拟串口收发数据

    stm32 usb虚拟串口收发数据1.stm32 usb虚拟
    发表于 12-28 19:45 43次下载
    <b class='flag-5'>stm32</b> <b class='flag-5'>usb</b><b class='flag-5'>虚拟</b><b class='flag-5'>串口</b>收发数据

    USB虚拟串口

    STM32实现虚拟串口功能废话不多说直接上代码,Gitlab下载链接。USB虚拟串口用的是正点原
    发表于 12-28 19:49 11次下载
    <b class='flag-5'>USB</b><b class='flag-5'>虚拟</b><b class='flag-5'>串口</b>

    STM32 USB虚拟串口波特率问题(含源码)

    之前的文章中介绍STM32USB接口虚拟串口的功能。《STM32CubeMX之
    发表于 12-28 19:51 20次下载
    <b class='flag-5'>STM32</b> <b class='flag-5'>USB</b><b class='flag-5'>虚拟</b><b class='flag-5'>串口</b>波特率问题(含源码)

    STM32实现USB串口功能(含源码)

    之前的文章中介绍STM32USB接口虚拟串口的功能。《STM32CubeMX之
    发表于 12-28 20:03 51次下载
    <b class='flag-5'>STM32</b>实现<b class='flag-5'>USB</b>转<b class='flag-5'>串口</b>功能(含源码)

    基于 RT-Thread 在 STM32 上实现 USB 虚拟串口

    之前由于工作需要,基于 RT-Thread 在 STM32 上实现了 USB 虚拟串口。为了方便大家,我在这里把在正点原子 F429 阿波罗开发板上实现
    发表于 02-10 10:28 9次下载
    基于 RT-Thread 在 <b class='flag-5'>STM32</b> 上实现 <b class='flag-5'>USB</b> <b class='flag-5'>虚拟</b><b class='flag-5'>串口</b>

    STM32 USB虚拟串口驱动

    电子发烧友网站提供《STM32 USB虚拟串口驱动.rar》资料免费下载
    发表于 10-09 15:25 55次下载
    <b class='flag-5'>STM32</b> <b class='flag-5'>USB</b><b class='flag-5'>虚拟</b><b class='flag-5'>串口</b>驱动

    stm32虚拟串口接收的数据处理

    STM32中使用虚拟串口时,我们需要处理接收的数据。接收到的数据可能是来自其他设备的传感器数据、用户输入的命令或其他任何信息。在本篇文章中,我将详细介绍
    的头像 发表于 12-20 11:22 809次阅读