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文件中。

  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总线接口来访问这些寄存器。

相关文档
最新文档