STM32USB鼠标解析汇报

上传人:公**** 文档编号:499097147 上传时间:2022-10-09 格式:DOC 页数:25 大小:182KB
返回 下载 相关 举报
STM32USB鼠标解析汇报_第1页
第1页 / 共25页
STM32USB鼠标解析汇报_第2页
第2页 / 共25页
STM32USB鼠标解析汇报_第3页
第3页 / 共25页
STM32USB鼠标解析汇报_第4页
第4页 / 共25页
STM32USB鼠标解析汇报_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《STM32USB鼠标解析汇报》由会员分享,可在线阅读,更多相关《STM32USB鼠标解析汇报(25页珍藏版)》请在金锄头文库上搜索。

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 ”。在这个头 文件中,又有以下定义:#in clude usb_type.h#i nclude usb_regs.h#in clude usb_def.h#i nclude usb_core.h#in clude usb_i ni t.h

2、#include usb_mem.h#include usb_int.husb_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协议,大容量

3、存储设备协议)、usb_desc.c (具体设备的 相关描述符定义和处理)。可见,ST的USB操作库结构十分清晰明了,我先不准备直接阅读源代码。而是 先利用MDK的软件模拟器仿真执行,先了解一下设备初始化的流程。2、设备初始化所做的工作(1) Set_System(void)这个是main函数中首先调用的函数,它位于 hw_config.c文件中。它的主要功 能是初始化时钟系统、使能相关的外围设备电源。配置了 JoyStickMouse所用到的5个按键,并且配置了两个 EXTI中断,一个是 用于把USB从挂起模式唤醒,还有一个用途未知。(2) USB_lnterrupts_Config();这

4、个是main函数中调用的第二个函数,它也位于hw_config.c文件中。主要功能是配置USE所用到的中断。跟踪到代码中,主要设配置了 USB氐优先级中断和唤醒中断,又有一个EXTI中断功能未知。(3) Set_USBClock()这个是main函数中调用的第三个函数,它也位于hw_config.c文件中。它的功能是配置和使能USB时钟。(4) USBnit(void)它初始VICE PROP这个是main函数中调用的第四个函数,它也位于 usb_init.c 文件中 化了三个全局指针,指向 DEVICE_INFOUSER_STANDARD_REQU和STS 结构体。后面两个是函数指针结构体,

5、里面都是USB青求实现、功能实现的函数指针 void USBni t(void) _pin formati on = & Devicenfo;pl nformatio n-Con trolState = 2;pProperty = & Device_Property;pUser_Sta ndard_Requests = &User_Sta ndard_Requests;/* in itialize devices one by one */pProperty-i nit();这三个结构体都是与具体设备枚举和功能实现相关的,定义在 usb_prop.c和 usb_desc.c 文件中。DEVIC

6、E_PROP Device_Property=Joysticknit,Joystick_Reset,Joystick_Status_i n,Joystick_Status_Out,Joystick_Data_Setup,Joystick_NoData_Setup,Joystick_Get_l nterface_Setti ng,Joystick_GetDeviceDescriptor,Joystick_GetC on figDescriptor,Joystick_GetStri ngDescriptor,0,0x40 /*MAX PACKET SIZE*/;USER_STANDARD_REQU

7、ESTS User_Sta ndard_Req=estsJoystick_GetC on figurati on,Joystick_SetC on figurati on,Joystick_Geti nterface,Joystick_Seti nterface,Joystick_GetStatus,Joystick_ClearFeature,Joystick_SetE ndPoi ntFeature,Joystick_SetDeviceFeature,Joystick_SetDeviceAddress; 一Usb_init()函数调用 pProperty-Init()(实质上就是 Joyst

8、icknit)完成设备的初始化。上层程序调用下次函数是常规性的操作。而下层函数(usb_init相对于usb_prop 是输入底层操作文件)调用上层文件函数我们称之为回调。回调函数的意义在于同一种操作模式、提供不同的回调函数则可以实现不同的 功能。Windows中处理消息,好像也用到了这种模式。回调函数的实现方法是函数指针数组。这是指针的高级应用。这是函数的代码:void Joysticknit(void)/* Update the serial nu mber stri ng descriptor with the data from the uniqueID*/Get_SerialNum(

9、);/获取设备序列号,转变为uni code字符串 pin formatio n-Curre nt_Con figurati on = 0;/* Connect the device */PowerO n();/连接USB设备,实质是能让主机检测到了。/* USB interrupts initialization */_SetlSTR(0);/* clear pending in terrupts */win terrupt_Mask = IMR_MSK;_SetCNTR(wi nterrupt_Mask); /* set in terrupts mask */ bDeviceState =

