基于STM32的USB简易鼠标毕业设计Word文档格式.docx

上传人:b****3 文档编号:16492574 上传时间:2022-11-24 格式:DOCX 页数:50 大小:158.41KB
下载 相关 举报
基于STM32的USB简易鼠标毕业设计Word文档格式.docx_第1页
第1页 / 共50页
基于STM32的USB简易鼠标毕业设计Word文档格式.docx_第2页
第2页 / 共50页
基于STM32的USB简易鼠标毕业设计Word文档格式.docx_第3页
第3页 / 共50页
基于STM32的USB简易鼠标毕业设计Word文档格式.docx_第4页
第4页 / 共50页
基于STM32的USB简易鼠标毕业设计Word文档格式.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

基于STM32的USB简易鼠标毕业设计Word文档格式.docx

《基于STM32的USB简易鼠标毕业设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于STM32的USB简易鼠标毕业设计Word文档格式.docx(50页珍藏版)》请在冰豆网上搜索。

基于STM32的USB简易鼠标毕业设计Word文档格式.docx

 

第2章USB协议概述

2.1USB简介

USB是英文UniversalSerialBus(通用串行总线)的缩写,是一个外部总线的标准,用于规范电脑与外部设备的连接和通讯,是应用在PC领域的接口技术。

USB传输速度极快,使用很方便,它可以连接非常多的外设,比如:

手写板、游戏手柄、U盘等。

现在USB设备已进入千家万户,应用之所以如此广泛,优点主要有以下几点:

1、支持热插拔,也就是即插即用。

这让用户在使用外接设备时不需要进行关机再开机就可以完成硬件的安装,分分钟就可以使用,省时省力。

2、标准统一。

常见的是IDE接口的硬盘,串口的鼠标键盘,并口的打印机扫描仪,可以有了USB之后,这些应用外设统统可以用USB接口与PC连接,这时就有了USB硬盘、USB鼠标、USB网卡等一系列设备。

3、可以连接多个设备。

USB在PC上往往具有多个接口,可以同时连接多个外设,最高可连接127个设备。

USB协议出现过的版本有USB1.0、USB1.1、USB2.0以及现在最新的USB3.0。

USB的结构是主从模式,设备与设备之间不能互连,主机与主机之间也不能互连,于是就产生了USBOTG。

USBOTG就是让同一个设备在不同场合下实现主机与从机之间的切换。

在传输速度上,USB1.0和USB1.1版本只支持1.5Mb/s的低速模式和12Mb/s的全速模式。

USB2.0中不仅支持这两种模式,还增添了速度更快的480Mb/s的高速模式。

现在USB3.0已经非常完善,最新发布的计算机产品都带有USB3.0接口,其最大传输速度更是达到恐怖的5.0Gbps。

2.2USB的拓扑结构

前面提到,USB是一种主从结构的系统。

主机在一般情况下都会具有一个或多个USB主控制器(hostcontroller)和根集线器(roothub)。

主控制器下虽然只有一个根集线器,但一般情况下根集线器上都有多个USB口。

USB集线器是一种特殊的USB设备,是在USB接口不够用时扩展USB口用的。

集线器虽然可以扩展出更多的USB口,但不能扩展出更多的带宽,带宽还是共享的。

所以最好不要把多个USB设备接到同一个USB端口上。

我们可以在电脑的设备管理器中是查看USB主控制器和USB根集线器的。

对于window7系统,右击“计算机”,在弹出的菜单中选择“管理”,在“计算机管理”选项卡中单击“设备管理器”,就可以查看计算机设备的属性了,在这里可以查看驱动程序信息、设备的PID和VID等。

在“设备管理器”中找到“通用串行总线控制器”并把它展开,就可以看到USB主控制器和根集线器了。

USB的拓扑结构为金字塔型,塔顶为主控制器和根集线器,下面是通过USB集线器拓展的多个USB口。

在Windows中,由各种USB功能驱动程序负责产生和管理USB功能设备(FOD),即我们最终所看到的设备。

2.3USB的电气特性

标准的USB连接线使用四芯电缆:

5V电源线、差分数据线负(D‐)、差分数据线正(D+)及地(GND)。

