基于 TinyUSB 协议栈的 CDC 虚拟串口样例工程
TinyUSB 是一个轻量级的 USB 协议栈,支持多种 USB 设备类,包括 CDC(通信设备类)虚拟串口。以下是一个基于 TinyUSB 协议栈的 CDC 虚拟串口样例工程,包括如何配置、编写代码和运行示例。环境准备
安装 TinyUSB:确保你已经下载了 TinyUSB 协议栈。你可以从 TinyUSB GitHub 仓库 获取最新版本。
工具链和 IDE:确保你已经安装了支持的编译工具链,如 ARM GCC、Keil MDK-ARM 或其他兼容的 IDE。这里以 ARM GCC 为例。
示例工程步骤
1. 创建工程结构
添加 TinyUSB 依赖
确保你已经将 TinyUSB 协议栈添加到你的项目中。例如,将 TinyUSB 的 src 文件夹添加到你的工程中。
配置 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_
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")
};
编写 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;
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) { }
配置编译和链接选项是确保你的项目正确构建的重要步骤。在使用 CMake 来配置编译和链接时,确保 TinyUSB 库的路径被正确添加并且库被链接到你的项目中。
# 设置编译选项
target_compile_options(my_project PRIVATE -std=c99 -Wall)
target_link_libraries(my_project PRIVATE tinyusb)
配置编译和链接
根据你的编译工具链和 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)
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 编译和下载
使用你的工具链编译项目并下载到 MCU。编译成功后,确保你可以通过虚拟串口与 MCU 进行通信。 总结
以上示例展示了如何基于 TinyUSB 协议栈创建一个 CDC 虚拟串口的样例工程。你可以根据需要调整和扩展此示例以适应具体的硬件和应用场景。 虚拟串口做什么用?仿真么
页:
[1]