【问题标题】:STM32F4 Handling peripheral error while making a DMA Transfer (RX)STM32F4 在进行 DMA 传输(RX)时处理外设错误
【发布时间】:2015-08-26 00:58:09
【问题描述】:

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

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

问题是有时我可以在 UART 的状态寄存器中看到 Frame Error 位打开,有时 Overrun Error 标志也打开。

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

因此,如果我尝试接收数据,而系统挂起的标志。

我看到 HAL 提供了一个应该处理 UART_Error 的 __weak 函数,但它从未被调用 - 并且 HAL 句柄中的状态保持正常。 只看寄存器就知道有问题了。

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

谢谢

【问题讨论】:

    标签: embedded microcontroller uart dma stm32f4discovery


    【解决方案1】:

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

    您显然有类似的问题,因为设置了溢出标志。发生此类错误后,您通常必须在发生错误后将接收器与发送器字节流重新同步。这将需要使用未出现在数据包内的符号或线路条件的带外信令。帧错误是一个很好的指标,无法正确同步到符号的开头(起始位)。

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-01-20
      • 2014-06-27
      • 2019-02-21
      • 2019-05-24
      • 1970-01-01
      • 2016-10-04
      • 2020-05-24
      • 2014-10-30
      • 2016-03-03
      相关资源
      最近更新 更多