STM32-USB鼠标解析

合集下载

基于STM32的USB简易鼠标

基于STM32的USB简易鼠标

毕业设计 [论文]题目:基于STM32的USB简易鼠标设计学院:电气与信息工程学院专业:电子信息工程姓名:学号:指导老师:完成时间:2015年06月01日摘要随着设备的越来越智能化,嵌入式计算机大量应用到各种电子设备中,基于嵌入式系统的USB鼠标及键盘的应用也变得越来越广泛。

在本次设计中,研究的是一款基于STM32的USB鼠标,即插即用,免驱动自动识别,很好的解决了鼠标设备智能化和低延迟的设计要求。

由于是基于HID的USB设备,所以编程非常方便,贴近工程实践,应用前景广阔。

嵌入式系统HID,即人机接口设备,是Human Interface Device的缩写。

HID 是计算机周边设备中非常常见的设备类型,是可以直接与进行人交互的USB设备,例如鼠标、摄像头、U盘等。

在种类繁多USB设备中,HID类设备的成本一般情况下是比较低的。

实际上,只要是符合HID标准的设备都是HID设备,不一定非要具有人机交互功能。

最早支持HID设备的计算机操作系统是Windows98系统。

HID 设备的驱动程序内置在这些系统中,不需要单独开发与安装驱动,应用程序可以直接使用这些驱动程序来与设备通信。

近年来,受计算机性能提升和游戏软件等的影响,人们对鼠标的要求越来越高,特别是一些即时作战游戏,人们希望能达到“零”延迟,这就对原来的鼠标技术提出了挑战。

老式的圆孔鼠标早已不再适用,特别是笔记本电脑根本不再设计老式插孔。

随着USB2.0以及USB3.0的不断完善,再加上高速而价廉的单片机,一款基于STM32的USB简易鼠标正是本课题的研究内容。

本文主要研究基于STM32的USB简易鼠标系统的功能、设计思想和实现,以及基于STM32的USB简易鼠标的组成及工作原理,描述了研究该课题的意义和应用价值。

本设计的重点在于USB 协议的HID部分,精通此协议并植入单片机才能实现计算机与鼠标的沟通。

关键词: USB 技术; HID 协议; STM32单片机;鼠标AbstractAs more and more intelligent devices, embedded computers applied to the large variety of electronic devices, embedded systems USB mouse and keyboard applications are becoming more and more widespread.In this design, the study is a based on the STM32 USB mouse, plug and play, driver-free automatic identification, a good solution to the mouse device intelligence and low-latency design requirements.Because it is based on HID USB device, so the programming is very convenient, close to the engineering practice, the application prospects.Embedded systems HID, namely human interface devices, is an abbreviation for Human Interface Device. HID is a computer peripheral device in a very common device types, people can interact directly with the conduct of USB devices, such as a mouse,camera, U disk and so on.In a wide range of USB devices, under HID class devices generally cost is relatively low.In fact, as long as a HID-compliant devices are HID device does not necessarily have to have interactive features.The earliest HID devices supported computer operating system is Windows98 system.HID device drivers built into these systems, the need for separate development and install the driver, an application can use these drivers to communicate with the device.In recent years, the impact of computer and game software performance by, people have become increasingly demanding of the mouse, especially some instant combat game, people want to be able to achieve "zero" delay, which the original mouse technology presents a challenge .Old-fashioned mouse the hole is no longer applicable, especially notebook computers designed simply no longer the old jack.With the continuous improvement USB2.0 and USB3.0, coupled with high speed and low cost microcontroller, a research based on the STM32 USB simple mouse precisely this topic. This article is mainly based on the STM32 USB simple mouse systems design and implementation, as well as easy on the STM32 USB mouse and work principle, it describes the subject of research and practical value.The design focuses on some USB HID protocol, proficient in this agreement and in order to achieve single-chip implanted communication computer mouse.Keywords: USB technology; HID protocol; STM32 microcontroller; mouse目录摘要 (I)Abstract ............................................................ I I 目录 ............................................................... I II 第1章引言 . (1)1.1 课题背景 (1)1.2 基于STM32的USB鼠标的设计研究方法及目标 (1)1.3 USB鼠标国内外研究现状 (2)第2章 USB协议概述 (3)2.1 USB简介 (3)2.2 USB的拓扑结构 (3)2.3 USB的电气特性 (4)2.4 USB描述符 (4)2.5 USB的包结构 (5)2.5.1令牌包 (5)2.5.2数据包 (6)2.5.3握手包 (6)2.5.4特殊包 (6)2.6 USB的传输类型 (7)第3章 STM32及MDK简介 (8)3.1 STM32简介 (8)3.2 MDK的使用 (8)第4章 USB鼠标的实现 (10)4.1 USB简易鼠标的程序编写 (10)4.2 USB鼠标的运行 (12)4.3 硬件实现 (12)设计总结 (14)附录 (15)附录A main.c (15)附录B usb_desc.c (19)附录C hw_config.c (26)附录D usb_prop.c (38)参考文献 (51)致谢 (52)第1章引言1.1 课题背景USB 接口是串行总线通信端口,支持即插即用,在计算机领域应用非常广泛。

STM32-USB使用方法(DOC)

STM32-USB使用方法(DOC)

STM32-USB使用方法开发板买的是奋斗mini开发板,芯片是:STM32F103VET6. 如果需要源程序keil4-arm工程,上位机vb。

加qq339396264要程序。

USB开发涉及主机和设备,为了避免开发驱动程序,使用Windows自带的驱动程序。

所以设备枚举成HID类设备。

USB 鼠标就是标准的USB-HID设备。

不过操作系统阻止了应用程序直接访问USB鼠标返回的报告。

所以本例使用自定义HID 设备。

一来免去了开发驱动程序,二来自定义的HID设备应用程序和设备可以自由收发数据(仅指数据内容)。

本文主要介绍STM32的USB模块的简单使用,不会介绍USB协议。

主要是介绍一下STM32F103的USB模块使用。

