实现双向通讯的基于USBD库的USB Custom HID应用程序:GD32F303

默认已经建立好需要移植的GD32F303空白工程

环境:keil  

GD库版本:V2.1.4

通讯工具:

链接:https://pan.baidu.com/s/1Ukuy0u52C9ufPGz9QcHONA 
提取码:d9rf


正文开始

USBD库植步骤:

找到GD官网的软件包

本文中用的是GD32F30x_Firmware_Library_V2.1.4

将Firmware\GD32F30x_usbd_library 文件夹全部拷贝至工程目录

然后添加C文件,参考官方customhid demo 是这样

 添加H文件路径

 需要在官方customhid demo找到这俩两个头文件,加到自己工程里

这俩文件随意放,我是放在自己的inc文件夹里,这俩文件是关于USB参数配置,硬件配置。

需要去掉#inlcude "gd32f303e_eval.h"这句

以上移植完成,编译没报错就算成功了


 接下来是修改USBD库,实现双向通讯。官方的demo是拿来做键盘用,比较固定,我们需要实现的是类似串口的随意收发。

找到custom_hid_core.c文件里这个数组,修改USB报文

改成下面这个,里面rev_len send_len是我自己定义的宏定义,这个代表单次收发长度(长度8的倍数,其他没验证成功)

const uint8_t customhid_report_descriptor[DESC_LEN_REPORT] =
{
  /* USER CODE BEGIN 0 */
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x00,                    // USAGE (Undefined)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x09, 0x00,                    //   USAGE (Undefined)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x95, 0x08,                    //   REPORT_COUNT (64)
    0x75, rev_len,                    //   REPORT_SIZE (8)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x09, 0x00,                    //   USAGE (Undefined)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x95, send_len,                    //   REPORT_COUNT (64)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)
  /* USER CODE END 0 */
  	0xC0    /*     END_COLLECTION	             */
};

然后找到usbd_conf.h 文件,将下面两个宏定义改为需要收发的长度,本文中收发长度都是8


	#define CUSTOMHID_IN_PACKET                8U
	#define CUSTOMHID_OUT_PACKET               8U   

报文和收发长度设置基本上就改好了,下面是实现收发的具体代码

1、首先在main函数中添加USBD初始化部分

    /* system clocks configuration */
    rcu_config();       //配置USB时钟

    /* GPIO configuration */
    gpio_config();       //PULL引脚配置

    //custom_hid_itfop_register(&usbd_custom_hid, &fop_handler);    //这部分是官方代码,用不着

    /* USB device configuration */
    usbd_init(&usbd_custom_hid, &custom_hid_desc, &custom_hid_class);

    /* NVIC configuration */
    nvic_config();

    /* enabled USB pull-up */
    usbd_connect(&usbd_custom_hid);

    while (USBD_CONFIGURED != usbd_custom_hid.cur_status) {
        /* wait for standard USB enumeration is finished */
    }

2、在 gd32f30x_it.c中添加USBD的中断回调函数=

void USBD_LP_CAN0_RX0_IRQHandler (void)
{
    usbd_isr();
}

 3、接收部分:在custom_hid_core.c文件里找到custom_hid_data_out函数,去掉官方的代码,改成如下rev_len为长度宏定义,rev_buf为接收缓存,这里有一个转移过程,可以改成自己的接收处理函数

static void custom_hid_data_out (usb_dev *udev, uint8_t ep_num)
{
    int i=0;
    custom_hid_handler *hid = (custom_hid_handler *)udev->class_data[CUSTOM_HID_INTERFACE];

    if (CUSTOMHID_OUT_EP == ep_num){

        usbd_ep_recev(udev, CUSTOMHID_OUT_EP, hid->data, rev_len);              
         for(i=0;i<rev_len;i++)
        {
            rev_buf[i]=hid->data[i];
        }
    }
}

4、发送部分:比较简单就不多说了

 custom_hid_report_send (&usbd_custom_hid, Send_Buffer1, 8);

最后是测试结果

接收测试:

发送测试:

 

物联沃分享整理
物联沃-IOTWORD物联网 » 实现双向通讯的基于USBD库的USB Custom HID应用程序:GD32F303

发表评论