移植STM32固件库用于HID双向通信Word文档格式.docx
《移植STM32固件库用于HID双向通信Word文档格式.docx》由会员分享,可在线阅读,更多相关《移植STM32固件库用于HID双向通信Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
style="
font-family:
SimSun;
font-size:
10px;
"
>
const
uint8_t
Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC]
=
2.
{
3.
0x09,
/*
bLength:
Configuration
Descriptor
size
*/
4.
USB_CONFIGURATION_DESCRIPTOR_TYPE,
bDescriptorType:
5.
JOYSTICK_SIZ_CONFIG_DESC,
6.
wTotalLength:
Bytes
returned
7.
0x00,
8.
0x01,
/*bNumInterfaces:
1
interface*/
9.
/*bConfigurationValue:
value*/
10.
/*iConfiguration:
Index
of
string
descriptor
describing
11.
the
configuration*/
12.
0xE0,
/*bmAttributes:
Self
powered
13.
0x32,
/*MaxPower
100
mA:
this
current
is
used
for
detecting
Vbus*/
14.
15.
/**************
Joystick
Mouse
interface
****************/
16.
09
17.
/*bLength:
Interface
size*/
18.
USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType:
type*/
19.
/*bInterfaceNumber:
Number
Interface*/
20.
/*bAlternateSetting:
Alternate
setting*/
21.
0x02,
/*bNumEndpoints除端点0外,需要1输入1输出*/
22.
0x03,
/*bInterfaceClass:
HID*/
23.
/*bInterfaceSubClass
:
1=BOOT,
0=no
boot选择no
boot*/
24.
/*nInterfaceProtocol
0=none,
1=keyboard,
2=mouse选择none*/
25.
0,
/*iInterface:
descriptor*/
26.
/********************
HID
********************/
27.
18
28.
29.
HID_DESCRIPTOR_TYPE,
/*bDescriptorType:
30.
/*bcdHID:
Class
Spec
release
number*/
31.
32.
/*bCountryCode:
Hardware
target
country*/
33.
/*bNumDescriptors:
class
descriptors
to
follow*/
34.
0x22,
/*bDescriptorType*/
35.
JOYSTICK_SIZ_REPORT_DESC,/*wItemLength:
Total
length
Report
36.
37.
endpoint
38.
27
39.
0x07,
Endpoint
40.
USB_ENDPOINT_DESCRIPTOR_TYPE,
41.
42.
0x81,
/*bEndpointAddress:
Address
(IN)*/
43.
Interrupt
endpoint*/
44.
0x40,
/*wMaxPacketSize:
64
Byte
max修改最大包大小为64字节
45.
46.
0x0A,
/*bInterval:
Polling
Interval
(10
ms)修改轮询间隔为10ms*/
47./********************
48.
34
49.
50.
51.
52.
(OUT)*/
53.
54.
55.
56.
0x20,
ms)
修改轮询间隔为10ms
57./*41
58.
}
;
<
/span>
14px;
59.<
报告描述符
Joystick_ReportDescriptor[JOYSTICK_SIZ_REPORT_DESC]
0x05,
0xFF,
/*Usage
Page(User
Define)*/
/*Usage(User
0xA1,
/*Collection(application)*/
Page
(1)*/
0x19,
Minimum(0)*/
0x29,
Maximum(255)*/
0x15,
/*Logical
0x25,
0x95,
/*Report
Count(3)*/
0x75,
0x08,
Size
(1)*/
13.0x81,
/*Input(Data,Var,Abs)*/
14.0x05,
0x02
Page
(2)*/
15.0x19,
Count(64)*/
Size(8)*/
21.0x91,
22.0xc0
/*关集合*/
};
Joystick_ReportDescriptor
*/<
24.<
上面我们修改了数组内容,导致数组大小发生变化,所以根据变化做响应修改,在usb_desc.c中
#define
JOYSTICK_SIZ_CONFIG_DESC
41
2.#define
JOYSTICK_SIZ_REPORT_DESC
39<
四、修改函数
修改设备RESET函数Joystick_Reset,这个函数是在RESET中断中被调用,用于端口的初始化。
因为我们增加了端点1的输出,修改了包大小,所以要做响应的修改。
这个函数位于usb_prop.c中,修改后的函数为
void
Joystick_Reset(void)
2.{
Set
Joystick_DEVICE
as
not
configured
pInformation->
Current_Configuration
0;
Current_Interface
/*the
default
Current
Feature
initialization
Current_Feature
Joystick_ConfigDescriptor[7];
SetBTABLE(BTABLE_ADDRESS);
Initialize
0
SetEPType(ENDP0,
EP_CONTROL);
SetEPTxStatus(ENDP0,
EP_TX_STALL);
SetEPRxAddr(ENDP0,
ENDP0_RXADDR);
SetEPTxAddr(ENDP0,
ENDP0_TXADDR);
Clear_Status_Out(ENDP0);
SetEPRxCount(ENDP0,
Device_Property.MaxPacketSize);
SetEPRxValid(ENDP0);
SetEPType(ENDP1,
EP_INTERRUPT);
SetEPTxAddr(ENDP1,
ENDP1_TXADDR);
SetEPTxCount(ENDP1,
64);
//修改大小为64
SetEPTxStatus(ENDP1,
EP_TX_NAK);
//SetEPType(ENDP1,
ENDP1_RXADDR);
SetEPRxStatus(ENDP1,
EP_RX_VALID);
device
response
on
address
SetDeviceAddress(0);
bDeviceState
ATTACHED;
33.}<
34.<
在上面中ENDP1_RXADDR是我们新加的,需要我们在usb_conf.h中添加对于它的定义
EP1
2./*
tx
buffer
base
3.#define
ENDP1_TXADDR
(0x100)
4.#define
ENDP1_RXADDR
(0x140)<
5.<
最后我们编写对于USB输出数据的处理函数,即
EP1_OUT_Callback(void)
DataLen
USB_SIL_Read(ENDP1,kk);
//kk是个64字节的数组
if(kk[0]&
&
0x01
==
0x01)
LED(LED1,1);
else
LED(LED1,0);
0x02)
LED(LED2,1);
LED(LED2,0);
0x04
0x04)
LED(LED3,1);
LED(LED3,0);
0x08
0x08)
LED(LED4,1);
LED(LED4,0);
SetEPRxValid(ENDP1);
22.}<
23.<
在主函数中我们添加USBIN的相关操作,因为设置的是interrupt端点,所以每过10ms主机就是问询设备是否有数据要发送,我们只需要在stm32的主函数中填装数据即可。
具体的while循环中代码是
if(GetEPTxStatus(ENDP1)==EP_TX_NAK)
if(DataLen
!
=0)
USB_SIL_Write(ENDP1,kk,DataLen);
SetEPTxValid(ENDP1);
DataLen=0;
9.}<
10.<
最后的最后不要忘了在stm32f10x_it.c中添加中断处理
USB_LP_CAN1_RX0_IRQHandler(void)
USB_Istr();
4.}
5.void
USBWakeUp_IRQHandler(void)
6.{
EXTI_ClearITPendingBit(EXTI_Line18);
8.}<
9.<
至此整个移植过程就完成了,程序实现的功能是,通过电脑给USB设备发送数据,USB设备收到数据,然后再把数据发送回电脑,为了检验USB的发送与接收,使用Labview编写了一个简单的上位机。
大概就是这个样子,发送哈哈,收到哈哈。
关于上位机就在下一篇博文里写吧