STM32f103 HAL USB - UART桥接器

Posted

技术标签:

【中文标题】STM32f103 HAL USB - UART桥接器【英文标题】:STM32f103 HAL USB - UART bridge 【发布时间】: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)。 【参考方案1】:

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

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

基本上,USB-to-UART 方向的设置应该是:

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

第 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 确实正确处理”是什么意思。

以上是关于STM32f103 HAL USB - UART桥接器的主要内容,如果未能解决你的问题,请参考以下文章

STM32学习笔记 二基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发

STM32学习笔记 二基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发

STM32学习笔记 二基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发

基于STM32F103C8T6最小系统板HAL库CubeMX驱动HC-SR501红外人体传感模块

基于STM32F103C8T6最小系统板HAL库CubeMX驱动HC-SR501红外人体传感模块

基于STM32F103C8T6最小系统板HAL库CubeMX驱动HC-SR501红外人体传感模块