用于STM32微控制器的UART over USB

时间:2015-06-02 17:14:50

标签: embedded usb stm32 uart usbserial

我正在尝试通过STM324x9I-EVAL开发板上的USB接口实现UART。目的是串行地向伺服控制器(或其他硬件)发送命令。我已经在开发板上成功实现了USB_Device_CDC示例,但我不确定如何在没有带有驱动程序的PC的情况下如何工作。就其他硬件而言,USB端口现在看起来就像一个串口吗?或者另一端是否还需要驱动程序或某种界面?

我想指出我知道以下帖子:

Emulating UART over USB

但我不相信我的问题在答案的背景下得到了充分的回答。

2 个答案:

答案 0 :(得分:5)

USB连接不是像UART那样的点对点连接。它需要主机和设备处于主/从关系。设备无法启动数据传输;它必须由主持人不断进行调查。

CDC / ACM类设备在PC主机上显示虚拟COM端口,但这不允许设备与UART接口通信。它看起来像软件级别的串行端口,但不实现UART物理层。引擎盖下有很多东西让它看起来像一个PC串口,但它们都不像物理层面的UART通信。

有些设备充当UART / USB桥接器(例如FTDI和Prolific),您可以(有点贵)从具有USB设备控制器和UART的微控制器构建您自己的设备,但桥接器是USB设备,仍然必须连接到USB主机;这些通常用于将PC连接到缺少USB控制器的微控制器,或者使用USB控制器的软件/ CPU开销太大。

理论上,您可以将具有USB主控制器的微控制器连接到具有USB设备控制器的微控制器,但是您需要分别在每个控制器上连接主机和设备软件堆栈,并且一旦您拥有USB连接,实施CDC / ACM就是使用可用带宽的效率有些低。 CDC / ACM类的目的主要是允许“遗留”软件在PC上运行。

如果您需要连接到“真正的”串行端口,您应该使用真正的UART - 在任何情况下都比微控制器上的USB控制器更普遍。

答案 1 :(得分:3)

您应该了解一下USB设备类。 CDC是USB设备类,ACM是我假设您正在使用的子类。您制作的设备可称为" CDC ACM设备"因为它使用CDC类和ACM子类。

这些类和子类由USB Implementers Forum在您可以在此处找到的文档中定义:

http://www.usb.org/developers/docs/devclass_docs/

这些文件指定了CDC ACM设备应该具有哪些USB描述符以便向主机描述自身,以及它应该具有哪种接口和端点,以及如何根据USB事务和串行数据来表示串行数据。传输。

请注意,CDC ACM仅指定一些用于在主机和设备之间传输数据的USB命令。它没有指定设备实际对该数据执行的操作。您可以使用CDC ACM实现USB转串口适配器,或者只需将其用作通用通信接口即可发送任何数据。

,您需要PC端的驱动程序。驱动程序需要设计为在特定的操作系统上运行。它需要在您的操作系统中创建某种虚拟串口设备,其他软件(只知道串口)可以找到并连接。它需要根据CDC ACM规范将串口上其他软件执行的串口操作(例如,将一些字节写入串口)转换为低级USB命令(例如,在特定端点上向设备发送一些字节)以USB数据包的形式)。它需要知道应该操作哪些USB设备,因为并非每个USB设备都是CDC ACM设备。

对于Windows,您可能会使用Windows附带的 usbser.sys 驱动程序。对于早于Windows 10的Windows版本,您需要编写INF file以将设备与usbser.sys和sign it相关联。对于Windows 10及更高版本,Windows中已包含一个名为usbser.inf的新INF文件,该文件将自动匹配任何有效的CDC ACM设备。这意味着,如果您只打算支持在Windows 10或更高版本上使用该设备,则无需为CDC ACM设备编写或分发驱动程序。 partnership between Microsoft and Arduino which began in 2015让我希望微软将来能继续支持和改进usbser.sys。事实上,他们claim在Windows 10"驱动程序已经通过使用内核模式驱动程序框架重写,提高了驱动程序的整体稳定性,这是好消息。

对于Linux,有cdc_acm内核模块,它长期以来一直是内核的标准组成部分,并且可以自动与您插入的任何CDC ACM设备一起使用。

对于Mac OS X,有AppleUSBCDCACM驱动程序,它可以自动与您插入的任何CDC ACM设备一起使用。

请注意,对于任何这些驱动程序来识别您的设备并使用它,您的设备必须在其USB描述符中包含某些值,并且要求可能会根据您所说的确切驱动程序版本而有所不同。

  

USB端口现在看起来只是一个串口吗?

不,这是错误的思考方式。 USB端口仍然看起来像USB端口,但操作系统提供的各种USB驱动程序将识别出CDC ACM设备已插入该端口并在操作系统的串行端口列表中创建新条目。然后,如果您运行一些只知道串行端口的软件,它就可以连接到该端口。

事实上,如果您制作复合设备,您可以将一个USB设备插入一个实际上有两个或更多虚拟串口的USB端口。