首页 > 解决方案 > STM32f103 HAL USB - UART桥接器

问题描述

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

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

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

有两个问题:

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

2.单片机端如何获取PC上设置的波特率(终端连接虚拟COM口时设置)

标签: usbstm32hal

解决方案


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 由您决定。

由于涉及回调,因此您不能将此代码放入主循环。CDC_Itf_Receive如果使用阻塞 UART ,可能会将所有代码放入其中。它将按 2、3、4、1 的顺序出现。此外,还需要初始化(0 和 1)。

在 UART 到 USB 的方向上,您需要在 UART 上实现流控制。USB 流控制由主机管理。尽管 USB 比 UART 快得多,但流量控制是相关的,因为主机上的应用程序可以尽可能慢地处理数据。

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


推荐阅读