10、 UNCONNECTED;实质上,代码执行到这里,开发板已经可以响应主机发来的数据了。但我还是 先把main ()函数的代码看完吧。(5) SysTick_Config();这个函数调用主要是为程序中用到的精确延时作配置。3、进入主循环进入主循环的工作就两个:Joystick_Se nd(JoyState()。JoyState()用来获取按键的状态。Joystick_Se nd(JoyState()用来把按键状态发到主机。当然这里真正的发送工作并不是由该代码完成的。它的工作只是将数据写入IN端点缓冲区,主机的IN令牌包来的时候,SIE负责把它返回给主机。主要代码如下:UserToPMABuff

11、erCopy(Mouse_Buffer, GetEPTxAddr(ENDPI), 4);/从用户复制四个字节到端点1缓冲区,控制端点的输入缓冲区。SetEPTxValid(ENDP1); /* enable endpoint for transmission */4、中断处理过程大致理解(1) usb_istr()函数中的中断处理简单分析有用的代码大概以下几段,首先是处理复位的代码,调用设备结构中的复位处 理函数。wIstr = _GetISTR();if (wIstr & ISTR_RESET & wI nterrupt_Mask)_SetlSTR(u16)CLR_RESET); / 清复位

12、中断Device_Property.Reset();处理唤醒的代码:if (wIstr & ISTR_WKUP & wI nterrupt_Mask)_SetISTR(u16)CLR_WKUP);Resume(RESUME_EXTERNAL);处理总线挂起的代码:if (wIstr & ISTR_SUSP & wI nterrupt_Mask)if (fSuspendEnabled) /* check if SUSPEND is possible */Suspe nd();else/* if not possible the n resume after xx ms */Resume(RESU

13、ME_LATER);/* clear of the ISTR bit must be done after setting of CNTR_FSUSP */_SetlSTR(u16)CLR_SUSP);()文件中处理端点传输完成的代码,这段是最重要的,它调用底层usb_i nt.c的CTR_LP()函数来处理端点数据传输完成中断。if (wIstr & ISTR_CTR & wI nterrupt_Mask)CTR_LP();/* servici ng of the en dpo int correct tran sfer in terrupt */二、STM3处理器的USB接 口1、接口模块

14、的内部结构在书上有一个很好的USB内部接口模块内部结构图,比较好的解释了各个模块 之间的关系,我这里试着用我自己的理解阐述一下吧。首先在总线端(与D+ D-相连的那一端),通过模拟收发器与SIE连接。SIE使 用48MHZ勺专用时钟。与SIE相关的的有三大块:CPU内部控制、中断和端点控制寄存器,挂起定时器 (这个好像是USB协议的要求,总线在一定时间内没有活动,SIE模块能够进入 SUSPEN状态以节约电能),还有包缓冲区接口模块。说到包缓冲区接口模块,这个对应的含义是, USB设备应该提供USB包缓冲区。 这块缓冲区同时受到SIE和CPU核心的控制,用于CPU与 SIE共享达到数据传 输的

15、目的。所以CPU通过APB总线接口访问,SIE通过包缓冲区接口模块访问,中间通过Arbiter 来协调访问。当然我们关注的中心点是控制、中断和端点控制寄存器。我们通过这些寄存器 来获取总线传输的状态,控制各个端点的状态,并可以产生中断来让CPL处理当前的USB事件。CPU可以通过APB总、线接口来访问这些寄存器。它们使用的都是PCLK时钟。2、USB模块的寄存器认识(1)控制寄存器CNTR传输完 成中断 允许位。CTRM 1有效,如果SIE置包缓冲 位传输 区溢出 完成标 中断允 志,则相许位 应的数 据传输 完成中 断发生。第15位错误中 断允许 位唤醒中 断允许 位。WKUPM1 有效,如 果唤醒 请求标 志位置 位,则产 生唤醒 中断。挂起中 断允许 位。SUSPM1 有效,当 总线挂 起标志 置位时, 发生挂 起中断。复位中 断允许 位。RESETM1有效, 软件强 制复位 和总线 复

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号