您的位置 首页 被动

STM32的USB例程修正过程

以下是笔者将ST的Custom_HID例程修改为自定义USB设备例程时总结出来的,因为笔者也是刚刚学USB开发不久,某些方面理解错误在所难免,请各位

以下是笔者将ST的Custom_HID例程修正为“自界说USB设备”例程时总结出来的,由于笔者也是刚刚学USB开发不久,某些方面了解过错在所难免,请各位大虾纠正。

一、usb_desc.c文件

依据你程序运用的通讯方法修正。usb_desc.h文件中界说要依据usb_desc.c文件中的数组的巨细;ConfigDescriptor[SIZ_CONFIG_DESC]下添加需求处理的端点;依据需求添加或删去陈述描述符(首要用于HID)和CDC接口描述符(首要用于完结USB转串口)等。具体方法能够下载个“电脑圈圈”运用D12编写的比如。

二、Usb_conf.h文件:

1、修正需求处理那些中止

CNTR_CTRM 处理数据正确传输后操控,比如说呼应主机

CNTR_DOVRM

CNTR_ERRM

CNTR_WKUPM 0

CNTR_SUSPM

CNTR_RESETM 首要处理USB复位后进行一些初始化使命

CNTR_SOFM

CNTR_ESOFM

如:

usb_conf.h中的#define IMR_MSK (CNTR_CTRM | CNTR_SOFM | CNTR_RESETM )是决议USB_CNTR寄存器中的那个USB相关中止发动仍是屏蔽。

2、依据需求添加端点缓存地址,要依据缓存区的地址修正,避免数据堆叠

如下为依据每个缓冲区的巨细为64字节修正:

#define ENDP1_TXADDR (0xC0)

#define ENDP1_RXADDR (0xD0)

#define ENDP2_TXADDR (0x100)

#define ENDP2_RXADDR (0x140)

#define ENDP3_TXADDR (0x180)

#define ENDP3_RXADDR (0x1C0)

3、修正下的EPX_IN_Callback和EPX_OUT_Callback。注释掉需求处理的函数。NOP_Process表明不处理。

三usb_prop.c文件

1、修正void XX_Reset(void)(如:void Joystick_Reset(void))

一般的不必修正,如下为举例阐明端点1的初始化,其他端口原理相同。

SetEPType(ENDP1, EP_INTERRUPT);//设置端点1类型

SetEPTxAddr(ENDP1, ENDP1_TXADDR); //设置端点1缓冲区基地址

SetEPTxCount(ENDP1, 64);// 装备Tx 缓冲计数器

SetEPRxStatus(ENDP1, EP_RX_DIS);// //设置端点接纳封闭

SetEPTxStatus(ENDP1, EP_TX_NAK);// //设置端点1发送不应对

2、删去不相干的描述符等。

如自界说的USB设备就不需求以下结构体初始化:

ONE_DESCRIPTOR Joystick_Report_Descriptor

ONE_DESCRIPTOR Mouse_Hid_Descriptor

3、修正RESULT XX_Data_Setup(u8 RequestNo)的数据类恳求处理。

如Custom_HID例程修正为“自界说USB设备”例程时能够将以下代码删去

if ((RequestNo == GET_DESCRIPTOR)

&& (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))

&& (pInformation->USBwIndex0 == 0))

{

if (pInformation->USBwValue1 == REPORT_DESCRIPTOR)

{

CopyRoutine = Joystick_GetReportDescriptor;

}

else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE)

{

CopyRoutine = Joystick_GetHIDDescriptor;

}

}

4、删去不相干的取得描述符回来函数

如自界说的USB设备就不需求以下函数:

Joystick_GetReportDescriptor

Joystick_GetHIDDescriptor

四、usb_endp.c文件

1、添加之前界说的中止数据处理函数

如:

void EP1_OUT_Callback(void)

{

这些写接纳代码

}

五、数据发送和接纳,举例阐明

1、数据接纳

u8 DataLen;

DataLen = GetEPRxCount(ENDP1);

PMAToUserBufferCopy(TX1_buffer, ENDP1_RXADDR, DataLen);

SetEPRxValid(ENDP1);

USART1_Send(DataLen);

count_out = 1;

2、数据发送

UserToPMABufferCopy(InBuffer, GetEPTxAddr(ENDP1), 64);

SetEPTxCount(ENDP1, 64);

SetEPTxValid(ENDP1);

假如你发送数据较为频频,每次发送前应运用GetEPTxStatus(ENDP1)检测前次发送是否完结。假如端点状况处于EP_TX_VALID,阐明发送未完毕,假如端点状况处于EP_TX_NAK,阐明发送完毕。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/259849.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部