当前位置: 首页 > article >正文

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); // 发送数据
        }
    }
}

注意事项

  1. USB描述符:确保USB描述符正确配置,支持CDC类。

  2. 中断处理:确保USB中断优先级配置合理,避免影响其他任务。

  3. 调试工具:使用串口调试助手或PC端的串口工具(如PuTTY、Tera Term)测试虚拟串口通信


http://www.kler.cn/a/521170.html

相关文章:

  • C基础寒假练习(4)
  • Android BitmapShader简洁实现马赛克/高斯模糊(毛玻璃),Kotlin(三)
  • 【Super Tilemap Editor使用详解】(十七):常见问题解答(FAQ)
  • MySQL 基础学习(3):排序查询和条件查询
  • MOS的体二极管能通多大电流
  • docker 部署 java 项目详解
  • Day40:列表的排序
  • python 变量范围的定义与用法
  • 汽车网络信息安全-ISO/SAE 21434解析(中)
  • 拖拽移动(Semi Design)
  • 《一起做很甜的梦!》
  • sqlite3 学习笔记
  • 数据分箱 baggingboosting onehot独热编码 woe编码 sklearn的ensemble(集成学习)
  • python:taichi 高性能可视化 Demo 展览
  • 基于SpringBoot的母婴护理知识共享管理系统
  • 代码随想录算法【Day32】
  • Go中的Context(上下文)
  • ESP8266基于WiFiManager设置页面添加参数并且掉电不丢失
  • GIT管理指令
  • Object类(1)
  • Qt Enter和HoverEnter事件
  • 硬件学习笔记--36 TTL、RS232、RS485相关介绍
  • Linux相关概念和易错知识点(26)(命名管道、共享内存)
  • PostGIS笔记:PostgreSQL 数据库与用户 基础操作
  • 使用ensp进行ppp协议综合实验
  • API接口开发淘宝商品数据一键解析获取商品信息编写