使用 Nucleo-G431KB
开发板,我玩了一下 UART RX DMA。
我在线性缓冲区上启动了 DMA RX,然后停止并重新启动 DMA。
我刚刚观察到,在接收到几个字节后,HAL_UART_DMAStop 不再停止 UART RX 上的 DMA。HAL_UART_DMAStop 调用不会返回错误,但 HAL_UART_Receive_DMA 会返回错误,因为传输从未停止过。我还观察到字符仍会被接收到 DMA UART RX 缓冲区,确认 DMA 没有停止。
它仅在我在缓冲区中收到几个字节后才会发生。单个字节不会造成任何问题。
我找不到根本原因。
无论如何,仅在循环缓冲区上启动一次 HAL_UART_Receive_DMA 并检查 __HAL_DMA_GET_COUNTER 是输入随机大小的 UART 数据的更好方法。
我只是想知道是否有人也注意到了这一点。
它是 HAL 中的错误吗?
不幸的是,我不再拥有代码,但它只是简单明了,就像在循环中调用一样,大致如下:
- uint8_t DataRX[256];
- while (1)
- {
- HAL_UART_Receive_DMA(&huart1, DataRX, sizeof(DataRX))
- //Checking length and print buffer (on a different UART)
- uint16_t Last_Byte_Index = (uint16_t)(sizeof(DataRX) - __HAL_DMA_GET_COUNTER(huart1.hdmarx));
- // ... printing the buffer on another UART
- HAL_UART_DMAStop(&huart1);
- }