USB模块从初始化首先是配置和使能时钟下面是时钟的初始化:void Set_USBClock(void){//RCC_USBCLKSource_PLLCLK_1Div5表示【USB时钟= PLL时钟除以1.5】【72/1.5=48MHz】RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);//【使能配置好了的USB时钟】}首先系统时钟要设置为72MHz,然后配置USB时钟为48MHz并使能。

然后是配置中断void USB_Interrupts_Config(void){#define USB_LP_CAN1_RX0_IRQn 20NVIC_InitTypeDef NVIC_InitStructure;//【使能USB中断】NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; //【USB低优先级中断】NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}然后初始化模块的一些寄存器USART_send_str("USB断开\r\n");USB_DISCONNECT//这是断开1.5k上拉电阻delay(0x7AFFFF);//延时一会USB_CONNECT//使能1.5K上拉电阻USART_send_str("USB连接\r\n");DADDR = 0x0080;//USB模块使能位。

STM32 实验26 触控USB鼠标

STM32 实验26 触控USB鼠标

}
delay_us(50);
} Joystick_Send(0,0,0,0);//发送左键松开
}else delay_ms(1); if(bDeviceState==CONFIGURED)LED1=0;//当 USB 配置成功了,LED1 亮,否则, 灭
else LED1=1; if(key==1)//KEY0 按下,则执行校准程序
USB_Init(); POINT_COLOR=RED;//设置字体为蓝色
LCD_ShowString(60,50,"Mini STM32");
LCD_ShowString(60,70,"USB TEST");
LCD_ShowString(60,90,"ATOM@ALIENTEK");
LCD_ShowString(60,110,"2010/6/19");
441
USB_Interrupts_Config()、Set_USBClock()和 USB_Init(),第一个函数用于开启 USB 唤醒中断和 USB 低优先级数据处理中断,Set_USBClock 函数用于 配置 USB 时钟,也就是从 72M 的主频 得到 48M 的 USB 时钟(1.5 分频)。最后 USB_Init()函数用于初始化 USB,最主要的就是调用 了 Joystick_init 函数,开启了 USB 部分的电源等。这里需要特别说明的是,USB 配置并没有对 PA11 和 PA12 这两个 IO 口进行设置,是因为,一旦开启了 USB 电源(USB_CNTR 的 PDWN 位清零)PA11 和 PA12 将不再作为其他功能使用,仅供 USB 使用,所以在开启了 USB 电源之 后不论你怎么配置这两个 IO 口,都是无效的。要在此获取这两个 IO 口的配置权,则需要关闭 USB 电源,也就是置位 USB_CNTR 的 PDWN 位。

STM32_USB_详解[1]

STM32_USB_详解[1]
14
USB 传输类型
传输类型是一种用于描述端点或通道的特性。当端点和与 其相连的通道的传输类型被确定,那么在这个通道上进行 的传输的一系列特性也就被唯一确定了,在整个通道的有 效期限内这些特性都不能再被修改。 USB规范定义了四种传输类型:
控制传输:适用于突发性、非周期性的传输,常用于命令和 状态的传输。(非周期性传输) 同步传输:适用于周期性、持续性的传输,常用于与时间相 关的事件、信息的传送,并在传输的数据中保存时间信息。 (周期性传输) 中断传输:适用于传输频率低、数据量小的传输。(周期性传 输) 大容量传输:适用于非周期性的、数据是大量并突发的传输, 常用于那些需要占据大量带宽,但又容许时延的数据传输。 (非周期性传输)
STMicroelectronics Sept. 14~25, 2009
19
STM32互联型产品OTG_FS控制器
USB协议简介
USB协议特性 USB系统和架构 USB设备类和供电 USB传输类型 USB OTG协议
STM32互联型产品OTG_FS控制器
OTG_FS控制器特性 OTG_FS控制器不同模式的连接图
USB主机 控制器
USB 总线接口
逻辑上的通信通道
STMicroelectronics
Sept. 14~25, 2009
7
USB 逻辑组成
USB主机
缓存区
应用程序 缓存区
缓存区
通道
USB设备
接口
端点
接口: 用于描述USB设备的某一特定的功能,是一组端点的 集合。
STMicroelectronics Sept. 14~25, 2009
STMicroelectronics Sept. 14~25, 2009

基于STM32的USB简易鼠标毕业设计

基于STM32的USB简易鼠标毕业设计

基于STM32的USB简易鼠标毕业设计目录摘要 .............................................. 错误!未定义书签。

Abstract ........................................... 错误!未定义书签。

目录 ............................................................... I II 第1章引言 . (1)1.1 课题背景 (1)1.2 基于STM32的USB鼠标的设计研究方法及目标 (1)1.3 USB鼠标国内外研究现状 (2)第2章 USB协议概述 (3)2.1 USB简介 (3)2.2 USB的拓扑结构 (3)2.3 USB的电气特性 (4)2.4 USB描述符 (4)2.5 USB的包结构 (5)2.5.1令牌包 (5)2.5.2数据包 (6)2.5.3握手包 (6)2.5.4特殊包 (6)2.6 USB的传输类型 (7)第3章 STM32及MDK简介 (8)3.1 STM32简介 (8)3.2 MDK的使用 (8)第4章 USB鼠标的实现 (10)4.1 USB简易鼠标的程序编写 (10)4.2 USB鼠标的运行 (12)4.3 硬件实现 (12)设计总结 (14)附录 (15)附录A main.c (15)附录B usb_desc.c (19)附录C hw_config.c (26)附录D usb_prop.c (38)参考文献 (51)致谢 (52)第1章引言1.1 课题背景USB 接口是串行总线通信端口,支持即插即用,在计算机领域应用非常广泛。

HID设备是一种可以进行人机交互操作的设备,在USB设备中占有重要地位,可以辅助计算机进行各种操作,如常用的电脑摄像头、手写板等设备。

一般USB设备的研发非常困难,不但要严格遵守USB协议,还要编写驱动程序。

STM32 USB的JMouse源代码分析 1-3

STM32 USB的JMouse源代码分析 1-3

USB的“JoyStickMouse”源代码分析01一、c源文件和头文件1、c文件的组织我们一般用C语言编程的时候都比较讲究模块化、层次化,以及数据和操作分开的原则。

模块化最明显的表现是我们把常用的、某一个具体功能实现封装在一个函数中,我们所要操作的数据以参数的方式提供给函数,函数通过代码处理过后,再把结果回馈个调用者。

层次化表现在比较复杂的功能实现都要分几层来实现,有时候也是为了提高可移植性。

比如文件系统的代码实现大致要分这么几层:磁盘操作层实现磁盘扇区的读取、写入、控制;文件分配管理函数和目录项操作函数;文件的打开、读取、写入函数,目录的建立、删除函数等;用户应用操作函数,如文件的查找、具体数据的写入等等。

一个具体USB功能的实现也能分成几层,比如我们的Stm32 JoyStickMouse,我们也可以这样分层:硬件操作层:寄存器操作和内存操作。

协议通用层:设备枚举的控制传输实现,对所有类协议都一样。

具体协议层:比如HID协议的描述符,类特定请求实现。

这样一划分,一个具体的功能实现就需要比较多的C源文件。

2、c文件和h文件一个c文件一般是几个函数组成,这几个函数可能一部分存在依存关系,而有一些函数要对外引出,而同时它还可能要引用外部函数。

解决这个相互关联的是“包含头文件”。

一个c文件很多时候都存在一个与它同名的“h文件”,对c文件的意义主要有以下几个:(1)提供常量定义,#define。

(2)提供一些类型定义,为了实现c文件数据类型的编译器无关性,一般都要将该编译器提供的数据类型重新定义,用tpyedef来实现。

(3)结构体、联合体、枚举类型的定义。

(4)带参数的宏定义。

(5)外部函数声明。

(6)外部变量声明。

(7)本身实现函数的声明:起始这个声明对c文件本身意义不大,主要是其它c 文件要使用本c文件实现的函数时,包含同名“h文件”,意义更清楚一些。

