Embedded STM32F4在进行DMA传输(RX)时处理外围错误

Embedded STM32F4在进行DMA传输(RX)时处理外围错误,embedded,microcontroller,uart,dma,stm32f4discovery,Embedded,Microcontroller,Uart,Dma,Stm32f4discovery,我正在尝试使用DMA与UART外围设备进行通信,用于接收和发送。 我使用的是ST提供的HAL库(由STCubeMX生成) 我正在处理一个1.5MBaud的UART通道-因此为了不丢失任何数据,我将DMA配置为直接模式,使用循环缓冲区,并处理半传输中断来处理数据,并使DMA保持在线,以获得更多数据 问题是,有时我可以在UART的状态寄存器中看到帧错误位为on,有时溢出错误标志也为on 我可以处理丢失的字节(在结构化数据包上使用crc),但问题是外围设备停止接收数据-但DMA不会引发错误或停止传输

我正在尝试使用DMA与UART外围设备进行通信,用于接收和发送。 我使用的是ST提供的HAL库(由STCubeMX生成)

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

问题是,有时我可以在UART的状态寄存器中看到帧错误位为on,有时溢出错误标志也为on

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

因此,如果我尝试接收数据,并且系统上的标志挂起

我看到HAL提供了一个_弱函数,该函数应该处理UART_错误,但它从未被调用——HAL句柄中的状态保持正常。 只要看一下登记册就知道有问题

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


谢谢

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

很明显,您在设置溢出标志时遇到了类似的问题。发生此类错误后,通常在发生错误后,您必须通过TestStream重新同步接收器和发射器。这将需要使用分组内未出现的符号或线路条件的带外信令。帧错误是一个很好的指示器。要正确地同步到符号的开头(起始位),存在问题

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

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

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