USB设备是USB电缆末端的一个硬件,它执行用户功能。可以将USB设备分为USB总线接口、USB逻辑设备和功能设备三部分。主机到设备的连接需要经过多个层和多个实体之间的交互作用,USB总线接口层提供了在USB数据线上数据的底层传输。
USB从机模式下,外部 USB 硬件充当USB主机。(作为)附件的例子,包括机器人控制器、扩展插座(docking stations)、诊断和音乐设备、电子报亭(kiosks)、读卡器等其他设备。(外围)设备的例子,包括数码像机,键盘,鼠标和游戏控制器。而32单片机可以实现当USB从设备,可以让电脑识别到单片机为从设备。
下面是USB从机时钟的配置,根据手册我们需要将时钟源设置到外界的时钟上,且使USB 时钟为40MHZ。
注意,STM32D103内部的USB接口只能当从设备。
这里CubeMX可以生成不同设备类型的驱动程序:
1、做U盘、移动硬盘可选择大容量存储类
2、做声卡可选择音频设备类
3、做鼠标键盘可选择人机界面类
4、做通信则选择通信设备类
这里可设置被电脑识别到的设备类型和描述符,这里的设置只影响电脑上的设备属性。
由于USB虚拟串口的驱动程序比较复杂,需要占用更多的内存,把那两项的值改成0x1000,预留更大的空间给USB驱动程序。这样才够USB驱动程序使用。如果空间少了,则会出现无法编译等情况,然后就可以生成项目文件了。
需要弄清楚自己需要在那个设备文件中进行修改。在上图中USB_DEVICE下的APP是应用层的驱动文件,这个部分需要我们针对应用的需求进行修改。因为我们做的是虚拟串口,所以我们只需要修改红色框框内的程序。下面进行修改如图所示
usbd_cdc_if.c
上面的函数就是类似于串口的回调函数,下面则是发送函数 。
下面则是类似于printf的函数,可以让我们在虚拟串口中打印
接下来是usbd_cdc_if.h
这里就做好了USB这边的工作,下面要开始配置我们的主程序main.c程序 ,首先加入我们程序的头文件 。因为我们的USB和CAN总线使用的是同一块内存空间,所以需要关闭CAN总线。因为我们这里开启了CAN总线,所以要关闭,如果你没有开启则不需要关闭这一条指令。
最后写上我们的实现程序
做到这里就大概完成了虚拟串口的收发功能。
总结:
需要用到什么就在去使用什么