STM32f103 HAL USB-UART桥

问题描述

我有一个可通过UART编程的第三方设备。

我需要创建一个具有功能密码的USB-UART桥(仅在输入正确的密码后进行编程)

使用适用于STM32 9.3.0的Atollic TrueSTUdio的最新版本STM32CubeMX生成代码... 我通过缓冲区在USB和UART之间传输数据(一个用于usb-uart,另一个用于uart-usb) 当我尝试传输几个字符时一切正常,但是当我尝试传输大数据包时,由于USB速度比UART高得多的事实而开始出现问题...

有两个问题:

1。如何告诉USB我需要停止传输数据并等待直到UART(缓冲区)繁忙

2。如何在微控制器侧面获得在PC上设置的波特率(当终端连接到虚拟COM端口时设置)

解决方法

USB提供流量控制。这就是您需要实现的。可以在这里找到一般介绍:

https://medium.com/@manuel.bl/usb-for-microcontrollers-part-4-handling-large-amounts-of-data-f577565c4c7d

基本上,USB转UART的方向应为:

  1. 表明代码已准备好接收USB数据包
  2. 接收USB数据包
  3. 表明您不再准备接收USB数据包
  4. 通过UART传输数据
  5. 重新开始

第0步:初始设置

调用USBD_CDC_SetRxBuffer设置用于接收USB数据的缓冲区。除非您使用多个缓冲区来实现更高的吞吐量,否则在程序开始时进行一次调用就足够了。

第1步:准备接收数据

致电USBD_CDC_ReceivePacket。除了其名称所暗示的含义外,该函数还表明该应用已准备就绪,可以接收数据。它会在实际收到数据之前立即返回。

第2步:接收USB数据包

您无需在此处做任何事情。它会自动发生。完成后,将调用CDC_Itf_Receive

第3步:表明您不再准备接收USB数据包

这里无事可做。每当接收到数据包(并且未启用双重缓冲)时,此操作就会自动发生。

第4步:通过UART传输数据

我想你知道怎么做。您是要以阻塞方式还是使用DMA来决定。

由于涉及回调,因此无法将此代码放入主循环。如果使用阻塞UART,则可以将所有代码放入CDC_Itf_Receive中。它会以2、3、4、1的顺序显示。此外,还需要初始化(0和1)。

在UART到USB的方向上,您需要在UART上实现流控制。 USB流控制由主机管理。尽管USB的速度比UART快得多,但是流量控制还是很重要的,因为主机上的应用程序可以按照自己喜欢的速度处理数据。

关于问题2:我不确定我是否理解……微控制器无法在主机上设置波特率。主机可以指定波特率(通过USB传输并应用于UART),或者如果UART具有固定的波特率,则可以忽略波特率(在主机端设置的任何波特率都将起作用,因为不适用于USB)。