STM32 官方USB 例程JoyStick 详解

来源:本站
导读:目前正在解读《STM32 官方USB 例程JoyStick 详解》的相关信息,《STM32 官方USB 例程JoyStick 详解》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《STM32 官方USB 例程JoyStick 详解》的详细说明。
简介:本文介绍了STM32 官方USB 例程JoyStick 详解

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

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();

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

提醒:《STM32 官方USB 例程JoyStick 详解》最后刷新时间 2024-03-14 01:04:10,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《STM32 官方USB 例程JoyStick 详解》该内容的真实性请自行鉴别。