【发布时间】:2022-08-23 20:57:26
【问题描述】:
场景:我有一个 STM32 MCU,它在 DMA 模式下使用带有空闲中断的 UART 进行 RS485 数据传输。 UART 的波特率在 CubeMX 中设置,在本例中设置为 115200。我的代码工作正常,当主机使用正确的波特率时,它也“长时间”稳定,没有问题或担心。
但是:当我在主机上设置错误的波特率时,例如56700而不是115200,UART停止接收数据,即使我稍后将主机的波特率设置为微控制器使用的相同波特率,它也不起作用。到目前为止,解决此问题的唯一方法是:重置 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 中设置为循环模式,空闲中断也被激活,使用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 上
-
当您进行“自重置”时,您是否也重置了 DMA?