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

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

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

android usb NCM虚拟以太网 usb虚拟设备_arm

android usb NCM虚拟以太网 usb虚拟设备_虚拟串口_02

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

android usb NCM虚拟以太网 usb虚拟设备_驱动程序_03

android usb NCM虚拟以太网 usb虚拟设备_虚拟串口_04

android usb NCM虚拟以太网 usb虚拟设备_arm_05

 

android usb NCM虚拟以太网 usb虚拟设备_stm32_06

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

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

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

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

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

android usb NCM虚拟以太网 usb虚拟设备_单片机_07

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

android usb NCM虚拟以太网 usb虚拟设备_虚拟串口_08

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

android usb NCM虚拟以太网 usb虚拟设备_驱动程序_09

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

usbd_cdc_if.c

android usb NCM虚拟以太网 usb虚拟设备_stm32_10

android usb NCM虚拟以太网 usb虚拟设备_虚拟串口_11

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

android usb NCM虚拟以太网 usb虚拟设备_虚拟串口_12

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

android usb NCM虚拟以太网 usb虚拟设备_单片机_13

接下来是usbd_cdc_if.h

android usb NCM虚拟以太网 usb虚拟设备_驱动程序_14

 

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

android usb NCM虚拟以太网 usb虚拟设备_虚拟串口_15

android usb NCM虚拟以太网 usb虚拟设备_虚拟串口_16

 最后写上我们的实现程序

android usb NCM虚拟以太网 usb虚拟设备_arm_17

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

总结:

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