打印
[STM32F1]

【完全开源】STM32F107VCT6金龙107USB例程集之USB DEVICE例程

[复制链接]
4822|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 szopenmcu 于 2015-6-17 11:40 编辑

1DEVICE_HID例程说明

1.1HID简介
HIDHuman Interface Device)人机接口设备类别是Windows最早支持的USB类别。由其名称可以了解HID设备是计算机直接与人交互的设备,例如键盘、鼠标和游戏杆等。不过HID设备不一定要有人机接口,只要符合HID类别规范,就都是HID设备。
在本例程当中我们把金龙107开发板上的五向按键,作为鼠标的上下左右的信号输入,控制PC的鼠标移动。
1.2、硬件说明
本实验涉及到USB的接口,以及五向按键。因为USB端口的两个引脚和USART1的两个引脚共用,所以要注意跳线帽JP10JP11要接在1-2上。此外,就是要注意boot的选择,即JP4JP7接在2-3上。电路图如下图所示:
如果在软件确定没有问题的时候,也要注意检查硬件的连接是否有问题,主要检查点就是Q2和按键的输出信号是否正确。

1.3、程序说明
从主程序看出,USB的设置就只调用了一个初始化函数,其形参是几个结构体,通过调用结构体里面的函数,实现对USB的初始化设置。
我们这里主要看一下都对哪些进行了配置,在usb_bsp.c文件里面主要对USB所使用到的唤醒按键和USB的中断做了一些配置。以及USB的时钟配置。
usbd_usr.c文件中涉及的是关于屏的一些初始化,以及显示屏要显示的一些实时信息。这里面也是通过一个结构体来实现函数的调用。
其中我们主要看void USBD_USR_Init(void)函数里面的一些对相关硬件的初始化,其中首先对主函数中涉及到用来指示程序运行的四个LED灯的端口的初始化,然后是对五向按键的的端口引脚的配置,后面又配置了SysTick,用来产生中断,不断扫描五向按键情况,并向主机发送坐标数据。最下面就是LCD的初始化的设置。以及初始化之后屏幕要显示的内容。再往下的函数,没有什么太多的作用,都是作为屏一些的显示,用来指示设备现在的运行情况。包括USB唤醒,以及是否插入主机等一些操作的实时显示。
下面看usbd_desc.c文件里面的内容,该文件中主要涉及就是USB的设置的关键部分,各种描述符的设置,详细的描述符的意义,这里不做介绍,大家可以去详细阅读USB的协议规范。用户可以根据自己的需要修改相应的描述符,以实现不同的功能。
接下来要看的就是中断文件stm32fxxx_it.c里面的函数,在这里面,我们主要关心的是void SysTick_Handler(void)函数,因为在这个函数里面实现了对五向按键的数据的采集,然后把相应的鼠标移动数据发送给上位机。
上面的函数就是获得五向按键的鼠标移动数据函数,返回的是数组的指针。只要鼠标有所移动,就会把相应的数据通过调用USBD_HID_SendReport()函数把相应的数据发送给上位机。因此我们知道USB初始化成功之后,我们可以通过调用这个函数来给上位机发送相应的数据。上面的得到位置信息的函数这里不再分析,大家可以自己查找这个函数是如何得到按键值并转换成坐标信息的。在usbd_hid_core.c文件里我们可以找到下面的函数,里面可以看到数据的发送函数是DCD_EP_Tx()
再次定位就会找到在usb_dcd.c里面的函数,这个文件已经是USB驱动库的函数,这个函数的第一个形参是在主函数中的一个结构体地址,第二个参数是使用的端口号,第三个形参是要发送的数据的地址,第四个形参是要发送数据的长度。通过调用此函数,则可以发送我们将要发送的数据。
同时,我们还可以在该文件中找到接收数据的函数,该函数的形参是接收的数据的端口号,数据存储地址,以及接收数据长度。
1.4、实验现象
使用USB线连接到PC,开发板上连接到USB-2接口,等待USB枚举完成,在设备管理中会出现 ,拨动开发板上的五向按键,PC的鼠标会出现相应的移动效果,实现鼠标的功能。同时屏上显示如下图所示。

【1】金龙107_DEVICE_HID.rar (626.71 KB)




沙发
mmuuss586| | 2015-4-27 19:28 | 只看该作者

HID相对简单点;

使用特权

评论回复
板凳
szopenmcu|  楼主 | 2015-4-28 14:42 | 只看该作者
2DEVICE_MSC例程说明