在USBOTG中又增加了一种MINIUSB接头,使用五条线,比标准USB多一条身份识别线。

USB使用的是NRZI编码方式,即数据为0时电平翻转,数据为1不翻转。

因为电平长时间不发生变化会不利于时钟信号的提取,所以要在经过位填充处理后发送数据(当遇到连续六个1时强制插入一个数据0)。

USB协议规定,USB低速电缆长度不得超过3米,而全速电缆不得超过5米。

USB标准还规定了信号线的颜色,其中5V电源线为红色,D‐为白色,D+为绿色,GND为黑色。

插入检测机制就是检测到设备插入到主机的过程。

在USB集线器的每个端口的D+和D‐上,分别接了一个15kΩ的下拉电阻到地,无设备插入时输入端被下拉电阻拉到了低电平。

在USB设备端D+或D‐上接1.5kΩ的上拉电阻到3.3V电源。

上拉电阻接正还是负由设备速度决定,全速和高速设备接正,低速设备接负。

当设备插入USB插座时,接上拉电阻的数据线的电压由上拉电阻和下拉电阻分压决定,大概在3V左右。

当集线器检测到这个高电平信号时,它把信号发送到USB主控制器,就可以检测到设备插入了。

此时,还可以根据被拉高的数据线是D+还是D‐来判断设备的速度类型。

2.4USB描述符

前面说道USB是一个总线,USB总线驱动程序也不知道设备的行为,那么主机怎么获知设备的功能呢,这就要通过描述符来实现了。

USB1.1协议定义了五种标准描述符:

设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符。

还有一些特殊的描述符,如设计中要用的HID描述符等。

一个USB设备只有一个设备描述符。

在设备描述符中描述了该设备的各种配置,每种配置都有一个配置描述符,定义了设备有多少个接口,接口描述符又定义了接口有多少端点。

USB描述符之间的关系:

设备描述符包含配置描述符包含接口描述符包含端点描述符。

总的来说,由端点构成接口,接口构成配置,配置构成设备。

如果一个设备的各种描述符都成功的返回了,那么设计基本上算是成功了一大半。

2.5USB的包结构

在USB总线上,数据是以包为单位进行传输的。

一个包被分成不同的域,包的类型不同,所包含的域也不同。

所有的包都要以同步域开始,后接一个包标识符,最后以包结束符EOP结束。

同步域用以告诉USB串行接口数据要开始传输了,以便做好准备。

同步域还可以同步主机端和设备端的数据时钟。

同步域都是以一串0开始的,所以每个数据都会发生电平变化(0在USB总线上被编码为电平翻转),这样串行接口引擎很容易恢复采样时钟信号。

当串行接口引擎检测到电平没有翻转时,就会认为包标识符开始了。

包标识符PID用以表示一个包的类型,共8位,其中USB协议使用的只有PID0~PID3这四位,另外四位是这四位的取反,用来校验PID。

USB协议规定了四类包:

令牌包、数据包、握手包和特殊包。

每种包又分成几种具体的包。

协议中对最低两位的规定如图2.1。

包的类型

令牌包

数据包

握手包

特殊包

PID1~0

01

11

10

00

图2.1四种包的最低两位规定

2.5.1令牌包

用来启动一次USB传输。

因为USB的拓扑结构是主从结构,所有数据的传输都是由主机发起的,设备只负责接受,所以需要主机发送一个令牌来通知需要的设备进行相应的操作。

令牌包共四种:

输出、输入、建立和帧起始。

具体的功能还要参照USB协议。

每个令牌包最后都有一个CRC5的校验,用以校验PID之后的数据。

四种令牌包中,只有SOF令牌包之后不跟随数据传输,其他包都有数据传输。

输出、输入、建立令牌包的结构如图2.2。

它们的结构相同,而且数据在传输时,每个域的最低位LSB在前。

同步域

8位包标识符

7位地址

4位端点号

5位CRC5校验

EOP

图2.2IN、OUT、SETUP令牌包结构

2.5.2数据包

用来传输数据。

USB1.1协议只规定了两种数据包DATA0和DATA1包。

在USB2.0中新增了用在高速分裂事务和高速高带宽同步传输中DATA2和MDATA包。

不同类型的数据包是在当握手包出错时纠错用的。

