云文档网 - 专业文章范例文档资料分享平台

STM32-USB鼠标解析

来源:网络收集 时间:2024-05-02 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xuecool-com或QQ:370150219 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

一、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 \ #include \ #include \ #include \ #include \ #include \ #include \

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 unique ID*/

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、接口模块的内部结构

百度搜索“yundocx”或“云文档网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,云文档网,提供经典教育范文STM32-USB鼠标解析在线全文阅读。

STM32-USB鼠标解析.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.yundocx.com/fanwen/704981.html(转载请注明文章来源)
Copyright © 2018-2022 云文档网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:370150219 邮箱:370150219@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:7 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219