基于STM32的USB简易鼠标设计 - 图文(3)

2019-02-16 01:37

河南城建学院本科毕业设计(论文) 第2章 USB协议概述

2.5.2数据包

用来传输数据。USB1.1协议只规定了两种数据包DATA0和DATA1包。在USB2.0中新增了用在高速分裂事务和高速高带宽同步传输中DATA2和MDATA包。不同类型的数据包是在当握手包出错时纠错用的。不同类型的数据包是为了方便在握手包出错时纠错。主机和设备都会维护自己的一个数据包类型切换机制,即当数据包成功发送或接收时,数据包类型切换。当检测到对方使用的数据包类型不对时,USB系统认为这发生了一个错误,并试图从错误中恢复。一般情况下,当握手包被损坏时,会发生数据包类型不匹配的情况。如果一端成功接收数据并发送确认信号,确认信号在传输的时候丢失或损坏,另一端就无法知道数据已经被正确接。此时它就会保持自己的数据包类型不变,如果对方下次发送的数据包类型和自己不同,说明对方已经成功接收数据。收数据包结构如图2.3所示。

同步域 8位PID 字节0

字节1 ··· 字节N 图2.3 数据包结构

16位校验 EOP 2.5.3握手包

用来查看一个数据是否被对方确认。握手包四种类型:ACK、NAK、STALL和NYET。ACK表示数据已经被接收,空间容纳也足够。NAK表示没有数据需要返回或已经正确接受但没有空间容纳。STALL表示这个设备无法执行这个请求或者端点已经被挂起了,表示一种错误的状态。NYET只在USB2.0的高速设备中使用,表示本次数据 成功接受但没有空间接受下一次数据。图2.4是握手包的结构。

同步域 包标志PID 图2.4 握手包结构

EOP 2.5.4特殊包

只在一些特殊场合使用,分PRE、ERR、SPLIT和PING四种。只有ERR是握手包,其他为令牌包。除了PRE,其他三个都是USB2.0协议新增的,不在此次设计的研究范围。PRE是通知集线器打开其低速端口的一种前导包。PRE仅仅使用在全速模式中,与握手包的结构一样。当传输模式由全速变低速时,主机会在全速模式下发送一个PRE令牌包,集线器收到此令牌包后,就会打开低速设备端口,但全速设备会忽略次令牌包。

6

河南城建学院本科毕业设计(论文) 第2章 USB协议概述

2.6 USB的传输类型

USB有四种传输类型:批量传输、同步传输、中断传输和控制传输。前面提到,USB数据的基本传输单位是包,但在具体传输数据时还必须把包组织成事务。 批量传输:使用批量事务传输数据。

中断传输:一种保证查询频率的传输。中断传输一般用在我们所说的延迟要尽可能小的设备中。现在使用的鼠标、键盘及其他HID都属于这样的设备。 同步传输:有些设备如音频、视频设备对数据的延迟很敏感,而且需要对大量数据不停的传输,但对数据的正确与否要求不高,此时同步传输是最好的选择。 控制传输:分为建立过程、数据过程(可选)和状态过程三个过程。建立过程用来输出数据,使用建立事务。建立过程使用只能使用DATA0的SETUP令牌包,而且握手包也只能只用ACK应答。数据过程可选,如果有可以包含一笔或多比数据事务。状态过程是一笔只使用DATA1包的批量事务。其传输方向也就是控制读和控制写过程与前面批量事务相反。

7

河南城建学院本科毕业设计(论文) 第3章 STM32及MDK简介

第3章 STM32及MDK简介

3.1 STM32简介

2006年ARM公司推出Cortex系列微处理器,根据不同性能的要求,分成了以公司三个字母分别命名的三个系列。本次设计使用的是M系列,因为这个系列成本较低,性能上也完全能够胜任。在ARM公司和意法半导体ST公司合作后,2007年ST公司发布了基于Cortex-M3内核的STM32系列处理器。