3、h文件的相互包含头文件对c源文件的意义比较清晰。

STM32 USB详解

STM32 USB详解

基于STM32处理器RTC只是个能靠电池维持运行的32位定时器over!并不像实时时钟芯片,读出来就是年月日。

看过些网上的代码,有利用秒中断,在内存中维持一个年月日的日历。

我觉得,这种方法有很多缺点:1.断电时没有中断可用2.频繁进中断,消耗资源3.时间运算复杂,代码需要自己写4.不与国际接轨。

so,还是用标准的UNIX时间戳来进行时间的操作吧!什么是UNIX时间戳?UNIX时间戳,是unix下的计时方式。

很废话具体点:他是一个32位的整形数(刚好和STM32的RTC寄存器一样大),表示从UNIX元年(格林尼治时间1970-1-1 0:0:0)开始到某时刻所经历的秒数听起来很玄幻的,计算下: 32位的数从0-0xFFFFFFFF秒,大概到2038年unix时间戳将会溢出!这就是Y2038bug不过,事实上的标准,我们还是照这个用吧,还有二十年呢。

UNIX时间戳:1229544206 <==> 现实时间:2008-12-17 20:03:26我们要做的,就是把当前时间的UNIX时间戳放在RTC计数器中让他每秒++,over然后,设计一套接口函数,实现UNIX时间戳与年月日的日历时间格式转换这样就可以了在RTC中实现这个时间算法,有如下好处:1. 系统无需用中断和程序来维持时钟,断电后只要RTC在走即可2. 具体的两种计时的换算、星期数计算,有ANSI-C的标准C库函数实现,具体可以看time.h3. 时间与时间的计算,用UNIX时间戳运算,就变成了两个32bit数的加减法4. 与国际接轨。

幸好是与国际接轨,我们有time.h帮忙,在MDK的ARM编辑器下有,IAR下也有其中已经定义了两种数据类型:unix时间戳和日历型时间time_t: UNIX时间戳(从1970-1-1起到某时间经过的秒数)typedef unsigned int time_t;struct tm: Calendar格式(年月日形式)同时有相关操作函数gmtime,localtime,ctime,mktime等等,方便的实现各种时间类型的转换和计算于是,基于这个time.h,折腾了一天,搞出了这个STM32下的RTC_Time使用的时间库这是我的RTC_Time.c中的说明:本文件实现基于RTC的日期功能,提供年月日的读写。

USB解析

USB解析

STM32官方USB例程详解<1>一、USB的“JoyStickMouse”例程结构分析1、例程的结构(1)底层结构包括5个文件:usb_core.c(USB总线数据处理的核心文件),usb_init.c,usb_int.c(用于端点数据输入输入中断处理),usb_mem.c(用于缓冲区操作),usb_regs.c(用于寄存器操作)。

它们都包含了头文件“usb_lib.h”。

在这个头文件中,又有以下定义:#include "usb_type.h"#include "usb_regs.h"#include "usb_def.h"#include "usb_core.h"#include "usb_init.h"#include "usb_mem.h"#include "usb_int.h"usb_lib.h中又包含了七个头文件,其中usb_type.h中主要是用typedef为stm32支持的数据类型取一些新的名称。

usb_def.h中主要是定义一些相关的数据类型。

还有一个未包含在usb_lib.h中的头文件,usb_conf.h用于USB设备的配置。

(2)上层结构上层结构总共5个文件:hw_config.c(用于USB硬件配置)、usb_pwr.c(用于USB连接、断开操作)、usb_istr.c(直接处理USB中断)、usb_prop.c(用于上层协议处理,比如HID 协议,大容量存储设备协议)、usb_desc.c(具体设备的相关描述符定义和处理)。

可见,ST的USB操作库结构十分清晰明了,我先不准备直接阅读源代码。

而是先利用MDK 的软件模拟器仿真执行,先了解一下设备初始化的流程。

2、设备初始化所做的工作(1)Set_System(void)这个是main函数中首先调用的函数,它位于hw_config.c文件中。

基于STM32的USB简易鼠标

基于STM32的USB简易鼠标

毕业设计 [论文]题目:基于STM32的USB简易鼠标设计学院:电气与信息工程学院专业:电子信息工程姓名:XXX学号:XXXXXX指导老师:XXX完成时间:2015年06月01日摘要随着设备的越来越智能化,嵌入式计算机大量应用到各种电子设备中,基于嵌入式系统的USB鼠标及键盘的应用也变得越来越广泛。

在本次设计中,研究的是一款基于STM32的USB鼠标,即插即用,免驱动自动识别,很好的解决了鼠标设备智能化和低延迟的设计要求。

由于是基于HID的USB设备,所以编程非常方便,贴近工程实践,应用前景广阔。

嵌入式系统HID,即人机接口设备,是Human Interface Device的缩写。

HID 是计算机周边设备中非常常见的设备类型,是可以直接与进行人交互的USB设备,例如鼠标、摄像头、U盘等。

在种类繁多USB设备中,HID类设备的成本一般情况下是比较低的。

实际上,只要是符合HID标准的设备都是HID设备,不一定非要具有人机交互功能。

最早支持HID设备的计算机操作系统是Windows98系统。

HID 设备的驱动程序内置在这些系统中,不需要单独开发与安装驱动,应用程序可以直接使用这些驱动程序来与设备通信。

近年来,受计算机性能提升和游戏软件等的影响,人们对鼠标的要求越来越高,特别是一些即时作战游戏,人们希望能达到“零”延迟,这就对原来的鼠标技术提出了挑战。

老式的圆孔鼠标早已不再适用,特别是笔记本电脑根本不再设计老式插孔。

随着USB2.0以及USB3.0的不断完善,再加上高速而价廉的单片机,一款基于STM32的USB简易鼠标正是本课题的研究内容。

本文主要研究基于STM32的USB简易鼠标系统的功能、设计思想和实现,以及基于STM32的USB简易鼠标的组成及工作原理,描述了研究该课题的意义和应用价值。

本设计的重点在于USB 协议的HID部分,精通此协议并植入单片机才能实现计算机与鼠标的沟通。

