STM32的USB虚拟串口介绍

发布时间:2023-06-20  

通常我们使用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虚拟串口就介绍到这里了,很多细节我也不甚了解,希望看到本文的小伙伴能指正补充。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>