STM32串行DMA-查找流的开始

时间:2019-05-27 09:02:23

标签: c stm32 stm32-hal

我有一种已知的串行流格式,可以通过DMA捕获。它具有页眉和页脚字节。但是有时,MCU在流的中间开始捕获,然后同步消失,因为DMA正在寻找固定数量的字节。我读过一些使用循环缓冲区的人,但是我一直难以理解这个概念。

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

听起来可行吗?感谢您的输入。

我正在将STM32 HAL库与包含STM32 CubeMX的新STM32 IDE配合使用。

2 个答案:

答案 0 :(得分:0)

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

读取和写入指针均始于缓冲区的开头。您必须检查的两个条件是: 1)当读指针与写指针位于同一位置时,没有什么要读。 2)当写指针递增并运行到读指针位置时,您将遇到缓冲区溢出情况。这永远都不会发生,因此要么必须使用更大的缓冲区,要么使Reader任务运行得更频繁,要么开始扔掉它们。

因此,在您的情况下,DMA仅转储数据,而读取器任务将查找标头字节并处理数据,直到找到页脚字节为止。

答案 1 :(得分:0)

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

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