关键词: USB 技术; HID 协议; STM32单片机;鼠标AbstractAs more and more intelligent devices, embedded computers applied to the large variety of electronic devices, embedded systems USB mouse and keyboard applications are becoming more and more widespread.In this design, the study is a based on the STM32 USB mouse, plug and play, driver-free automatic identification, a good solution to the mouse device intelligence and low-latency design requirements.Because it is based on HID USB device, so the programming is very convenient, close to the engineering practice, the application prospects.Embedded systems HID, namely human interface devices, is an abbreviation for Human Interface Device. HID is a computer peripheral device in a very common device types, people can interact directly with the conduct of USB devices, such as a mouse,camera, U disk and so on.In a wide range of USB devices, under HID class devices generally cost is relatively low.In fact, as long as a HID-compliant devices are HID device does not necessarily have to have interactive features.The earliest HID devices supported computer operating system is Windows98 system.HID device drivers built into these systems, the need for separate development and install the driver, an application can use these drivers to communicate with the device.In recent years, the impact of computer and game software performance by, people have become increasingly demanding of the mouse, especially some instant combat game, people want to be able to achieve "zero" delay, which the original mouse technology presents a challenge .Old-fashioned mouse the hole is no longer applicable, especially notebook computers designed simply no longer the old jack.With the continuous improvement USB2.0 and USB3.0, coupled with high speed and low cost microcontroller, a research based on the STM32 USB simple mouse precisely this topic. This article is mainly based on the STM32 USB simple mouse systems design and implementation, as well as easy on the STM32 USB mouse and work principle, it describes the subject of research and practical value.The design focuses on some USB HID protocol, proficient in this agreement and in order to achieve single-chip implanted communication computer mouse.Keywords: USB technology; HID protocol; STM32 microcontroller; mouse目录摘要 (I)Abstract ............................................................ I I 目录 ............................................................... I II 第1章引言 . (1)1.1 课题背景 (1)1.2 基于STM32的USB鼠标的设计研究方法及目标 (1)1.3 USB鼠标国内外研究现状 (2)第2章 USB协议概述 (3)2.1 USB简介 (3)2.2 USB的拓扑结构 (3)2.3 USB的电气特性 (4)2.4 USB描述符 (4)2.5 USB的包结构 (5)2.5.1令牌包 (5)2.5.2数据包 (6)2.5.3握手包 (6)2.5.4特殊包 (6)2.6 USB的传输类型 (7)第3章 STM32及MDK简介 (8)3.1 STM32简介 (8)3.2 MDK的使用 (8)第4章 USB鼠标的实现 (10)4.1 USB简易鼠标的程序编写 (10)4.2 USB鼠标的运行 (12)4.3 硬件实现 (12)设计总结 (14)参考文献 (15)致谢 (16)附录 (17)第1章引言1.1 课题背景USB 接口是串行总线通信端口,支持即插即用,在计算机领域应用非常广泛。

STM32USB协议和代码分析

STM32USB协议和代码分析

STM32USB协议和代码分析⼀前⾔:usb接⼝是⼀个⾮常重要的通信接⼝,它的协议是有些复杂的。

作为⼀个⼯程师,对usb协议和代码进⾏分析,是⼀个必备的素质和技能。

最近⼀个项⽬⽤到了USB存储接⼝,花了不少时间把项⽬做完之后,还是有不少⼼得体会的。

这⾥做⼀个梳理和总结,希望能给⼈乘凉。

⼆硬件接⼝usb的硬件连线⾮常简单,GND,DP,DN和VCC,⼀般是GND和VCC可以复⽤的。

三 USB协议的描述符这个函数完成描述符的挂载if (USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) != USBD_OK)这个结构体是对描述符的定义:⽐如,制造商,产品描述,id号什么的个性化的东西都可以在这⾥做修改。

USBD_DescriptorsTypeDef FS_Desc ={USBD_FS_DeviceDescriptor, USBD_FS_LangIDStrDescriptor, USBD_FS_ManufacturerStrDescriptor, USBD_FS_ProductStrDescriptor, USBD_FS_SerialStrDescriptor, USBD_FS_ConfigStrDescriptor, USBD_FS_InterfaceStrDescriptor#if (USBD_LPM_ENABLED == 1), USBD_FS_USR_BOSDescriptor#endif /* (USBD_LPM_ENABLED == 1) */};四 usb协议的事件类型这个函数是注册usb的事件类型:USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass)该结构体完成usb的事件的枚举和定义,可以看出,该事件主要是对usb的⽂件系统做了定义,并不是所有的都做了定义的。

STM32学习之USB深入浅出(四)

STM32学习之USB深入浅出(四)

STM32学习之USB深⼊浅出(四)⼀、STM32 的USB结构框图USB模块为PC主机和微控制器所实现的功能之间提供了符合USB规范的通信连接。

PC主机和微控制器之间的数据传输是通过共享⼀专⽤的数据缓冲区来完成的,该数据缓冲区能被USB外设直接访问。

这块专⽤数据缓冲区的⼤⼩由所使⽤的端点数⽬和每个端点最⼤的数据分组⼤⼩所决定,每个端点最⼤可使⽤512 字节缓冲区,最多可⽤于16个单向或8 个双向端点。

USB 模块同PC主机通信,根据USB规范实现令牌分组的检测,数据发送/ 接收的处理,和握⼿分组的处理。

整个传输的格式由硬件完成,其中包括CRC的⽣成和校验。

每个端点都有⼀个缓冲区描述块,描述该端点使⽤的缓冲区地址、⼤⼩和需要传输的字节数。

当USB模块识别出⼀个有效的功能/ 端点的令牌分组时,( 如果需要传输数据并且端点已配置) 随之发⽣相关的数据传输。

USB模块通过⼀个内部的16位寄存器实现端⼝与专⽤缓冲区的数据交换。

在所有的数据传输完成后,如果需要,则根据传输的⽅向,发送或接收适当的握⼿分组。

⾸先在总线端(与D+、D-相连的那⼀端),通过模拟收发器与SIE连接。

SIE使⽤48MHz的专⽤时钟。

与SIE相关的的有三⼤块:CPU内部控制、中断和端点控制寄存器,挂起定时器(这个好像是USB协议的要求,总线在⼀定时间内没有活动,SIE模块能够进⼊SUSPEND状态以节约电能),还有包缓冲区接⼝模块。

说到包缓冲区接⼝模块,这个对应的含义是,USB设备应该提供USB包缓冲区。

这块缓冲区同时受到SIE和CPU核⼼的控制,⽤于CPU与SIE共享达到数据传输的⽬的。

所以CPU通过APB1总线接⼝访问,SIE通过包缓冲区接⼝模块访问,中间通过Arbiter来协调访问。

当然我们关注的中⼼点是控制、中断和端点控制寄存器。

我们通过这些寄存器来获取总线传输的状态,控制各个端点的状态,并可以产⽣中断来让CPU处理当前的USB事件。

第五十九章USB鼠标键盘(Host)实验-STM32F4开发指南-正点原子探索者STM32开发板

第五十九章USB鼠标键盘(Host)实验-STM32F4开发指南-正点原子探索者STM32开发板

第五十九章USB鼠标键盘(Host)实验上一章我们向大家介绍了如何利用STM32F4的USB HOST接口来驱动U盘,本章,我们将利用STM32F4的USB HOST来驱动USB鼠标/键盘。

本章分为如下几个部分:59.1 USB鼠标键盘简介59.2 硬件设计59.3 软件设计59.4 下载验证59.1 USB鼠标键盘简介传统的鼠标和键盘是采用PS/2接口和电脑通信的,但是现在PS/2接口在电脑上逐渐消失,所以现在越来越多的鼠标键盘采用的是USB接口,而不是PS/2接口的了。

USB鼠标键盘属于USB HID设备。

USB HID即:Human Interface Device(人机交互设备)的缩写,键盘、鼠标与游戏杆等都属于此类设备。

不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。

关于USB HID的知识,我们这里就不详细介绍了,请大家自行百度学习。

本章,我们同上一章一样,我们直接移植官方的USB HID例程,官方例程路径:光盘→\8,STM32参考资料→STM32 USB 学习资料→STM32_USB-Host-Device_Lib_V2.1.0→Project→USB_Host_Examples→HID,该例程支持USB鼠标和键盘等USB HID设备,本章我们将移植这个例程到探索者STM32F407开发板上。

59.2 硬件设计本节实验功能简介:开机的时候先显示一些提示信息,然后初始化USB HOST,并不断轮询。

当检测到USB鼠标/键盘的插入后,显示设备类型,并显示设备输入数据,如果是USB鼠标:将显示鼠标移动的坐标(X,Y坐标),滚轮滚动数值(Z坐标)以及按键(左中右)。

如果是USB键盘:将显示键盘输入的数字/字母等内容(不是所有按键都支持,部分按键没有做解码支持,比如F1~F12)。

最后,还是用DS0提示程序正在运行。

所要用到的硬件资源如下:1)指示灯DS02)串口3)TFTLCD模块4)USB HOST接口这几个部分,在之前的实例中都已经介绍过了,我们在此就不多说了。