STM32系列处理器分为标准型和增强型两个系列,主要产品有标准型的STM32F101工作在36MHz,增强型的STM32F103工作在72MHz并拥有更大的RAM和更丰富的外设。因为STM32F103运算频率高,能实现更高端的运算,而且其自带的端口具有极好的连接能力,价格上也比较便宜,所以设计中采用这一款。图3.1是STM32F103处理器的配置。

72MHzCPU 3×16位定时器 多达64K的RAM 2×12位ADC温度传感器 内嵌8MHz和32kHz的RC振荡器 3×USART 多达512K的ROM 通用I/O引脚 2×SPI USB 4~16MHz主振荡器 实时时钟 2×看门狗 7通道DMA CAN PWM定时器 图 3.1 STM32F103处理器的配置

正是由于STM32F10x系列处理器配有众多的外设,所以它的用途非常广泛。在工业方面,可以应用在PLC、报警系统、变频器,打印机等上面;在低功耗方面,应用的产品有电表、血糖测量仪、UPS等;数码家电方面,相应的产品有电脑外设、游戏机、数码相机等。

3.2 MDK的使用

支持STM32微控制器的开发工具虽然很多,但结合中国的业内行情及收费情况,Keil公司的MDK是不二选择。MDK集成了Keil的μVision IDE和ARM编译工具RVCT的优势。特别是中国版MDK推出后,通过更加合理的价格和服务,逐步使得MDK成为中国嵌入式工程师的最爱芯片。 使用MDK的一般开发过程:

8

河南城建学院本科毕业设计(论文) 第3章 STM32及MDK简介

1、新建一个工程,从设备库中选择目标芯片,配置编译器环境; 2、用C/C++或汇编语言编写源文件; 3、编译目标应用程序; 4、修改源程序中的错误; 5、测试连接应用程序。

MDK的工具集默认的是RealView编译工具,如有特殊需要,也可以安装使用GNU GCC编译器。下面是此次设计中的具体操作:

在MDK主界面中选择Project→New Project菜单项,输入工程名字即可新建一个工程。创建新工程时软件会提示我们为工程选择一款相应的处理器,也可以通过Poject→Select Device打开此选项。对于大部分设备,软件会提示是否在工程中添加CPU的启动代码,为了让设备顺利完成初始化工作,我们点击“是”,以减少编写启动代码的工作量。

MDK还可以通过Project→Options for Target,在弹出的选项中对目标硬件和设备内组件的相关参数进行配置。工程创建完了,接下来就是源程序的编写了。点击File→New创建新的源文件,在编辑窗口写完源程序后以.C为后缀保存。一般情况下会先写一个main.c添加到工程中。一般设计人员会采用文件组来组织大的工程,将工程中同一模块或同一类型的源文件放入一个文件组中。点击Project→Conponents,Environment and Books→Project Components创建文件组来管理启动代码、源程序和配置文件。

接下来的工作就是编译连接工程了。单击Build Target图标可编译连接工程文件,出现错误时,会在Output Window的Build页中显示错误和警告信息。也可以使用调试器来调试源程序,我们直接把程序下载到开发板中进行目标调试。应用程序在调试通过后,需要生成HEX文件,用于下载到编程器或仿真器中。生成HEX文件后下载到目标设备中,至此嵌入式开发完成。

在此次设计中,我们按照流程走到最后一步,然后在MDK中点击Flash→Download下载代码到STM32F103开发板中。用USB线连接电脑,查看设备管理器,看一看设备是否识别,驱动是否自动安装成功。如果设备已经成功安装,试用开发板的四个按键操纵鼠标箭头。如果可以上下左右移动,就表示USB鼠标设计成功了。

9

河南城建学院本科毕业设计(论文) USB鼠标的实现

第4章 USB鼠标的实现

4.1 USB简易鼠标的程序编写

因为我们的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端口

10


基于STM32的USB简易鼠标设计 - 图文(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:无梁楼盖设计注意事项

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: