GD32F470 USB虚拟串口
1. 硬件连接
确保GD32F470开发板的USB接口连接到PC的USB端口。开发板通常提供USB FS(全速)接口,可以直接使用。
2. 配置USB功能
需要配置USB时钟、GPIO和中断,以支持全速USB设备模式。
2.1 配置USB时钟
c复制
void usb_rcu_config(void) {
rcu_periph_clock_enable(RCU_USBFS); // 启用USBFS时钟
rcu_usb_clock_config(RCU_CKUSB_CKPLL_DIV1); // 配置USB时钟源
}
2.2 配置GPIO
c复制
void usb_gpio_config(void) {
rcu_periph_clock_enable(RCU_GPIOA);
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11 | GPIO_PIN_12);
gpio_af_set(GPIOA, GPIO_AF_10, GPIO_PIN_11 | GPIO_PIN_12);
}
2.3 配置中断
c复制
void usb_intr_config(void) {
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
nvic_irq_enable(USBFS_IRQn, 2, 0); // 启用USBFS中断
}
3. 初始化USB设备
使用GD32的USB库初始化USB设备功能,配置为CDC类。
c复制
#include "usbd_cdc.h"
usb_core_driver usb_dev;
void usb_device_init(void) {
usb_rcu_config();
usb_gpio_config();
usb_intr_config();
usbd_init(&usb_dev, USB_CORE_ENUM_FS, &usb_cdc_desc, &usbd_cdc_cb); // 初始化USB设备
usbd_connect(&usb_dev); // 连接USB设备
}
4. 数据传输
实现数据接收和发送功能。CDC类提供了标准的发送和接收函数。
数据发送
c复制
void CDC_Transmit(uint8_t *buf, uint32_t len) {
usbd_cdc_data_send(&usb_dev, buf, len); // 使用USB CDC发送数据
}
数据接收回调
c复制
void CDC_ReceiveCallback(uint8_t *buf, uint32_t len) {
// 处理接收到的数据
printf("Received: %s\n", buf);
}
5. 主循环
在主循环中,等待USB设备枚举完成,并处理数据传输。
c复制
int main(void) {
usb_device_init();
while (1) {
if (usb_dev.dev.cur_status == USBD_CONFIGURED) {
// USB设备已配置完成,可以进行数据传输
uint8_t data[] = "Hello from GD32F470!";
CDC_Transmit(data, sizeof(data) - 1); // 发送数据
}
}
}
注意事项
-
USB描述符:确保USB描述符正确配置,支持CDC类。
-
中断处理:确保USB中断优先级配置合理,避免影响其他任务。
-
调试工具:使用串口调试助手或PC端的串口工具(如PuTTY、Tera Term)测试虚拟串口通信