不同类型的数据包是为了方便在握手包出错时纠错。

主机和设备都会维护自己的一个数据包类型切换机制,即当数据包成功发送或接收时,数据包类型切换。

当检测到对方使用的数据包类型不对时,USB系统认为这发生了一个错误,并试图从错误中恢复。

一般情况下,当握手包被损坏时,会发生数据包类型不匹配的情况。

如果一端成功接收数据并发送确认信号,确认信号在传输的时候丢失或损坏,另一端就无法知道数据已经被正确接。

此时它就会保持自己的数据包类型不变,如果对方下次发送的数据包类型和自己不同,说明对方已经成功接收数据。

收数据包结构如图2.3所示。

8位PID

字节0

字节1

·

字节N

16位校验

图2.3数据包结构

2.5.3握手包

用来查看一个数据是否被对方确认。

握手包四种类型:

ACK、NAK、STALL和NYET。

ACK表示数据已经被接收,空间容纳也足够。

NAK表示没有数据需要返回或已经正确接受但没有空间容纳。

STALL表示这个设备无法执行这个请求或者端点已经被挂起了,表示一种错误的状态。

NYET只在USB2.0的高速设备中使用,表示本次数据成功接受但没有空间接受下一次数据。

图2.4是握手包的结构。

包标志PID

图2.4握手包结构

2.5.4特殊包

只在一些特殊场合使用,分PRE、ERR、SPLIT和PING四种。

只有ERR是握手包,其他为令牌包。

除了PRE,其他三个都是USB2.0协议新增的,不在此次设计的研究范围。

PRE是通知集线器打开其低速端口的一种前导包。

PRE仅仅使用在全速模式中,与握手包的结构一样。

当传输模式由全速变低速时,主机会在全速模式下发送一个PRE令牌包,集线器收到此令牌包后,就会打开低速设备端口,但全速设备会忽略次令牌包。

2.6USB的传输类型

USB有四种传输类型:

批量传输、同步传输、中断传输和控制传输。

前面提到,USB数据的基本传输单位是包,但在具体传输数据时还必须把包组织成事务。

批量传输:

使用批量事务传输数据。

中断传输:

一种保证查询频率的传输。

中断传输一般用在我们所说的延迟要尽可能小的设备中。

现在使用的鼠标、键盘及其他HID都属于这样的设备。

同步传输:

有些设备如音频、视频设备对数据的延迟很敏感,而且需要对大量数据不停的传输,但对数据的正确与否要求不高,此时同步传输是最好的选择。

控制传输:

分为建立过程、数据过程(可选)和状态过程三个过程。

建立过程用来输出数据,使用建立事务。

建立过程使用只能使用DATA0的SETUP令牌包,而且握手包也只能只用ACK应答。

数据过程可选,如果有可以包含一笔或多比数据事务。

状态过程是一笔只使用DATA1包的批量事务。

其传输方向也就是控制读和控制写过程与前面批量事务相反。

第3章STM32及MDK简介

3.1STM32简介

2006年ARM公司推出Cortex系列微处理器,根据不同性能的要求,分成了以公司三个字母分别命名的三个系列。

本次设计使用的是M系列,因为这个系列成本较低,性能上也完全能够胜任。

在ARM公司和意法半导体ST公司合作后,2007年ST公司发布了基于Cortex-M3内核的STM32系列处理器。

STM32系列处理器分为标准型和增强型两个系列,主要产品有标准型的STM32F101工作在36MHz,增强型的STM32F103工作在72MHz并拥有更大的RAM和更丰富的外设。

因为STM32F103运算频率高,能实现更高端的运算,而且其自带的端口具有极好的连接能力,价格上也比较便宜,所以设计中采用这一款。

图3.1是STM32F103处理器的配置。

72MHzCPU

多达64K的RAM

12位ADC温度传感器

USART

SPI

多达512K的ROM

USB

通用I/O引脚

16位定时器

4~16MHz主振荡器

内嵌8MHz和32kHz的RC振荡器

实时时钟

看门狗

7通道DMA

CAN

PWM定时器

图3.1STM32F103处理器的配置

正是由于STM32F10x系列处理器配有众多的外设,所以它的用途非常广泛。

