3、DEVICE_VCP例程说明
3.1、VCP简介VCP也就是虚拟串口,本实验要实现的功能就是把STM32F107的制作成一个USB转串口,我们实现从USB端口接收到的数据,通过107的USART2传输出去,同时,把从USART2接收到的数据,通过USB口传输到上位机。把USB虚拟成一个串口,但是该实验的正常运行需要在PC端安装驱动软件,在ST官网可以下载,我们的软件包里面也有,在VCP工程文件里面也有这个驱动软件。 3.2、硬件说明本实验主要涉及了USB的使用,后期我们为了验证该实验,还会用到金龙107开发板上的USART2,因为USART2在金龙107上做成了硬件的USB转串口。需要注意的跳线帽就是要注意跳线帽JP10和JP11要接在1-2上。此外,就是要注意boot的选择,即JP4和JP7接在2-3上,要用到USART2,所以JP3要接到2-3上。 3.3、程序说明从主程序看出,USB的设置依旧是只调用了一个初始化函数,其形参是几个结构体,通过调用结构体里面的函数,实现对USB的初始化设置。 我们这里主要看一下都对哪些进行了配置,在usb_bsp.c文件里面主要对USB所使用到的USB的中断做了一些配置。以及USB的时钟配置。 在usbd_usr.c文件中涉及的是关于屏的一些初始化,以及显示屏要显示的一些实时信息。这里面也是通过一个结构体来实现函数的调用。 其中我们主要看void USBD_USR_Init(void)函数里面的一些对相关硬件的初始化,其中首先对主函数中涉及到用来指示程序运行的四个LED灯的端口的初始化,然后是是LCD的初始化的设置。以及初始化之后屏幕要显示的内容。再往下的函数,没有什么太多的作用,都是作为屏一些的显示,用来指示设备现在的运行情况。包括USB唤醒,以及是否插入主机等一些操作的实时显示。 下面看usbd_desc.c文件里面的内容,该文件中主要涉及就是USB的设置的关键部分,各种描述符的设置,详细的描述符的意义,这里不做介绍,大家可以去详细阅读USB的协议规范。用户可以根据自己的需要修改相应的描述符,以实现不同的功能。 在usbd_cdc_vcp.c文件中,里面主要定义了一些关于USB读写数据的函数与USART函数的接口。包括USART的初始化,这些函数也是使用的一个结构体来实现调用。 其中主要看一下对USART的的接收和发送函数 接下来要看的就是中断文件stm32fxxx_it.c里面的函数,在这里面,我们主要关心的是void OTG_FS_IRQHandler(void)函数,在MSC实验当中,我们把开发板做成一个读卡器,他只能被动的接收主机发送过来的命令,所以107响应中断,进行相应的操作,进行数据的传输。 我们可以定位到这个中断函数定义在usb_dcd_int.c文件中,从下图中我们可以看到主要的两个数据的输入和输出函数,我们以其中一个为例找函数的调用关系。 该函数在usb_dcd_int.c文件中,找到对应的端口号,然后调用下面的函数,以及判断是否使用DMA。 下面的几个函数在usbd_core.c中,大家可以根据右边的行号,找到对应的代码。 这下面的函数在usbd_cdc_core.c中,通过右边的行号,找到到对应的代码。通过下面的这个结构体来实现函数的调用。 STM32F107通过下面的中断以及调用的函数,把从USART2接收到的数据发送给USB,上传到上位机显示。 STM32F107把从USB接口接收到的数据通过下面的代码发送给USART2,然后通过USART2输出打印。 在usbd_conf.h中的宏定义,这样我们就知道上面调用的函数就是我们上面所提到的usbd_cdc_vcp.c文件中的CDC_IF_Prop_TypeDef VCP_fops结构体中的函数把USB接收到的数据通过USART2打印输出。 3.4、实验现象程序下载之后,检查跳线帽JP10,JP11接在1-2上,JP3接在2-3上,JP4和JP7接在2-3上。找两条USB线分别接在USB1和USB2上,分别连接至PC。在设备管理器中可以看到,两个USB转串口,一个是我们开发板上的硬件的USB转串口,另外一个是107的USB枚举成的虚拟串口。注意,107枚举的虚拟串口被PC正常识别,要安装对应的上位机驱动程序,驱动程序包在工程文件夹中,或者在官网下载也可以。 下面我们对该实验进行验证,如下图所示,我们打开两个串口调试助手,设置分别对应串口号,波特率等,设置一样,我们就可以实现互发数据。实现STM32F107的虚拟串口的功能。
|