0

我有一个通过 DMA 捕获的已知串行流格式。它有页眉和页脚字节。但有时 MCU 在流的中间开始捕获,然后同步结束,因为 DMA 正在寻找一组字节数。我读过有人使用循环缓冲区,但我一直在努力掌握这个概念。

相反,我正在考虑禁用 DMA 并在 MCU 启动时启用串行中断。然后循环遍历中断捕获的每个字节以找到起始字节。然后,一旦我找到了起始字节,就禁用串行中断捕获并启用 DMA 来接管流的捕获。

这听起来可行吗?感谢您的任何意见。

我将 STM32 HAL 库与包含 STM32 CubeMX 的新 STM32 IDE 一起使用。

4

2 回答 2

0

如果我正确理解您对循环缓冲区的引用,那么这个概念很简单。您有一个带有写指针和读指针的大缓冲区。write 函数从写指针开始将数据写入缓冲区,注意一旦到达缓冲区的末尾,它会环绕并转储缓冲区开头及之后的数据。然后,您需要一个读取器函数,该函数从读取指针向前读取数据,并再次处理缓冲区末尾的回绕。

读和写指针都从缓冲区的开头开始。您必须检查的两个条件是:1)当读指针与写指针位于同一位置时,没有(更多)可读取的内容。2)当写指针递增并运行到读指针位置时,就会出现缓冲区溢出情况。这不应该发生,所以要么你必须使用更大的缓冲区,要么让阅读器任务更频繁地运行,要么你开始扔东西。

因此,在您的场景中,DMA 只是转储数据,而您的阅读器任务会查找标头字节并处理数据,直到找到页脚字节。

于 2019-05-28T07:34:06.247 回答
0

由于协议在数据包之间存在空闲间隙,您可以使用 UART 的空闲中断功能来同步接收器。

启用 UART 中断,只需使用 DMA 开始接收,然后设置UARTx->CR1 |= USART_CR1_IDLEIE. 每当触发空闲中断时,查看 DMA 通道,如果它仍在运行,则停止传输并丢弃输入缓冲区(因为这意味着接收是在数据包中间开始的)并开始接收下一个数据包。

于 2019-05-28T08:02:43.033 回答