在工业方面,可以应用在PLC、报警系统、变频器,打印机等上面;

在低功耗方面,应用的产品有电表、血糖测量仪、UPS等;

数码家电方面,相应的产品有电脑外设、游戏机、数码相机等。

3.2MDK的使用

支持STM32微控制器的开发工具虽然很多,但结合中国的业内行情及收费情况,Keil公司的MDK是不二选择。

MDK集成了Keil的μVisionIDE和ARM编译工具RVCT的优势。

特别是中国版MDK推出后,通过更加合理的价格和服务,逐步使得MDK成为中国嵌入式工程师的最爱芯片。

使用MDK的一般开发过程:

1、新建一个工程,从设备库中选择目标芯片,配置编译器环境;

2、用C/C++或汇编语言编写源文件;

3、编译目标应用程序;

4、修改源程序中的错误;

5、测试连接应用程序。

MDK的工具集默认的是RealView编译工具,如有特殊需要,也可以安装使用GNUGCC编译器。

下面是此次设计中的具体操作:

在MDK主界面中选择Project→NewProject菜单项,输入工程名字即可新建一个工程。

创建新工程时软件会提示我们为工程选择一款相应的处理器,也可以通过Poject→SelectDevice打开此选项。

对于大部分设备,软件会提示是否在工程中添加CPU的启动代码,为了让设备顺利完成初始化工作,我们点击“是”,以减少编写启动代码的工作量。

MDK还可以通过Project→OptionsforTarget,在弹出的选项中对目标硬件和设备内组件的相关参数进行配置。

工程创建完了,接下来就是源程序的编写了。

点击File→New创建新的源文件,在编辑窗口写完源程序后以.C为后缀保存。

一般情况下会先写一个main.c添加到工程中。

一般设计人员会采用文件组来组织大的工程,将工程中同一模块或同一类型的源文件放入一个文件组中。

点击Project→Conponents,EnvironmentandBooks→ProjectComponents创建文件组来管理启动代码、源程序和配置文件。

接下来的工作就是编译连接工程了。

单击BuildTarget图标可编译连接工程文件,出现错误时,会在OutputWindow的Build页中显示错误和警告信息。

也可以使用调试器来调试源程序,我们直接把程序下载到开发板中进行目标调试。

应用程序在调试通过后,需要生成HEX文件,用于下载到编程器或仿真器中。

生成HEX文件后下载到目标设备中,至此嵌入式开发完成。

在此次设计中,我们按照流程走到最后一步,然后在MDK中点击Flash→Download下载代码到STM32F103开发板中。

用USB线连接电脑,查看设备管理器,看一看设备是否识别,驱动是否自动安装成功。

如果设备已经成功安装,试用开发板的四个按键操纵鼠标箭头。

如果可以上下左右移动,就表示USB鼠标设计成功了。

第4章USB鼠标的实现

4.1USB简易鼠标的程序编写

因为我们的STM32F103开发板上只有四个按键,所以只能实现鼠标光标的上下左右移动,不能实现鼠标左右键的功能。

由于USB协议及接口相当复杂,MDK自带的STM32F10x的固件库中单独提供了USB的相关函数库,在编写程序代码时需要将两个库函数包含到编译路径中。

USB鼠标的程序比较复杂,除了库文件和USB函数库文件之外,还包含了8个源文件,其中STM32F10x.s是启动代码,这里不再多说。

下面是设计中非常重要的7个源文件(具体的程序代码见附录):

1、main.c

该文件中主要包含两个函数,其中main函数初始化系统以及USB接口,之后不断查询四个按键是否按下。

如果确定有按键按下则向USB缓冲器发出相关数据。

Delay函数用于延迟。

2、usb_desc.c

该文件中没有任何函数,只是包含一些定义USB设备的描述符常数,由于USB鼠标是一个标准的USB设备,所以相关的参数也比较容易得到。

如果是开发非标准的USB设备的话,则必须开发相应的在电脑上运行的驱动软件。

3、stm32f10x_it.c

该文件是用来控制USB中断服务用的。

USB中断的情况分很多种,在此次设计中我们只是调用usb_istr.c文件中的中断函数。

4、usb_istr.c