STM32 USB 详解

STM32 USB 详解
10
USB系统和架构
USB协议简介
USB协议特性 USB系统和架构 USB设备类和供电
STM32互联型产品OTG_FS控制器
STMicroelectronics
Sept. 14~25, 2009
ห้องสมุดไป่ตู้11
USB 设备类
音频类(Audio) 通信设备类 (CDC) 设备固件升级类 (DFU) 人机接口类 (HID) 智能卡接口设备类 (CCID) 影像类(Imaging) 红外线桥接设备类 (IrDA Bridge) 大容量存储设备类 (Mass Storage)
挂起的设备
高功耗设备:总耗电不超过2.5mA。 低功耗设备:总耗电不超过500uA。
STMicroelectronics Sept. 14~25, 2009
13
USB传输类型
USB协议简介
USB协议特性 USB系统和架构 USB设备类和供电 USB传输类型
STM32互联型产品OTG_FS控制器
STMicroelectronics Sept. 14~25, 2009
STMicroelectronics
Sept. 14~25, 2009
20
STM32互联型 OTG_FS控制器连接(1/3)
STM32互联型OTG_FS控制器:USB设备模式
STM32F105/STM32F107
OTG PHY
USB 全速 收发器
D+ D-
USB 标准B 连接器
连接到USB主机
D+ DVBUS GND
8
USB 逻辑组成
USB主机
缓存区 通道
USB设备
应用程序 缓存区
缓存区
接口

STM32-USB使用方法

STM32-USB使用方法

STM32-USB使用方法开发板买的是奋斗mini开发板,芯片是:STM32F103VET6. 如果需要源程序keil4-arm工程,上位机vb。

加qq339396264要程序。

USB开发涉及主机和设备,为了避免开发驱动程序,使用Windows自带的驱动程序。

所以设备枚举成HID类设备。

USB 鼠标就是标准的USB-HID设备。

不过操作系统阻止了应用程序直接访问USB鼠标返回的报告。

所以本例使用自定义HID 设备。

一来免去了开发驱动程序,二来自定义的HID设备应用程序和设备可以自由收发数据(仅指数据内容)。

本文主要介绍STM32的USB模块的简单使用,不会介绍USB协议。

主要是介绍一下STM32F103的USB模块使用。

