CH573、CH582、CH592、CH585 USBFS HID增加CDC功能_用于输出LOG调试

USB CDC(Communications Device Class) 是一种让 USB 设备模拟传统串口(COM口)的标准协议,其中 CDC-ACM 子类最常用于虚拟串口通信。它结合了 USB 的高速、即插即用优势与串口的简单易用性,广泛应用于嵌入式调试、数据采集等场景。

在开发WCH蓝牙系列芯片时,难免会遇到需要DEBUG的场景,这时如果未引出串口引脚,或者串口资源紧张(无IO可用)时,可备选该方式进行处理;

在使用了USB外设的应用中,调试阶段可暂时牺牲两个USB接口+两个USB IN端点,增加一组CDC设备描述符即可;

 

本篇测试程序基于CH585,链接可自取:

通过网盘分享的文件:CH585EXAM_USBFS_CDC+HID.zip
链接: https://pan.baidu.com/s/1gx3jpCDngSnPN48v-k79cQ?pwd=yqr8 提取码: yqr8

 

一、修改配置描述符:

整个描述符分为 4 大部分:

1、配置描述符:总配置信息

2、IAD 描述符:声明 CDC 复合接口组

3、CDC 接口组(接口 0 + 接口 1):虚拟串口功能

4、HID 接口(接口 2):人机交互设备功能

/* Configuration Descriptor (FS) */
const uint8_t  MyCfgDescr[ ] =
{
    /* Configure descriptor */
    0x09, 0x02, 0x6B, 0x00, 0x03, 0x01, 0x00, 0x80, 0x32,

    /* IAD Descriptor(interface 0/1)*/
    0x08, 0x0B, 0x00, 0x02, 0x02, 0x02, 0x01, 0x00,

    /* Interface 0 (CDC) descriptor */
    0x09, 0x04, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01,  0x00,

    /* Functional Descriptors */
    0x05, 0x24, 0x00, 0x10, 0x01,

    /* Length/management descriptor (data class interface 1) */
    0x05, 0x24, 0x01, 0x00, 0x01,
    0x04, 0x24, 0x02, 0x02,
    0x05, 0x24, 0x06, 0x00, 0x01,

    /* Interrupt upload endpoint descriptor */
    0x07, 0x05, 0x81, 0x03, (uint8_t)DevEP1SIZE, (uint8_t)( DevEP1SIZE >> 8 ), 0x01,

    /* Interface 1 (data interface) descriptor */
    0x09, 0x04, 0x01, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x00,

    /* Endpoint descriptor */
    0x07, 0x05, 0x02, 0x02, (uint8_t)DevEP2SIZE, (uint8_t)( DevEP2SIZE >> 8 ), 0x00,

    /* Endpoint descriptor */
    0x07, 0x05, 0x82, 0x02, (uint8_t)DevEP2SIZE, (uint8_t)( DevEP2SIZE >> 8 ), 0x00,

    /* interface 2 (HID interface) descriptor */
    0x09, 0x04, 0x02, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00,

    /* interface 2 HID descriptor */
    0x09, 0x21, 0x00, 0x01, 0x00, 0x01, 0x22, (uint8_t)sizeof(HIDDescr), (uint8_t )( sizeof(HIDDescr)>>8),

    /* interface 2 endpoint descriptor*/
    0x07, 0x05, 0x83, 0x03, (uint8_t)DevEP3SIZE, (uint8_t)( DevEP3SIZE >> 8 ), 0x01,

    /* interface 2 endpoint descriptor */
    0x07, 0x05, 0x03, 0x03, (uint8_t)DevEP3SIZE, (uint8_t)( DevEP3SIZE >> 8 ), 0x01,
};

总结如下图:

image

 

二、修改完毕后,枚举即可正常进行,bushound和串口均可以枚举到相应COM,例如下图COM21

imageimage

 

三、由于USB FS的从机例程中并没有加入有关CDC设备的枚举处理,需要修改中断处理才可以接受主机的打开请求,可在下图260、264、268行位置增加命令响应,避免进入default判断后回复stall

image

 

 四、程序修改完毕后,即可成功通过串口工具打开COM,抓包如图

image

 

五、定义CDC上报函数

/*********************************************************************
 * @fn      CDCReport
 *
 * @brief   上报CDC数据
 *
 * @return  0:成功
 *          1:出错
 */
 __HIGH_CODE
void CDCReport(uint8_t* data ,uint8_t len)
{
    memcpy(pEP2_IN_DataBuf, data, len);
    DevEP2_IN_Deal(len);
}

 

六、封装USB CDC打印函数

/**
 * @brief  CDC 发送字符串(日志专用)
 * @param  str: 要打印的字符串
 */
__HIGH_CODE
void CDC_Log(const char* str) {
    if (str == NULL) return;

    uint16_t len = strlen(str);
    CDCReport((uint8_t*)str,len);
}

#define LOG_BUF_SIZE 256
uint8_t log_buf[LOG_BUF_SIZE];
__HIGH_CODE
void USB_DEBUG(const char* fmt, ...) {
    va_list args;
    va_start(args, fmt);
    vsnprintf((char*)log_buf, LOG_BUF_SIZE, fmt, args);
    va_end(args);

    CDC_Log((char*)log_buf);
}

 

七、主循环调用测试

image

 

 

八、测试结果

image

 

 

posted @ 2026-04-17 17:10  oTvTo  阅读(42)  评论(0)    收藏  举报