STM32虚拟通信USB从设备实现

        USB设备是USB电缆末端的一个硬件,它执行用户功能。可以将USB设备分为USB总线接口、USB逻辑设备和功能设备三部分。主机到设备的连接需要经过多个层和多个实体之间的交互作用,USB总线接口层提供了在USB数据线上数据的底层传输。

       USB从机模式下,外部 USB 硬件充当USB主机。(作为)附件的例子,包括机器人控制器、扩展插座(docking stations)、诊断和音乐设备、电子报亭(kiosks)、读卡器等其他设备。(外围)设备的例子,包括数码像机,键盘,鼠标和游戏控制器。而32单片机可以实现当USB从设备,可以让电脑识别到单片机为从设备。

        下面是USB从机时钟的配置,根据手册我们需要将时钟源设置到外界的时钟上,且使USB 时钟为40MHZ。

222316d05d9a449cad579ddd9bc097fd.png

d87e0de5b26e414181fb72453aeb0882.png

 注意,STM32D103内部的USB接口只能当从设备。

c7fcb9308b8a429aaf39dd299120923c.png

3a9f1ec719864dd089be56f0d2b35659.png

7e9e4654bb5745e9aacf8837cd1eb953.png 

d62289ca07ec4ac184fb2a33a14a1659.png

这里CubeMX可以生成不同设备类型的驱动程序:

1、做U盘、移动硬盘可选择大容量存储类 

2、做声卡可选择音频设备类

3、做鼠标键盘可选择人机界面类

4、做通信则选择通信设备类

23067621f1514f50ba302d18ca60dab3.png

这里可设置被电脑识别到的设备类型和描述符,这里的设置只影响电脑上的设备属性。 

4e5429b4d9a64957b64b26565a99366d.png

        由于USB虚拟串口的驱动程序比较复杂,需要占用更多的内存,把那两项的值改成0x1000,预留更大的空间给USB驱动程序。这样才够USB驱动程序使用。如果空间少了,则会出现无法编译等情况,然后就可以生成项目文件了。

9f93eb55d0d94ab6b58861fcad4ae4a4.png

        需要弄清楚自己需要在那个设备文件中进行修改。在上图中USB_DEVICE下的APP是应用层的驱动文件,这个部分需要我们针对应用的需求进行修改。因为我们做的是虚拟串口,所以我们只需要修改红色框框内的程序。下面进行修改如图所示

usbd_cdc_if.c

37dccd84f0cc48298ec4e165f85de3ef.png

dfd3a10a31414054bf84927d380893fc.png

 上面的函数就是类似于串口的回调函数,下面则是发送函数 。

97d484e2a6ee45428067136dff48dce4.png

下面则是类似于printf的函数,可以让我们在虚拟串口中打印

22465d22d0ca46dd8c229adaf6b20f8d.png

接下来是usbd_cdc_if.h

5272c05d7a194a6e946e556d8a8fbdcd.png 

        这里就做好了USB这边的工作,下面要开始配置我们的主程序main.c程序 ,首先加入我们程序的头文件 。因为我们的USB和CAN总线使用的是同一块内存空间,所以需要关闭CAN总线。因为我们这里开启了CAN总线,所以要关闭,如果你没有开启则不需要关闭这一条指令。

ef5cbfe714e1494b83d517888e99f558.png

a908280f0af043c49d122e5dd6298148.png

 最后写上我们的实现程序b36e1011e5dd4cd986ee2987a9b409fa.png

 做到这里就大概完成了虚拟串口的收发功能。

总结:

        需要用到什么就在去使用什么

 

物联沃分享整理
物联沃-IOTWORD物联网 » STM32虚拟通信USB从设备实现

发表评论