2.1MSC简介
USB大容量存储设备类(The USB mass storage device class)是一种计算机和移动设备之间的传输协议,它允许一个通用串行总线(USB)设备来访问主机的计算设备,使两者之间进行文件传输。
USB海量存储设备类包括通信协议定义和通用串行总线运行的计算。本标准规定了各种存储设备的接口。通过这个标准的计算机连接到的设备包括:移动硬盘、U、数码相机、各种数字音频播放器和便携式媒体播放器、手机。
本例程当中我们采用的是2GSD卡,因为按照官网的SD卡的初始化,不支持SDHC卡,也就是大于2G以上的卡,暂时支持2G2G以下的SD卡,因为STM32F107上没有SDIO外设模块,所以我们只能用SPI的方式进行对SD卡进行读写。
2.2、硬件说明
本实验涉及到USB的接口,以及SD卡。因为USB端口的两个引脚和USART1的两个引脚共用,所以要注意跳线帽JP10JP11要接在1-2上。此外,就是要注意boot的选择,即JP4JP7接在2-3上。电路图如下图所示:
2.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的协议规范。用户可以根据自己的需要修改相应的描述符,以实现不同的功能。
MSCHID多了一个文档,就是usbd_storage_msd.c文件,里面主要定义了一些关于USB读写数据的函数与SD卡的读写操作函数的接口。这些函数也是使用的一个结构体来实现调用。
其中主要看一下对SD卡的读写函数
接下来要看的就是中断文件stm32fxxx_it.c里面的函数,在这里面,我们主要关心的是void OTG_FS_IRQHandler(void)函数,在MSC实验当中,我们把开发板做成一个读卡器,他只能被动的接收主机发送过来的命令,所以107响应中断,进行相应的操作,进行数据的传输。
我们可以定位到这个中断函数定义在usb_dcd_int.c文件中,从下图中我们可以看到主要的两个数据的输入和输出函数,我们以其中一个为例找函数的调用关系。
该函数在usb_dcd_int.c文件中,找到对应的端口号,然后调用下面的函数,以及判断是否使用DMA
下面的几个函数在usbd_core.c中,大家可以根据右边的行号,找到对应的代码。
这下面的函数在usbd_msc_core.c中,通过右边的行号,找到到对应的代码。
下面的函数在usbd_msc_bot.c中。
下面的几个函数在usbd_msc_scsi.c中
下面的函数在usbd_storage_msd.c中。
我们可以看到,经过层层的调用,终于回到了对SD卡的底层操作,实现对SD卡上的数据进行读写操作。
2.4、实验现象
下载程序,找一个2G或者2G以下的SD卡,插入金龙107的开发板上,USB线连接在USB-2上,稍等片刻,则会识别出STM32的读卡器,设备管理器里面如下图所示。同时3.2LCD上也有对应的显示,如下图所示。

【2】金龙107_DEVICE_MSC.rar (631.7 KB)




使用特权

评论回复
地板
szopenmcu|  楼主 | 2015-4-29 10:55 | 只看该作者
五一真情回馈新老客户,赠送限量“旺宝”亚克力实验平板活动通知
   
      为答谢新老客户一直以来对旺宝电子的支持与关注,现特推出限量版“旺宝”亚克力实验平板赠送活动:

  1、凡是购买(STM32F103ZE红牛 红龙407 金龙107 NXP宝马1768)开发板,即可赠送价值28元制作精美的“旺宝”亚克力实验平板1个;
  2、凡在旺宝电子购买过开发板的老客户,在活动期间凭客户ID也可领取亚克力实验平板1个,只需支付运费即可,1ID限领1个;



使用特权

评论回复
5
liw_ei| | 2015-4-29 11:04 | 只看该作者
很好。很喜欢

使用特权

评论回复
6
szopenmcu|  楼主 | 2015-4-29 11:34 | 只看该作者
3DEVICE_VCP例程说明



3.1VCP简介
VCP也就是虚拟串口,本实验要实现的功能就是把STM32F107的制作成一个USB转串口,我们实现从USB端口接收到的数据,通过107USART2传输出去,同时,把从USART2接收到的数据,通过USB口传输到上位机。把USB虚拟成一个串口,但是该实验的正常运行需要在PC端安装驱动软件,在ST官网可以下载,我们的软件包里面也有,在VCP工程文件里面也有这个驱动软件。
3.2、硬件说明
本实验主要涉及了USB的使用,后期我们为了验证该实验,还会用到金龙107开发板上的USART2,因为USART2在金龙107上做成了硬件的USB转串口。需要注意的跳线帽就是要注意跳线帽JP10JP11要接在1-2上。此外,就是要注意boot的选择,即JP4JP7接在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实验现象
程序下载之后,检查跳线帽JP10JP11接在1-2上,JP3接在2-3上,JP4JP7接在2-3上。找两条USB线分别接在USB1USB2上,分别连接至PC。在设备管理器中可以看到,两个USB转串口,一个是我们开发板上的硬件的USB转串口,另外一个是107USB枚举成的虚拟串口。注意,107枚举的虚拟串口被PC正常识别,要安装对应的上位机驱动程序,驱动程序包在工程文件夹中,或者在官网下载也可以。
下面我们对该实验进行验证,如下图所示,我们打开两个串口调试助手,设置分别对应串口号,波特率等,设置一样,我们就可以实现互发数据。实现STM32F107的虚拟串口的功能。

使用特权

评论回复
7
szopenmcu|  楼主 | 2015-6-17 11:41 | 只看该作者

谢谢:handshake

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:专业生产销售STM32开发板,仿真器,http://openmcu.taobao.com/

71

主题

283

帖子

11

粉丝