gpt4 book ai didi

DMA 模式下的 STM32 UART 在从错误波特率的主机接收后停止接收

转载 作者:行者123 更新时间:2023-12-05 02:32:20 30 4
gpt4 key购买 nike

场景:我有一个 STM32 MCU,它在 DMA 模式下使用 UART,并使用空闲中断进行 RS485 数据传输。 UART 的波特率在 CubeMX 中设置,在本例中为 115200。我的代码工作正常,当主机使用正确的波特率时,它也“长时间”稳定,没有问题或后顾之忧。

但是:当我在主机上设置了错误的波特率时,例如56700 而不是 115200,UART 停止接收数据,即使我稍后将主机的波特率设置为微 Controller 使用的相同波特率,它也不会工作。到目前为止解决这个问题的唯一方法是:重置 MCU 并以正确的波特率重新连接。

给你一些(伪)代码:

uint8_t UART_Buf[128];
HAL_UART_Receive_DMA(&huart2, UART_Buf, 128);
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);

或者简单地说:有一个用于 DMA 的 UART 缓冲区 (UART_Buf[128]),UART 由 HAL_UART_Receive_DMA(...) 启动,DMA Rx 在 CubeMX 中设置为循环模式,Idle-Interrupt 也是激活,使用 HAL 宏:__HAL_UART_ENABLE_IT(...);这段代码到目前为止工作正常。

工作正常意味着:当我将数据从我的 PC 传输到 Micro 时,(一个)空闲中断被 MCU(正确)触发。在 ISR 中我设置了一个标志,之后开始数据解析。我收到的字节数与我发送的字节数完全相同,一切正常。

但是:当我在我的终端程序中进行了错误的设置而不是(正确的)波特率 115200 时,波特率选择菜单被设置为例如57600,麻烦开始了:

空闲中断仍然会在每次传输后触发。但它会快速“突发”触发 2-4 次(取决于波特率)并且接收到的字节数为 0。我希望至少有一些 bs 数据,但确实有0 缓冲区中的数据 - 我可以用调试器检查。显然什么也没有收到。当我在我的终端程序中更改波特率并重新启动它时,MCU 仍然没有收到任何消息。

如果主机的波特率不正确,我可以接受接收到的 0 个字节,但如果主机的波特率错误的一次传入传输会禁用 UART,直到完成硬件重置,这是非常不酷的。

到目前为止,我尝试解决此问题:使用 MX_USART2_UART_Init() 计算“空闲中断突发”和接收到的 0 个字节以触发“自复位”例程,该例程停止 UART 并重新启动它;常规。零影响。我可以看到空闲中断仍然被正确触发,但是缓冲区仍然是空的并且没有数据传输到缓冲区中。 UART 保持非接收状态。

问题有没有人遇到过类似的问题,如果有:您是如何解决的?

附加信息:这发生在 STM32F030 和 STM32G03x 上

最佳答案

当您以错误的波特率发送到 UART 时,接收方会看到帧错误和/或噪声错误。它也可能显示为被正确接收的随机字符,但这种可能性较小,因此如果您的缓冲区中没有任何内容,请不要感到惊讶。

当您使用 DMA 接收时,打开错误中断或轮询错误位是正常的。当检测到错误时,您将重新初始化所有内容并重新启动 DMA。这听起来像是您正在尝试通过计算空闲中断来做的事情,但您只是没有检查正确的位。

如果你不想那样做,也不是不可能想象你在驱动层无事可做,想尝试在更高层做重新同步(eg:重新开始读取并丢弃所有东西直到一个换行符),但你至少要记住两件事:

首先,确保清除 USART_CR3 寄存器中的 DDRE 位。 “接收错误时禁用 DMA”这个名称不言自明。

其次,只要字节之间有空闲间隙,UART 外设就能够 self 重新同步。如果您将发送器切换到正确的波特率但继续发射数据,则接收器可能永远无法正确识别哪位是起始位。

关于DMA 模式下的 STM32 UART 在从错误波特率的主机接收后停止接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71287996/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com