在MCU项目开发过程中,开发者常使用UART串口来打印调试信息。然而,当项目变得复杂时,UART方案会面临线缆繁多、资源占用大以及带宽有限等问题。因此,开发者会寻求更优的解决方案,例如利用USB的特性,实现数据传输和日志打印的统一,仅通过一根线缆即可完成。
本应用笔记主要介绍如何利用APM32F402/F403芯片的USBOTG功能,将其配置为一个“复合设备(CompositeDevice)”,使其同时支持WinUSB(用于高速数据传输)和CDC(虚拟串口,用于日志输出)两个接口。通过这种方式,仅需一根USB数据线,便可同时实现供电、数据交换和调试日志输出,实现“一线三用”的便捷开发体验。
例如,一个数据记录器(DataLogger)需要实时或定期采集传感器数据(如压力、流量、震动等)。现场维护人员可以通过笔记本电脑与设备建立WinUSB通道,高速下载大量的历史数据;同时,调试工程师可以在终端软件中打开CDC虚拟串口,实时查看MCU的运行状态或告警信息。整个过程仅需一根USB线,简化了物理连接,且不影响高带宽的数据传输。
| 传统UART串口缺点 | USB CDC虚拟串口优势 |
|---|---|
| 带宽不足:常见的115200bps波特率在数据量大时可能成为瓶颈 | 更高的传输速率:理论速率远高于常规UART |
| 需要额外转接:如果开发板仅提供TTL电平接口,则必须配备额外的USB转TTL线缆 | 接线简洁:一根USB线即可同时负责供电、数据传输和调试 |
| 接线繁琐:电源线、调试线和串口线交织在一起,容易造成混乱 | 灵活性高:CDC可以与其他USB功能作为复合设备共存,互不干扰 |
“USB复合设备”是指在同一个物理USB接口上,通过配置描述符来开启多个逻辑功能接口。一个典型的组合如下:
- CDC接口(虚拟串口):用于输出调试日志。
- WinUSB接口(自定义协议):用于与上位机程序进行高速数据交互。
- 其他接口:根据需求,还可以加入HID(人机接口设备)、MSC(大容量存储,U盘模拟)、Audio(音频设备)等。
针对APM32F402,极海官方提供了名为OTGD_Composite_CDC_WINUSB的例程。该例程已预先配置好复合设备的描述符和端点分配,开发者只需在其基础上进行少量修改,即可将printf函数的输出重定向至CDC虚拟串口,且不影响原有的WinUSB数据通道。
在MDK、IAR等编译环境中,C库函数printf的底层实现依赖于fputc()或_write()这类函数。只需重写这个底层函数,将其输出目标从默认的UART更改为USB CDC发送函数即可。为了避免频繁调用USB发送函数(逐字符发送效率低下),可以引入一个静态缓冲区。将待发送的字符先存入缓冲区,当缓冲区满或遇到换行符\n时,再将整个缓冲区的数据通过USB一次性发送出去。
144
