打印
[MM32硬件]

基于 TinyUSB 协议栈的 CDC 虚拟串口样例工程

[复制链接]
1029|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tiny, dc, USB, TI, CD
TinyUSB 是一个轻量级的 USB 协议栈,支持多种 USB 设备类,包括 CDC(通信设备类)虚拟串口。以下是一个基于 TinyUSB 协议栈的 CDC 虚拟串口样例工程,包括如何配置、编写代码和运行示例。

环境准备
安装 TinyUSB:确保你已经下载了 TinyUSB 协议栈。你可以从 TinyUSB GitHub 仓库 获取最新版本。

工具链和 IDE:确保你已经安装了支持的编译工具链,如 ARM GCC、Keil MDK-ARM 或其他兼容的 IDE。这里以 ARM GCC 为例。

示例工程步骤
1. 创建工程结构




添加 TinyUSB 依赖
确保你已经将 TinyUSB 协议栈添加到你的项目中。例如,将 TinyUSB 的 src 文件夹添加到你的工程中。


使用特权

评论回复
沙发
米多0036|  楼主 | 2024-7-22 15:59 | 只看该作者
配置 USB 描述符
你需要定义 USB 设备的描述符。以下是一个简单的 usb_descriptors.c 和 usb_descriptors.h 文件示例:

usb_descriptors.h

c

#ifndef _USB_DESCRIPTORS_H_
#define _USB_DESCRIPTORS_H_

#include "tusb.h"

// CDC 设备描述符
#define USB_DESC_LENGTH        18
#define USB_DESC_TYPE          0x01
#define USB_DESC_SUBTYPE       0x02

// 配置描述符
#define CONFIG_DESC_TOTAL_LEN  (TUD_CDC_DESC_LEN + TUD_CONFIG_DESC_LEN)
#define CONFIG_DESC_TYPE       0x02

// CDC 设备描述符定义
#define CDC_DESC_TYPE          0x24
#define CDC_DESC_SUBTYPE       0x01

// Function prototypes
extern uint8_t const desc_device[];
extern uint8_t const desc_configuration[];
extern uint8_t const desc_string[];

#endif // _USB_DESCRIPTORS_H_

使用特权

评论回复
板凳
米多0036|  楼主 | 2024-7-22 15:59 | 只看该作者
usb_descriptors.c

c

#include "usb_descriptors.h"

// 设备描述符
uint8_t const desc_device[] =
{
    TUD_DESC_DEVICE(0x0200, TUSB_DESC_DEVICE, 0, 0, 0, 0, 64, 0x04D8, 0x0002, 0x0100, 1, 2, 0x01, 0x02)
};

// 配置描述符
uint8_t const desc_configuration[] =
{
    TUD_DESC_CONFIGURATION(0, 1, 0, 0, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 250),
    TUD_DESC_CDC_ACM(0, 0, 0, 1, 0, 0),
    TUD_DESC_CDC_DATA(1, 0),
};

// 字符串描述符
uint8_t const desc_string[] =
{
    TUD_DESC_STRING(0, "TinyUSB CDC Example")
};

使用特权

评论回复
地板
米多0036|  楼主 | 2024-7-22 16:00 | 只看该作者
编写 main.c 文件
编写主程序以初始化 USB 和 TinyUSB,并处理 CDC 数据:

main.c

c
#include "tusb.h"
#include "usb_descriptors.h"

void cdc_task(void);
void tud_mount_cb(void);
void tud_umount_cb(void);
void tud_suspend_cb(bool remote_wake_enabled);
void tud_resume_cb(void);
void tud_cdc_rx_complete_cb(uint8_t itf);

int main(void) {
    // 初始化硬件
    board_init();
   
    // 初始化 TinyUSB
    tusb_init();
   
    while (1) {
        tud_task();  // TinyUSB 任务处理
        cdc_task();  // 自定义 CDC 任务处理
    }
}

// CDC 任务处理
void cdc_task(void) {
    if (tud_cdc_connected()) {
        if (tud_cdc_available()) {
            uint8_t buf[64];
            uint32_t count = tud_cdc_read(buf, sizeof(buf));
            tud_cdc_write(buf, count);
        }
    }
}

// TinyUSB 回调
void tud_mount_cb(void) { }
void tud_umount_cb(void) { }
void tud_suspend_cb(bool remote_wake_enabled) { }
void tud_resume_cb(void) { }
void tud_cdc_rx_complete_cb(uint8_t itf) { }

使用特权

评论回复
5
米多0036|  楼主 | 2024-7-22 16:00 | 只看该作者
配置编译和链接选项是确保你的项目正确构建的重要步骤。在使用 CMake 来配置编译和链接时,确保 TinyUSB 库的路径被正确添加并且库被链接到你的项目中。
# 设置编译选项
target_compile_options(my_project PRIVATE -std=c99 -Wall)
target_link_libraries(my_project PRIVATE tinyusb)

使用特权

评论回复
6
米多0036|  楼主 | 2024-7-22 16:00 | 只看该作者
配置编译和链接
根据你的编译工具链和 IDE,配置编译和链接选项。确保添加 TinyUSB 库的路径和链接 TinyUSB 库。

CMakeLists.txt(如果使用 CMake)

cmake

cmake_minimum_required(VERSION 3.5)
project(my_project)

# 添加源代码和库
add_executable(my_project
    src/main.c
    src/usb_descriptors.c
    src/tinyusb/adafruit/*.c
)

# 设置编译选项
target_compile_options(my_project PRIVATE -std=c99 -Wall)
target_link_libraries(my_project PRIVATE tinyusb)

使用特权

评论回复
7
米多0036|  楼主 | 2024-7-22 16:07 | 只看该作者
Makefile(如果使用 Makefile)

makefile
复制代码
CC = arm-none-eabi-gcc
CFLAGS = -I./src -I./src/tinyusb -std=c99 -Wall
LDFLAGS = -L./lib -ltinyusb

SRC = src/main.c src/usb_descriptors.c src/tinyusb/adafruit/*.c
OBJ = $(SRC:.c=.o)

all: my_project

my_project: $(OBJ)
        $(CC) -o $@ $(OBJ) $(LDFLAGS)

clean:
        rm -f $(OBJ) my_project

使用特权

评论回复
8
米多0036|  楼主 | 2024-7-22 16:07 | 只看该作者
编译和下载
使用你的工具链编译项目并下载到 MCU。编译成功后,确保你可以通过虚拟串口与 MCU 进行通信。

使用特权

评论回复
9
米多0036|  楼主 | 2024-7-22 16:07 | 只看该作者
总结
以上示例展示了如何基于 TinyUSB 协议栈创建一个 CDC 虚拟串口的样例工程。你可以根据需要调整和扩展此示例以适应具体的硬件和应用场景。

使用特权

评论回复
10
地瓜patch| | 2024-7-30 22:00 | 只看该作者
虚拟串口做什么用?仿真么

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

98

主题

1336

帖子

0

粉丝