USB模块从初始化首先是配置和使能时钟下面是时钟的初始化:void Set_USBClock(void){//RCC_USBCLKSource_PLLCLK_1Div5表示【USB时钟= PLL时钟除以1.5】【72/1.5=48MHz】RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);//【使能配置好了的USB时钟】}首先系统时钟要设置为72MHz,然后配置USB时钟为48MHz并使能。

然后是配置中断void USB_Interrupts_Config(void){#define USB_LP_CAN1_RX0_IRQn 20NVIC_InitTypeDef NVIC_InitStructure;//【使能USB中断】NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; //【USB低优先级中断】NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}然后初始化模块的一些寄存器USART_send_str("USB断开\r\n");USB_DISCONNECT//这是断开1.5k上拉电阻delay(0x7AFFFF);//延时一会USB_CONNECT//使能1.5K上拉电阻USART_send_str("USB连接\r\n");DADDR = 0x0080;//USB模块使能位。

STM32-USB使用方法

STM32-USB使用方法

STM32-USB使用方法开发板买的是奋斗mini开发板,芯片是:STM32F103VET6. 如果需要源程序keil4-arm工程,上位机vb。

加qq339396264要程序。

USB开发涉及主机和设备,为了避免开发驱动程序,使用Windows自带的驱动程序。

所以设备枚举成HID类设备。

USB 鼠标就是标准的USB-HID设备。

不过操作系统阻止了应用程序直接访问USB鼠标返回的报告。

所以本例使用自定义HID 设备。

一来免去了开发驱动程序,二来自定义的HID设备应用程序和设备可以自由收发数据(仅指数据内容)。

本文主要介绍STM32的USB模块的简单使用,不会介绍USB协议。

主要是介绍一下STM32F103的USB模块使用。

USB模块从初始化首先是配置和使能时钟下面是时钟的初始化:void Set_USBClock(void){//RCC_USBCLKSource_PLLCLK_1Div5表示【USB时钟= PLL时钟除以1.5】【72/1.5=48MHz】RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);//【使能配置好了的USB时钟】}首先系统时钟要设置为72MHz,然后配置USB时钟为48MHz并使能。

然后是配置中断void USB_Interrupts_Config(void){#define USB_LP_CAN1_RX0_IRQn 20NVIC_InitTypeDef NVIC_InitStructure;//【使能USB中断】NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; //【USB低优先级中断】NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}然后初始化模块的一些寄存器USART_send_str("USB断开\r\n");USB_DISCONNECT//这是断开1.5k上拉电阻delay(0x7AFFFF);//延时一会USB_CONNECT//使能1.5K上拉电阻USART_send_str("USB连接\r\n");DADDR = 0x0080;//USB模块使能位。

浅谈基于stm32 实现的红外遥控控制USB 鼠标

浅谈基于stm32 实现的红外遥控控制USB 鼠标

浅谈基于stm32 实现的红外遥控控制USB鼠标本文从网络收集而来,上传到平台为了帮到更多的人,如果您需要使用本文档,请点击下载按钮下载本文档(有偿下载),另外祝您生活愉快,工作顺利,万事如意!加快嵌入式技术的开发应用,掌握嵌入式开发核心技术,对于未能赶上前几次世界范围计算机技术发展机遇的中国来说非常重要。

基于STM32 实现的红外遥控控制USB 鼠标就是利用STM32 的中断系统将各模块相互连接。

当STM32 捕获到信号时,向CUP 发送中断请求,然后响应该中断,对中断进行处理。

STM32 通过识别捕获到的红外信号向PC 端通过USB 协议发送鼠标控制信号。

1STM32 中断系统在STM32 中,外部中断可由每一个I/O 口进行外部事件的中断触发。

在中断控制器支持的19 个外部中断事件中,只有线0 至15 对应外部I/O 的输入中断,线16 则连接到PVD 的输出,线17 连接到RTC 的闹事件,线18 连接到USB 的唤醒时事件。

在主程序运行之前,需要先进行中断初始化,包括使能中断通道、中断优先级分组初始化、配置中断线。

当有多个中断时,CUP 处理中断时严格按照中断优先级分组来决定处理哪个中断。

中断优先级分为抢占优先级和子优先级,中断处理的顺序先有抢占优先级决定,当抢占优先级相同时,则由子优先级决定。

2STM32 通用定时器STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的16 位自动装载计数器(CNT)构成。

在这次开发中,STM32 的通用定时器主要用于测量输入信号的脉冲长度即输入捕获。

当输入捕获发生时将产生中断/DMA。

当从独立通道中捕获到外界信号时,定时器将测量外界信号的周期、占空比来实现信号的识别。

例如,在测量时,定时器设置为边沿触发,即定时器会计算信号上升沿和下降沿之间的时间差,其计算精度取决于定时器本身频率的精度。

在测量方法中分为测频法和测周法,当被测信号频率大于中介频率时采用测频法,即在STM32 中采用测频法。

stm32F107 USB从设备HID 鼠标程序详解

stm32F107 USB从设备HID 鼠标程序详解

STM32F107USB从设备HID程序编写一、前提准备本文是基于STM32F107官方库文件3.5.0基础上完成的,首先要有以下资料准备:(1)stm32基于3.5.0库的工程模板;(2)stm32官方USB库文件(由于3.5.0官方库函数中不包括USB的官方库,因此需要单独加入),下载地址:/disk/home#path=%252F%25E5%25AD%25A6%25E4%25B9%25A0%25E 5%2585%25B1%25E4%25BA%25AB%252Fstm32%2520study%252Fusb%2520%25E5%2588 %2586%25E4%25BA%25AB(3)stm32USB基础知识(这里不再赘述,网上有蛮多资料,推荐《STM32USB固件的中文资料》和官方提供的本文讲述的USB库文件的官方说明);(4)编程软件keil for arm;(以上资料文件在链接中都有贡献!@^@多多支持)注意:下面的内容:有颜色标注的是用户需要修改的内容二、USB官方库详细介绍:在下载官方库之后,从命名上可以明白,该库为stm32105,107,f2和F4等USB控制器的主设备和从设备的官方库;接下来,我们继续进入库文件介绍:_hemresc:ST官方LOGOLibraries:CMSIS:ST官方内核说明及相应的源码(STM32F2xx_StdPeriph_Driver.....等等);STM_USB_Device_Library:USB器件类的库函数;STM_USB_HOST_Library:USB主设备类的库函数;STM32_USB_OTG_Driver:USB OTG类的驱动和库函数;Project:USB_Device_Examples:USB器件类的官方例程;USB_Host_Device_Examples:USB主从设备的官方例程;USB_Host_Examples:USB主设备官方例程;Utilities:该文件夹下包括STM32的扩展,比如SDIO、文件系统和官方评估板的简单驱动;至此大家应该明白官方USB库中,重点就在USB_device_Library、Host_Library和OTG_Library中了,由于本文主要讲解HID(人机接口设备)程序的实现,因此就不对HOST 做分析了;对于USB_Device_Library中的文件,官方分为了core和Class进行分装;对于core文件夹的源文件:Scr:包含了USB device内核,USB IO请求和USB数据请求的源代码;Inc:USB内核头文件,(usbd_conf_template.h为模板,用户需要自行添加使用到的USb功能定义,usbd_usr.h:用户需要添加用户自定义的函数声明和变量定义);再看Class文件下,包括USB device的所有设备的源文件和头文件;Audio:USB音频类设备,诸如喇叭、扩音器、低音炮之类;CDC:通信类设备,比如USB虚拟串口等;Dfu:固件升级;Hid:人机接口设备,比如鼠标、键盘、游戏手柄等;MSC:大容量存储设备,比如硬盘、读卡器等;接下来是OTG_library;该文件夹下包括了USB_core,USB_device、USB_Host、USB_OTG 的底层驱动:内核驱动:usb_core.cUSB_device驱动:usb_dcd.c usb_dcd_int.cUSB_Host驱动:usb_hcd.c usb_hcd_init.cUSB_OTG驱动:usb_otg,c头文件与之对应;看完这个大家就有疑问了,文件夹下还有其他的头文件和源文件,这些又是干嘛的呢?摆设?哈哈……这些文件就重要了,usb_defines.h、usb_regs,h廊括了USB的寄存器的相关定义,而usb_bsp.h、usb_conf_template.h、usb-dap_template.c则都是用户需要修改或增加USB相关代码的文件了;GG~~总算是把官方库给读完了(第一次写这种东西,真为自己捏把汗!哈哈……希望大家多多支持),从官方库中可以看出,官方代码需要修改的重要文件都用xxx_template.c和xxx_template.h命名,大大的方便了用户啊(真贴切);三、官方库的移植和修改了解了官方库的架构,对于本次USB HID设备的程序结构我们就相当清晰了:(1)底层驱动,(2)USB device内核;(3)USB HID设备源码;这三个部分的代码是我们需要添加的;打开我们的STM32工程模板文件夹,在文件夹下新建文件夹usb,在usb文件夹下新建usb_usr、usb_lib、usb_driver三个文件夹,文件夹内容添加如下:Usb_driver:官方库中OTG_library中内容,(可不用理睬HOST设备相关内容);Usb_lib:device_library中core文件夹所有内容和class下的HID内容;Usb_usr:将OTG_driver中的usb_bsp_template.c和usb__conf_template.h、上面所述的usbd_desc.c和usbd_usr.c,device Library/core/inc下的usbd_conf_template.h复制到usb_usr 文件夹中,并将xxxxx_template.重命名为xxxx.c(去掉_template);下面的都要在keil下进行了,过程如下:在工程下新建usb_driver、usb_lib_core、usb_lib_hid、usb_usr分组,并添加如图的源文件(切记要添加相应头文件路径target->c/c++->include path),添加结果如下:到了这一步,USB的工程模板就基本差不多了,但编译一下,还是会出现很多错误:(1)错误1:这个错误提示很明显,提示USB_OTG_HS_CORE和USB_OTG_FS_CORE至少要定义一种,这个错误提示的源码在usb_conf.h中,仔细查看该文件可知:官方将这两个定义都注释了,我们只要取消其中一个即可,这里我们采用USB全速模式,因此我们取消对USE_USB_OTG_FS的注释(HS是指USB高速模式,这种模式下需要外接PHY器件);(2)错误2:提示xxxx未定义,我们可以找到USBD_ITF_MAX_NUM出现在usbd_req.c中,其他均出现在usbd_hid_core.c中,这些都是我们需要单独实现的,这里我们同样在usb_conf.h中给出定义:这些定义我们会在后续的代码分析中进行一一讲解;注意:usb_bsp.c文件中,我们得注释掉函数的内容:void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE*pdev);void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE*pdev);至此我们再进行编译,就没有错误了,咱们USB的工程模板算是建立好了;四、HID程序代码编写工程模板是建立好了,开始对于程序该如何出手呢?从哪里开始编写呢?似乎还是一头雾水(痛哭流涕中)。

STM32的USB键盘及鼠标例程

STM32的USB键盘及鼠标例程

STM32的USB键盘及鼠标例程时间:2011-07-19 21:35:05 来源:作者:STM32的USB键盘及鼠标例程通过网络可以搜到很,但是在同一个设备中集成键盘及鼠标的例程却比较少见(我通过GOOGLE只搜到圈圈的基于51+D12的版本)。

以下为我参考圈圈的例程做出来的集成键盘及鼠标的STM32的程序。

程序上除了usb_desc.c及usb_endp.c外,其它部份同单一的键盘鼠标一样。

下面着重说一下usb_desc.c及usb_endp.c的不同之处。

单一键盘鼠标跟集成键盘鼠标这区别主要是报告描述符不同。

单一键盘鼠标的报告描述符因只有一组报告输入/输出,故没有报告ID,而集成的有两组报告(键盘及鼠标),所以每一组报告都有一个报告ID加以区别。

另外就是在usb_endp.c中对端点的数据发送不知道是不是我的原因,待发送数据长度有问题,原因还未找到,只能在后面增加一条设置发送数据长度的语句。

(如果不加的话,PC端只会收到8位数据,尽管我程序里设置了9位数据)完整的usb_desc.c文件如下:#include "STM32Lib\USBLib\usb_lib.h"#include "usb_desc.h"// KM_DeviceDescriptorconst u8 HID_DeviceDescriptor[HID_SIZE_DEVICE_DESC]={0X12, // bLengthUSB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType0x00, // bcdUSB0x02,0x00, // bDeviceClass0X00, // bDeviceSubClass0x00, // bDeviceProtocol0x40, // bMaxPacketSize400x34, // idVendor (0x0483)0x12,0x78, // idProduct = 0x57100x56,0x00, // bcdDevice rel.20.000x02,1, // index of string descriptor describing manufacturer2, // index of string descriptor describing product3, // index of string descriptor describing the device serial number0x01 // bNumConfigurations};// USB Configuration Descriptorconst u8 HID_ConfigDescriptor[HID_SIZE_CONFIG_DESC]={0X09, // bLengthUSB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType HID_SIZE_CONFIG_DESC, // wTotalLength0x00,0x01, // bNumInterfaces 接口数目0x01, // bConfigurationValue set_configuration命令所需要的参数值0x00, // iConfiguration0xE0, // bmAttributes0x32, // MaxPower 100mA//***************接口1配置***************0x09,USB_INTERFACE_DESCRIPTOR_TYPE,0x00, // 接口编号0x00,0x02, // 端点数0x03,0x01, // 1 = boot 0 = no boot0x01, // 0 = none 1 = keyboard 2 = mouse0, //接口描述符索引值//***************HID 描述符****************0x09,HID_DESCRIPTOR_TYPE,0x10,0x01,0x00,0x01,0x22,HID_SIZE_REPORT_DESC,0x00,//***************端点1输入描述***************0x07,USB_ENDPOINT_DESCRIPTOR_TYPE,0x81,0x03,0x0A,0x00,0x20,//***************端点1输出描述***************0x07,USB_ENDPOINT_DESCRIPTOR_TYPE,0x01,0x03,0x0A,0x00,0x20,};// MOUSE ConfigDescriptorconst u8 HID_ReportDescriptor[HID_SIZE_REPORT_DESC]={/************************USB键盘部分报告描述符**********************//*******************************************************************///这是一个全局(bType为1)条目,将用途页选择为普通桌面Generic Desktop Page(0x01)//后面跟一字节数据(bSize为1),后面的字节数就不注释了,//自己根据bSize来判断。

STM32-USB鼠标解析汇报

STM32-USB鼠标解析汇报

一、USB的“JoyStickMouse”例程结构分析1、例程的结构(1)底层结构包括5个文件:usb_core.c(USB总线数据处理的核心文件),usb_init.c,usb_int.c(用于端点数据输入输入中断处理),usb_mem.c(用于缓冲区操作),usb_regs.c(用于寄存器操作)。

它们都包含了头文件“usb_lib.h”。

在这个头文件中,又有以下定义:#include "usb_type.h"#include "usb_regs.h"#include "usb_def.h"#include "usb_core.h"#include "usb_init.h"#include "usb_mem.h"#include "usb_int.h"usb_lib.h中又包含了七个头文件,其中usb_type.h中主要是用typedef为stm32支持的数据类型取一些新的名称。

usb_def.h中主要是定义一些相关的数据类型。

还有一个未包含在usb_lib.h中的头文件,usb_conf.h用于USB设备的配置。

(2)上层结构上层结构总共5个文件:hw_config.c(用于USB硬件配置)、usb_pwr.c(用于USB连接、断开操作)、usb_istr.c(直接处理USB中断)、usb_prop.c(用于上层协议处理,比如HID协议,大容量存储设备协议)、usb_desc.c(具体设备的相关描述符定义和处理)。

可见,ST的USB操作库结构十分清晰明了,我先不准备直接阅读源代码。

而是先利用MDK的软件模拟器仿真执行,先了解一下设备初始化的流程。

2、设备初始化所做的工作(1)Set_System(void)这个是main函数中首先调用的函数,它位于hw_config.c文件中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、USB的“JoyStickMouse”例程结构分析1、例程的结构(1)底层结构包括5个文件:usb_core.c(USB总线数据处理的核心文件),usb_init.c,usb_int.c(用于端点数据输入输入中断处理),usb_mem.c(用于缓冲区操作),usb_regs.c(用于寄存器操作)。

它们都包含了头文件“usb_lib.h”。

在这个头文件中,又有以下定义:#include "usb_type.h"#include "usb_regs.h"#include "usb_def.h"#include "usb_core.h"#include "usb_init.h"#include "usb_mem.h"#include "usb_int.h"usb_lib.h中又包含了七个头文件,其中usb_type.h中主要是用typedef为stm32支持的数据类型取一些新的名称。

usb_def.h中主要是定义一些相关的数据类型。

还有一个未包含在usb_lib.h中的头文件,usb_conf.h用于USB设备的配置。

(2)上层结构上层结构总共5个文件:hw_config.c(用于USB硬件配置)、usb_pwr.c(用于USB连接、断开操作)、usb_istr.c(直接处理USB中断)、usb_prop.c(用于上层协议处理,比如HID协议,大容量存储设备协议)、usb_desc.c(具体设备的相关描述符定义和处理)。

可见,ST的USB操作库结构十分清晰明了,我先不准备直接阅读源代码。

而是先利用MDK的软件模拟器仿真执行,先了解一下设备初始化的流程。

2、设备初始化所做的工作(1)Set_System(void)这个是main函数中首先调用的函数,它位于hw_config.c文件中。

它的主要功能是初始化时钟系统、使能相关的外围设备电源。

配置了JoyStickMouse所用到的5个按键,并且配置了两个EXTI中断,一个是用于把USB从挂起模式唤醒,还有一个用途未知。

(2)USB_Interrupts_Config();这个是main函数中调用的第二个函数,它也位于hw_config.c文件中。

主要功能是配置USB所用到的中断。

跟踪到代码中,主要设配置了USB低优先级中断和唤醒中断,又有一个EXTI 中断功能未知。

(3)Set_USBClock()这个是main函数中调用的第三个函数,它也位于hw_config.c文件中。

它的功能是配置和使能USB时钟。

(4)USB_Init(void)这个是main函数中调用的第四个函数,它也位于usb_init.c文件中。

它初始化了三个全局指针,指向DEVICE_INFO、USER_STANDARD_REQUESTS 和DEVICE_PROP结构体。

后面两个是函数指针结构体,里面都是USB请求实现、功能实现的函数指针。

void USB_Init(void){pInformation = &Device_Info;pInformation->ControlState = 2;pProperty = &Device_Property;pUser_Standard_Requests = &User_Standard_Requests;/* Initialize devices one by one */pProperty->Init();}这三个结构体都是与具体设备枚举和功能实现相关的,定义在usb_prop.c和usb_desc.c文件中。

DEVICE_PROP Device_Property={Joystick_init,Joystick_Reset,Joystick_Status_In,Joystick_Status_Out,Joystick_Data_Setup,Joystick_NoData_Setup,Joystick_Get_Interface_Setting,Joystick_GetDeviceDescriptor,Joystick_GetConfigDescriptor,Joystick_GetStringDescriptor,0,0x40 /*MAX PACKET SIZE*/};USER_STANDARD_REQUESTS User_Standard_Requests={Joystick_GetConfiguration,Joystick_SetConfiguration,Joystick_GetInterface,Joystick_SetInterface,Joystick_GetStatus,Joystick_ClearFeature,Joystick_SetEndPointFeature,Joystick_SetDeviceFeature,Joystick_SetDeviceAddress};Usb_init()函数调用pProperty->Init()(实质上就是Joystick_init)完成设备的初始化。

上层程序调用下次函数是常规性的操作。

而下层函数(usb_init相对于usb_prop是输入底层操作文件)调用上层文件函数我们称之为回调。

回调函数的意义在于同一种操作模式、提供不同的回调函数则可以实现不同的功能。

Windows中处理消息,好像也用到了这种模式。

回调函数的实现方法是函数指针数组。

这是指针的高级应用。

这是函数的代码:void Joystick_init(void){/* Update the serial number string descriptor with the data from the uniqueID*/Get_SerialNum();//获取设备序列号,转变为unicode字符串pInformation->Current_Configuration = 0;/* Connect the device */PowerOn();//连接USB设备,实质是能让主机检测到了。

/* USB interrupts initialization */_SetISTR(0);/* clear pending interrupts */wInterrupt_Mask = IMR_MSK;_SetCNTR(wInterrupt_Mask); /* set interrupts mask */bDeviceState = UNCONNECTED;}实质上,代码执行到这里,开发板已经可以响应主机发来的数据了。

但我还是先把main()函数的代码看完吧。

(5)SysTick_Config();这个函数调用主要是为程序中用到的精确延时作配置。

3、进入主循环进入主循环的工作就两个:Joystick_Send(JoyState())。

JoyState()用来获取按键的状态。

Joystick_Send(JoyState())用来把按键状态发到主机。

当然这里真正的发送工作并不是由该代码完成的。

它的工作只是将数据写入IN端点缓冲区,主机的IN令牌包来的时候,SIE负责把它返回给主机。

主要代码如下:UserToPMABufferCopy(Mouse_Buffer, GetEPTxAddr(ENDP1), 4);//从用户复制四个字节到端点1缓冲区,控制端点的输入缓冲区。

SetEPTxValid(ENDP1);/* enable endpoint for transmission */4、中断处理过程大致理解(1)usb_istr()函数中的中断处理简单分析有用的代码大概以下几段,首先是处理复位的代码,调用设备结构中的复位处理函数。

wIstr = _GetISTR();if (wIstr & ISTR_RESET & wInterrupt_Mask){_SetISTR((u16)CLR_RESET); //清复位中断Device_Property.Reset();}处理唤醒的代码:if (wIstr & ISTR_WKUP & wInterrupt_Mask){_SetISTR((u16)CLR_WKUP);Resume(RESUME_EXTERNAL);}处理总线挂起的代码:if (wIstr & ISTR_SUSP & wInterrupt_Mask){if (fSuspendEnabled) /* check if SUSPEND is possible */{Suspend();}else{/* if not possible then resume after xx ms */Resume(RESUME_LATER);}/* clear of the ISTR bit must be done after setting of CNTR_FSUSP */ _SetISTR((u16)CLR_SUSP);}处理端点传输完成的代码,这段是最重要的,它调用底层usb_int.c()文件中的CTR_LP()函数来处理端点数据传输完成中断。

if (wIstr & ISTR_CTR & wInterrupt_Mask){CTR_LP();/* servicing of the endpoint correct transfer interrupt */ }二、STM32处理器的USB接口1、接口模块的内部结构在书上有一个很好的USB内部接口模块内部结构图,比较好的解释了各个模块之间的关系,我这里试着用我自己的理解阐述一下吧。

首先在总线端(与D+、D-相连的那一端),通过模拟收发器与SIE连接。

SIE 使用48MHz的专用时钟。

与SIE相关的的有三大块:CPU内部控制、中断和端点控制寄存器,挂起定时器(这个好像是USB协议的要求,总线在一定时间内没有活动,SIE模块能够进入SUSPEND状态以节约电能),还有包缓冲区接口模块。

说到包缓冲区接口模块,这个对应的含义是,USB设备应该提供USB包缓冲区。

这块缓冲区同时受到SIE和CPU核心的控制,用于CPU与SIE共享达到数据传输的目的。

所以CPU通过APB1总线接口访问,SIE通过包缓冲区接口模块访问,中间通过Arbiter来协调访问。

当然我们关注的中心点是控制、中断和端点控制寄存器。

我们通过这些寄存器来获取总线传输的状态,控制各个端点的状态,并可以产生中断来让CPU处理当前的USB事件。

CPU可以通过APB1总线接口来访问这些寄存器。

相关文档
最新文档