STM32F4进行DMA传输(RX)时处理外设错误

时间:2015-06-10 16:22:45

标签: embedded microcontroller uart dma stm32f4discovery

我正在尝试使用DMA为RX和TX与UART外设进行通信。 我正在使用ST提供的HAL库(使用STCubeMX生成)。

我正在处理一个1.5MBaud的UART通道 - 所以为了不丢失任何数据,我将DMA配置为直接模式,带有循环缓冲区,并处理半传输中断以处理数据,并保持DMA在线以获取更多数据。

问题在于,有时我可以在UART的状态寄存器中看到帧错误位已打开,有时溢出错误标志也会打开。

我可以处理丢失的字节(在结构化数据包上使用crc),但问题是外设停止接收数据 - 但DMA不会引发错误,或者停止传输。

因此,如果我尝试接收数据,那么系统上的标志就会挂起。

我看到HAL提供了一个应该处理UART_Error的__weak函数,但它永远不会被调用 - 并且HAL句柄中的状态保持正常。 只看一下寄存器就可以看出存在问题。

我应该如何检测/处理这类错误?

由于

1 个答案:

答案 0 :(得分:2)

出于性能原因,我没有使用HAL,因为它非常笨拙 - 而且imo也没有提供太多的抽象来证明这一点。直接处理硬件并不复杂;甚至更多,因为你仍然必须非常了解发生了什么。正如您已经发现的那样,HAL只支持某种方法;一旦你走自己的路,你就迷失了。

您显然遇到与设置overflow-flag类似的问题。发生此类错误后,您必须在发生错误后重新将接收器与发送器字节流同步。这将需要使用不在分组内发生的符号或线路条件的带外信令。帧错误是一个很好的指示,有问题可以正确地同步到符号(起始位)的开头。

如果线路干净(不是EMC问题),则不应存在帧错误或数据损坏(除非时序参数不匹配)。

如果使用简单的乒乓球,超时可能就足够了。但是,适当的解决方案取决于协议。一个好的协议设计会考虑传输错误和溢出。

请注意,除了DMA传输之外,还必须启用接收错误中断。但是,如果您使用超时(和乒乓协议),您只需擦除标志,因为数据显然没有及时到达。如果实际使用错误中断也要注意竞争条件。