1. 课程导入与开发环境搭建

emUSB 是 SEGGER 面向嵌入式 USB 设备端推出的协议栈产品族,通常分为 emUSB-Device(设备侧协议栈)与 emUSB-Host(主机侧协议栈)两条产品线。本课程聚焦设备侧,即让目标板以 USB 设备身份被 PC 或主机识别,并按需枚举成 CDC、HID、MSC、Audio、RNDIS/ECM 等标准类设备,或通过自定义类实现厂商私有协议。理解它的定位,关键要抓住三点:第一,它把 USB 协议中繁琐的枚举、端点管理、描述符组织、类请求处理封装成可配置的中间件;第二,它不绑定单一 RTOS,可运行在裸机、FreeRTOS、embOS 等环境;第三,它与 SEGGER 的调试工具链、Embedded Studio 工程体系配合紧密,能显著缩短从"插上板子"到"设备被识别"的时间。

从典型应用场景看,emUSB-Device 常见于以下几类产品:工业数据采集器通过 CDC-ACM 虚拟串口向 PC 回传采样数据;医疗或测量设备用 HID 上报按键与传感器状态;数据记录仪用 MSC 把内部 Flash 或 SD 卡暴露为 U 盘;音频设备用 UAC 实现录音与播放;带网口的设备用 RNDIS/ECM 让 PC 通过 USB 访问其网络服务。这些场景的共同点是:开发者真正要写的是"业务数据怎么进出端点",而不是"SETUP 包怎么解析"。

要开始动手,先准备三样东西:安装 SEGGER Embedded Studio(下称 SES),准备 J-Link 调试器(或板载 J-Link OB),以及一块带 USB Device 外设的目标评估板。以常见的 Cortex-M4 评估板为例,硬件连接关系如下:PC 通过 USB 线连接 J-Link,J-Link 的 SWDIO/SWCLK/GND/VTref 接目标板调试口;目标板的 USB Device 口(如 micro-USB 或 Type-C)单独用一根线接 PC 的另一个 USB 口,用于实际枚举与通信。注意调试口与设备口是两条独立链路,不要混接。

emUSB-Device 开发环境连接拓扑 PC / 开发主机 SEGGER Embedded Studio J-Link 驱动 + USB 驱动 串口/终端工具 J-Link 调试器 SWDIO / SWCLK GND / VTref 下载与在线调试 目标评估板 MCU + USB Device 外设 D+ / D- / VBUS / GND 运行 emUSB-Device USB Device 数据链路(枚举 / 端点通信) 要点:调试链路(SWD)与设备链路(USB D+/D-)相互独立;VTref 用于电平参考,务必共地。

环境搭好后,创建第一个 emUSB 工程。推荐流程是:打开 SES,选择 File → New Project,在模板列表中定位到 SEGGER 提供的 emUSB-Device 示例(不同版本路径可能为 "SEGGER → emUSB-Device" 或通过 Package Manager 安装 emUSB 包后出现)。选择与评估板 MCU 型号匹配的示例,例如 "emUSB_Device_CDC" 或 "USB_Device_CDC_Echo"。工程创建后,SES 会自动带入 emUSB 源码、RTOS 适配层(若使用 embOS)、板级支持文件与链接脚本。

接下来需要确认几个关键配置项,它们直接决定设备能否被正确枚举。第一是 USB 描述符中的 VID/PID:SEGGER 示例通常使用 0x1366 作为 VID,PID 依示例而定;正式产品必须替换为自己的 VID/PID,否则可能与其它设备冲突。第二是端点配置:CDC-ACM 至少需要 1 个控制端点(EP0,固定)、1 个中断 IN 端点(通知)和 1 对批量端点(数据收发),示例中常见配置为 EP1 IN 中断、EP2 IN/OUT 批量。第三是时钟:USB 外设需要 48MHz 时钟,若使用外部晶振,需在时钟初始化代码中确认 PLL 配置正确,否则会出现枚举失败或通信不稳定。

编译前,在 Project → Options 中检查 J-Link 连接设置:Target Interface 选 SWD,Speed 可先设为 4000 kHz,若连接不稳定再降到 1000 kHz。点击 Build(F7)编译,若无错误,点击 Debug → Download & Debug(F5)下载并进入调试。此时观察目标板 USB 口插入 PC 后,设备管理器中应出现新的 COM 端口(CDC 示例)或 HID 设备。若未出现,先检查 VBUS 是否供电、D+ 上拉是否使能、时钟是否正常。

验证通信是否正常,可用串口终端打开新增的 COM 口,波特率对 CDC-ACM 通常无实际意义(因为是 USB 虚拟串口),但终端工具仍要求填写,可填 115200。向设备发送字符,若示例为 Echo 程序,应能收到相同字符回显。这一步成功,说明从描述符、枚举、端点配置到数据收发的整条链路已经打通。后续章节将在此基础上逐步深入:先理解 emUSB 的初始化与任务模型,再学习如何添加自定义类、优化吞吐量、处理错误与热插拔。

首次下载若提示 "Cannot connect to J-Link",优先检查 J-Link 是否被其它软件占用、目标板是否上电、SWD 线序是否正确。SES 中可通过 Target → Connect 单独测试连接,再执行下载。

为便于快速核对,下面给出本节关键检查项,可在实际搭建时逐条确认:

检查项预期状态异常时的排查方向
J-Link 连接SES 可识别并下载SWD 线序、供电、驱动版本
USB 设备口插入PC 出现新设备VBUS、D+ 上拉、48MHz 时钟
VID/PID与示例或产品定义一致描述符文件、冲突设备
端点配置与类需求匹配EP 数量、方向、类型
数据回显发送字符可收到相同字符端点读写、缓冲区、任务调度

完成以上步骤后,你已经拥有一个可运行、可调试、可通信的 emUSB-Device 基础工程。它既是后续所有实验的起点,也是排查问题时回归的"最小可用系统"。建议在此时对工程做一次备份,并记录下当前使用的 SES 版本、emUSB 版本、J-Link 固件版本与评估板型号,这些信息在后续遇到兼容性问题时会非常有用。