前言使用GD32F303单片机使用其外设USB的CDC类实现虚拟串口的收发数据本实验主要讲USB实验如何基于一个官方的Demo移植成自己的一个完整工程附上源码例程。理论部分后续再讲MCUGD32F303CBT6一、移植1、准备1、找到相应的路径下的usb_cdc工程我使用的是IAR工程所以选择EWARM文件夹下的工程文件双击打开。2、打开CDC_ACM.eww工程之后再IAR里面可以看到整个工程的架构、使用到的文件如图。可以看到移植USB cdc工程主要就是使用到了USBD类文件、设备文件和驱动文件这几类。GD的官方有吧USB库封装在同一个文件夹内方便移植。3、在工程右键键打开包含文件的文件夹可以知道具体使用的是哪一个文件夹下面的文件。可以看到主要就是使用的是《GD32F30x_usbd_library》文件夹下面的文件使用到的文件①、...\GD32F30x_Firmware_Library_V2.2.0\Firmware\GD32F30x_usbd_library\class\device\cdccdc_acm_core.c、cdc_acm_core.h②、...\GD32F30x_Firmware_Library_V2.2.0\Firmware\GD32F30x_usbd_library\deviceusbd_core.c、usbd_core.husbd_enum.c、usbd_enum.husbd_pwr.c、usbd_pwr.husbd_transc.c、usbd_transc.h③、...\GD32F30x_Firmware_Library_V2.2.0\Firmware\GD32F30x_usbd_library\usbdusbd_lld_core.c、usbd_lld_core.husbd_lld_int.c、usbd_lld_int.h2、复制移植为一个新工程1创建一个文件夹将上面说到的文件移植到文件夹内2、双击工程之后需要将一下的源文件删除然后重新加入复制移植过路径不一样了。3右键Option打开工程管理将头文件路径重新加入并换为相对路径的方式重新加载的路径为4、最后编译0错误就可以了二、实验1、烧录到主板吗可以看到代码里面的主循环逻辑就是将接收到的数据再发送出来类似与普通的串口数据收发。2、使用串口调试助手打开后可以显示出COM口序号我这里是19COM19:GD32 Virtual Com Port.设备管理器上也可以看到如果没看到就需要安装一下官方的虚拟串口驱动。3、修改设备信息在linux下看一看到虚拟串口的信息这些信息可以修改设置在cdc_acm_core.c文件内主要是修改结构体cdc_desc内的一些成员信息1、其中这两项是可改的三、USBD寄存器这里只介绍两个寄存器一个是控制寄存器USBD控制寄存器(USBD_CTL)、另一个是状态寄存器USBD状态寄存器(USBD_STAT)。当我们初始化完下载程序到主板之后遇到USB CDC的端口信息没有在串口调试助手上显示时这个时候我们就需要去看看USBD的相关寄存器了看是软件这边没有调整好还是硬件D、D-方面的问题。一般情况下D/DP引脚是需要接入一个上拉电阻1.5KΩ的否则会出现检测不到CDC端口的情况。https://yuanbao.tencent.com/bot/app/share/chat/5Xfj2iJKt9ow1、USBD控制寄存器(USBD_CTL)这里我们重点关注位1 CLOSE关闭状态可以知道的是USB CDC或其他USB设备被成功初始化之后这个位是要被置0的。这个位就可以判断我们是否成功初始化USB CDC。2、USBD状态寄存器(USBD_STAT)位15RX_DP和位14RX_DM可以看到当前的D和D-引脚状态正常情况下D是高电平、D-是低电平LOCK也可以用于判断是否连接上USB线如下图所示综上如果正常初始化完串口调试助手上还是没有显示端口信息可以查看这两个寄存器的相应位状态进行判断是硬件问题还是软件问题参考AN049_GD32_USBD_Firmware_Library_User_Guide_Rev1.0_CN.pdf工程GitHub - YZX-11/GD32F303-usb_cdc