移植STM32固件库用于HID双向通信Word文档格式.docx

上传人:b****5 文档编号:18836848 上传时间:2023-01-01 格式:DOCX 页数:12 大小:142.40KB
下载 相关 举报
移植STM32固件库用于HID双向通信Word文档格式.docx_第1页
第1页 / 共12页
移植STM32固件库用于HID双向通信Word文档格式.docx_第2页
第2页 / 共12页
移植STM32固件库用于HID双向通信Word文档格式.docx_第3页
第3页 / 共12页
移植STM32固件库用于HID双向通信Word文档格式.docx_第4页
第4页 / 共12页
移植STM32固件库用于HID双向通信Word文档格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

移植STM32固件库用于HID双向通信Word文档格式.docx

《移植STM32固件库用于HID双向通信Word文档格式.docx》由会员分享,可在线阅读,更多相关《移植STM32固件库用于HID双向通信Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。

移植STM32固件库用于HID双向通信Word文档格式.docx

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:

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 

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编写了一个简单的上位机。

大概就是这个样子,发送哈哈,收到哈哈。

关于上位机就在下一篇博文里写吧

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 商业计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1