默认已经建立好需要移植的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);
最后是测试结果
接收测试:
发送测试:文章来源:https://www.toymoban.com/news/detail-408044.html
文章来源地址https://www.toymoban.com/news/detail-408044.html
到了这里,关于GD32F303基于USBD库的usb custom hid 双向通讯实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!