【问题标题】:STM32f103 HAL USB - UART bridgeSTM32f103 HAL USB - UART桥接器
【发布时间】:2021-02-16 06:33:28
【问题描述】:

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

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

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

有两个问题:

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

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

【问题讨论】:

  • 你在用STM32 HAL驱动吗?
  • 是... STM32Cube_FW_F1_V1.8.2
  • 这是 RTOS 的完美任务
  • RTOS 是一个有效的选项。其他方法也是有效的,例如更多地依赖DMA。代码和 RAM 占用空间非常小的示例:github.com/manuelbl/usb-serial/firmware(用于 libopencm3,不适用于 STM32 HAL)。

标签: usb stm32 hal


【解决方案1】:

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

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

基本上,USB-to-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)。

【讨论】:

  • 最困难和最有趣的部分是UART转USB,即字符设备转块设备。您不能只通过 USBchar 逐个字符发送,因为它会立即杀死 USB(尤其是 FS),有什么想法吗?
  • 使用带有环形缓冲区的 DMA 从 UART 接收,并每隔 1 毫秒检查一次新数据。此外,每次向主机发送数据包时都要检查。如果需要可靠,则必须在 UART 上使用软件或硬件流控制。否则环形缓冲区会溢出,数据会丢失。
  • 恐怕没那么容易
  • 并非每个 msek 都可以使用 CDC 发送内容。 HAL 确实可以正确处理它。
  • @P__JsupportswomeninPoland 您可以轻松地每 1 毫秒发送一次。这是主机轮询设备的速率。这是完美的汇率。当然,您需要确保之前的数据包已经发送。 -- 我不明白您所说的“HAL 确实正确处理”是什么意思。
猜你喜欢
  • 2021-09-28
  • 2014-09-12
  • 2020-08-04
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2015-08-16
相关资源
最近更新 更多