该文件中只有一个函数,就是上面提到的用于控制USB中断的USB_Istr函数,此函数的主要作用是对各类引起USB中断的事件作轮询处理。

5、usb_prop.c

该文件用于控制USB协议在设备中的具体实现,例如初始化、SETUP包、IN包、OUT包等等。

6、usb_pwr.c

该文件中包含处理上电、掉电、挂起和唤醒事件的函数。

7、hw_config.c

该文件包含系统配置的函数和处理四个按键动作的函数。

其中Set_USBClock函数用于配置USB端口时钟;

Set_System函数用于配置时钟、通用端口;

USB_Cable_Config函数配置USB电缆状态;

USB_Interrupts_Config函数用于配置USB中断;

JoyState函数用于获取按键状态;

Joystick_Send用于向USB端口发送按键的事件。

HID设备实现的重点在于枚举是否成功,所以程序设计的重点在于标准描述符部分的编写,因为枚举过程就是检查USB设备发送的USB标准请求能否正常返回的过程。

USB协议规定了标准的设备请求为八个字节。

这八字节在默认状态下由控制端点零发出,用在控制传输的建立过程中。

任何USB设备都要能够接收大于八字节的数据。

USB协议规定了十一个标准请求,表4.1为各种请求的名字及代码。

表4.1标准请求及代码

标准请求

GET_STATUS

GET_CONFIGURATION

8

CLEAR_FEATURE

1

SET_CONFIGURATION

9

SET_FEATURE

3

GET_INTERFACE

SET_ADDRESS

5

SET_INTERFACE

GET_DISCRIPTOR

6

SYNCH_FRAME

12

SET_DISCRIPTOR

7

其中获取描述符请求GET_DESCRIPTOR在枚举过程中用的最多。

主机通过发送获取描述符的请求获取设备的各种描述符,这样就可以得知设备的端点情况、设备类型等各种信息。

表4.2是获取描述符请求的结构。

表4.2获取描述符请求的结构

bmRequestType

bRequest

wValue

wIndex

wLength

数据过程

0x80

0x06

描述符类型和索引

0或语言ID

描述符长度

描述符

在上表中的wValue这一项中,低字节表示索引号,其具体的作用是在相同种类的描述符中确定一个描述符。

它的高字节,也就是第二字节,用来描述类型编号。

各种描述符的类型编号如表4.3所示。

设备在收到描述符请求后,就会按照描述符类型的编号,返回对应的描述符。

wIndex用在需要获取字符串的过程中,可以用它来标明字符串的语言ID号,其他时候为零。

表4.3描述符类型及编号

类型

设备描述符

配置描述符

字符串描述符

接口描述符

端点描述符

编号

2

4

对于全速模式和低速模式,只有获取设备、配置和字符串描述符这三种。

在返回配置描述符的时候,接口描述符、端点描述符和类特殊描述符(如HID描述符和报告描述符)要一起返回,这两类描述符不能单独请求返回。

图4.1是HID设备描述符的结构。

图4.1HID设备描述符结构

4.2USB鼠标的运行

①程序采用JTAG下载,将开发板通过下载器连接到电脑,并用一根USB数据线把开发板连接到电脑的USB上。

②打开设计目录下的project.uvproj文件,编译连接工程。

③检查无误后,点击“TargetOption”按钮可查看芯片类型和下载方式,点击“Debug”设置完成后,在主界面点击“Download”下载。

④重启开发板。

电脑会提示“找到新的USB设备”,因为是标准USB设备,

所电脑会自动安装驱动。

⑤分别控制开发板上的四个键,观察电脑屏幕上鼠标光标的变化,如果光标随按键按下移动,则表明程序运行成功,一个USB简易鼠标就做好了。

4.3硬件实现

图4.2所示为设备管理器上显示的已成功安装的USB鼠标。

图4.2设备管理器

图4.3为STM32F103开发板。

图4.3STM32F103开发板

设计总结

随着计算机技术的发展,个人电脑的价格越来越低,现在基本上每个家庭都有一台电脑,而鼠标作为与电脑配套的设备之一,正处于开发研制的高潮。

通过学习设计USB鼠标,不仅与时代接轨,毕业之后可以从事相关工作,而且也为嵌入式系统的开发奠定了基础。

论文研究了基于STM32

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1