[研电赛技术支持] GD32——虚拟串口实验(USB-CDC)

[复制链接]
8193|54
 楼主| keaibukelian 发表于 2024-12-3 12:06 | 显示全部楼层 |阅读模式
前言:使用GD32F303单片机,使用其外设USB的CDC类实现虚拟串口的收发数据,本实验主要讲USB实验如何基于一个官方的Demo,移植成自己的一个完整工程(附上源码例程)。

(理论部分后续再讲)

MCU:GD32F303CBT6

一、移植
1、准备
(1)、找到相应的路径下的usb_cdc工程,我使用的是IAR工程,所以选择EWARM文件夹下的工程文件,双击打开。

38749674e7f9db18dd.png

73931674e7f99035f4.png


(2)、打开CDC_ACM.eww工程之后再IAR里面可以看到整个工程的架构、使用到的文件,如图。

35067674e7f892bef7.png

可以看到移植USB cdc工程主要就是使用到了USBD类文件、设备文件和驱动文件这几类。GD的官方有吧USB库封装在同一个文件夹内,方便移植。

(3)、在工程右键键打开包含文件的文件夹,可以知道具体使用的是哪一个文件夹下面的文件。

63215674e7f8425585.png

可以看到主要就是使用的是《GD32F30x_usbd_library》 文件夹下面的文件

使用到的文件:

①、...\GD32F30x_Firmware_Library_V2.2.0\Firmware\GD32F30x_usbd_library\class\device\cdc

cdc_acm_core.c、cdc_acm_core.h

18880674e7f7ecb1ef.png

②、...\GD32F30x_Firmware_Library_V2.2.0\Firmware\GD32F30x_usbd_library\device

usbd_core.c、usbd_core.h

usbd_enum.c、usbd_enum.h

usbd_pwr.c、usbd_pwr.h

usbd_transc.c、usbd_transc.h

70659674e7f79483c5.png

③、...\GD32F30x_Firmware_Library_V2.2.0\Firmware\GD32F30x_usbd_library\usbd

usbd_lld_core.c、usbd_lld_core.h

usbd_lld_int.c、usbd_lld_int.h

1136674e7f743a958.png

2、复制移植为一个新工程
(1)创建一个文件夹:

将上面说到的文件移植到文件夹内

70648674e7f6e5c9d9.png

(2)、双击工程之后,需要将一下的源文件删除,然后重新加入,复制移植过路径不一样了。

59559674e7f698c522.png

(3)右键Option打开工程管理,将头文件路径重新加入,并换为相对路径的方式

27194674e7f655746a.png

34454674e7f601ad6d.png

重新加载的路径为:

6351674e7f59b792c.png

(4)、最后编译0错误就可以了

89795674e7f555bcb8.png

二、实验
1、烧录到主板吗,可以看到代码里面的主循环逻辑就是将接收到的数据再发送出来,类似与普通的串口数据收发。

48324674e7f5007444.png

21061674e7f4b520f8.png

22752674e7f46a9f88.png

2、使用串口调试助手,打开后可以显示出COM口序号,我这里是19:COM19:GD32 Virtual Com Port.(设备管理器上也可以看到),如果没看到就需要安装一下官方的虚拟串口驱动。

3、修改设备信息,在linux下看一看到虚拟串口的信息,这些信息可以修改设置:

在cdc_acm_core.c文件内:主要是修改结构体cdc_desc内的一些成员信息

92113674e7f418f1f6.png

37603674e7f3ca5097.png

(1)、其中这两项是可改的:

58722674e7f23cd8f4.png

参考:AN049_GD32_USBD_Firmware_Library_User_Guide_Rev1.0_CN.pdf

工程:GitHub - YZX-11/GD32F303-usb_cdc
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_64192009/article/details/144105311

wwppd 发表于 2024-12-7 08:21 | 显示全部楼层
硬件上需要确保USB接口的DP、DM引脚以及上拉电阻正确连接
iyoum 发表于 2024-12-9 09:45 | 显示全部楼层
在进行数据传输测试时,要从发送和接收两个方向进行验证。可以编写简单的测试程序,在 GD32 端发送一个已知的数据序列,然后在主机端(如 PC)接收并检查数据是否正确。
sdlls 发表于 2024-12-9 11:18 | 显示全部楼层
配置描述符时,注意接口层的IAD描述符、接口描述符0和接口描述符1。
IAD描述符可以不使用,但在某些情况下需要使用联合描述符。
beacherblack 发表于 2024-12-9 14:19 | 显示全部楼层
选择合适的终端仿真器软件(如Tera Term、PuTTY、RealTerm等)用于测试与调试。确保所选工具能够正确地配置为与GD32虚拟串口通信。
cashrwood 发表于 2024-12-9 17:23 | 显示全部楼层
在主循环中处理数据收发逻辑,通过调用相应的函数实现数据的接收和发送。
bestwell 发表于 2024-12-10 13:10 | 显示全部楼层
使用适当的电阻和电容来滤波和稳定电源,特别是在VBUS(USB供电)引脚上。
AloneKaven 发表于 2024-12-10 13:15 | 显示全部楼层
虚拟的串口是不是波特率设置多少都能显示?
pl202 发表于 2024-12-10 13:42 | 显示全部楼层
在接收函数中,代码的顺序非常重要,错误的顺序可能导致接收失败。
wilhelmina2 发表于 2024-12-10 14:15 | 显示全部楼层
实现高效的数据接收和发送机制。使用环形缓冲区可以有效地管理传入和传出的数据流,避免数据丢失。
plsbackup 发表于 2024-12-10 19:15 | 显示全部楼层
USB设备的时钟通常是固定的48MHz,因此需要根据外部晶振的频率进行适当的分频和配置。
dspmana 发表于 2024-12-10 19:39 | 显示全部楼层
在实现USB虚拟串口时,可能需要对性能进行优化,包括减少延迟、提高数据吞吐量等。这可能涉及到对USB堆栈的优化和硬件资源的合理分配。
modesty3jonah 发表于 2024-12-11 16:23 | 显示全部楼层
管理好发送和接收缓冲区,确保数据的正确传输和不会发生溢出。
rosemoore 发表于 2024-12-11 17:52 | 显示全部楼层
USB虚拟串口涉及到中断处理,因此需要确保中断服务程序正确配置和实现 。这包括USB的枚举过程、数据收发等中断。
pmp 发表于 2024-12-11 18:51 | 显示全部楼层
在应用程序中调用适当的API来初始化USB模块,并允许其完成枚举过程。这是主机识别和配置USB设备的过程。
mollylawrence 发表于 2024-12-11 20:38 | 显示全部楼层
要注意 USB 接口的电源引脚(VBus)和地引脚(GND)的连接,防止短路或虚接情况。如果 VBus 电源供应不稳定,可能会导致设备识别问题或者通信中断。
pmp 发表于 2024-12-11 21:05 | 显示全部楼层
参考GD32官方提供的USB-CDC示例代码,这有助于理解配置过程和中断处理。
cashrwood 发表于 2024-12-11 21:33 | 显示全部楼层
特别是在接收数据时,注意代码的执行顺序,避免因顺序错误导致数据接收失败。
sanfuzi 发表于 2024-12-11 22:01 | 显示全部楼层
CDC(通信设备类)设备需要处理一些设备类专用请求,如SET_LINE_CODING、GET_LINE_CODING、SET_CONTROL_LINE_STATE等。这些请求的处理需要在设备的固件中实现
kkzz 发表于 2024-12-12 10:39 | 显示全部楼层
注意CDC的发送和接收函数可能会遇到64字节限制的问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

103

主题

4350

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部