社区导航

 

搜索
查看: 12431|回复: 8

[原创] STM32F107VCT6 107USB例程USB DEVICE例程

[复制链接]

411

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2015-4-27 14:48 | 显示全部楼层 |阅读模式
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上。电路图如下图所示:
图片12.png
图片11.png
如果在软件确定没有问题的时候,也要注意检查硬件的连接是否有问题,主要检查点就是Q2和按键的输出信号是否正确。

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

【1】金龙107_DEVICE_HID.rar (626.71 KB, 下载次数: 346)
http://openmcu.taobao.com]77[/url]

回复

使用道具 举报

112

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2015-4-27 15:55 | 显示全部楼层
好!mark备用。

回复

使用道具 举报

411

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2015-4-28 14:44 | 显示全部楼层
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上。电路图如下图所示:
图片22.png
图片21.png
2.3、程序说明
从主程序看出,USB的设置依旧是只调用了一个初始化函数,其形参是几个结构体,通过调用结构体里面的函数,实现对USB的初始化设置。
我们这里主要看一下都对哪些进行了配置,在usb_bsp.c文件里面主要对USB所使用到的USB的中断做了一些配置。以及USB的时钟配置。
图片20.png
usbd_usr.c文件中涉及的是关于屏的一些初始化,以及显示屏要显示的一些实时信息。这里面也是通过一个结构体来实现函数的调用。
图片19.png
其中我们主要看void USBD_USR_Init(void)函数里面的一些对相关硬件的初始化,其中首先对主函数中涉及到用来指示程序运行的四个LED灯的端口的初始化,然后是是LCD的初始化的设置。以及初始化之后屏幕要显示的内容。再往下的函数,没有什么太多的作用,都是作为屏一些的显示,用来指示设备现在的运行情况。包括USB唤醒,以及是否插入主机等一些操作的实时显示。
图片18.png
下面看usbd_desc.c文件里面的内容,该文件中主要涉及就是USB的设置的关键部分,各种描述符的设置,详细的描述符的意义,这里不做介绍,大家可以去详细阅读USB的协议规范。用户可以根据自己的需要修改相应的描述符,以实现不同的功能。
MSCHID多了一个文档,就是usbd_storage_msd.c文件,里面主要定义了一些关于USB读写数据的函数与SD卡的读写操作函数的接口。这些函数也是使用的一个结构体来实现调用。
图片17.png
其中主要看一下对SD卡的读写函数
图片16.png
接下来要看的就是中断文件stm32fxxx_it.c里面的函数,在这里面,我们主要关心的是void OTG_FS_IRQHandler(void)函数,在MSC实验当中,我们把开发板做成一个读卡器,他只能被动的接收主机发送过来的命令,所以107响应中断,进行相应的操作,进行数据的传输。
图片15.png
我们可以定位到这个中断函数定义在usb_dcd_int.c文件中,从下图中我们可以看到主要的两个数据的输入和输出函数,我们以其中一个为例找函数的调用关系。
图片14.png
该函数在usb_dcd_int.c文件中,找到对应的端口号,然后调用下面的函数,以及判断是否使用DMA
图片13.png
下面的几个函数在usbd_core.c中,大家可以根据右边的行号,找到对应的代码。
图片12.png
图片11.png
这下面的函数在usbd_msc_core.c中,通过右边的行号,找到到对应的代码。
图片10.png
图片9.png
下面的函数在usbd_msc_bot.c中。
图片8.png
下面的几个函数在usbd_msc_scsi.c中
图片7.png
图片6.png
图片5.png
下面的函数在usbd_storage_msd.c中。
图片4.png
图片3.png
我们可以看到,经过层层的调用,终于回到了对SD卡的底层操作,实现对SD卡上的数据进行读写操作。
2.4、实验现象
下载程序,找一个2G或者2G以下的SD卡,插入金龙107的开发板上,USB线连接在USB-2上,稍等片刻,则会识别出STM32的读卡器,设备管理器里面如下图所示。同时3.2LCD上也有对应的显示,如下图所示。
图片2.png
图片1.jpg

【2】金龙107_DEVICE_MSC.rar (631.7 KB, 下载次数: 80)
http://openmcu.taobao.com]77[/url]

回复

使用道具 举报

411

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2015-4-29 10:56 | 显示全部楼层
DSC_0172.jpg
http://openmcu.taobao.com]77[/url]

回复

使用道具 举报

411

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

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

http://openmcu.taobao.com]77[/url]

回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2016-4-6 16:45 | 显示全部楼层
  Vircom  这个怎么没有历程啊??  能发我邮箱:   176028342@qq.com

回复

使用道具 举报

14

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-6-6 10:07 | 显示全部楼层
不错哦 下载学习下。。

回复

使用道具 举报

27

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-6-13 11:26 | 显示全部楼层

STM32F407VE物联网板正式上线啦

回复

使用道具 举报

3

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-7-18 11:30 | 显示全部楼层
谢谢楼主无私分享

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-12-14 13:28 , Processed in 0.311590 second(s), 19 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表