接收到的任何字节的触发中断



我正在尝试一个代码,该代码在DMA循环模式下触发STM32板RX输入端的可变数据大小的中断(非发现)。例如:CONNECTEDrnDATAREQUESTrn

到目前为止,我可以接收数据,同时触发DMA中断。

然后,我将创建一个子RX消息处理缓冲区,\r\n将每个缓冲区分解为不同的字符数组指针。

msgProcessingBuffer[0] = "COM_OK"

msgProcessingBuffer[1] = "DATAREQUEST"

msgProcessingBuffer[n] = "BlahBlahBlah"

我的问题实际上来自于中断的触发。我想从任何数量的数据触发中断,并处理接收到的任何数据。

如果我使用以下中断请求:

HAL_UART_Receive_DMA(&huart1,uart1RxMsgBuffer, 30);

输入缓冲区需要30个字节才能触发中断,但等待的时间太长了,因为我希望在字符串中找到rn后立即处理RX数据。所以我不能等到缓冲区满了才开始处理它

如果我使用以下中断请求:

HAL_UART_Receive_DMA(&huart1,uart1RxMsgBuffer, 1;

它将根据我的意愿触发,但在这种情况下使用DMA没有意义,因为它将触发每个字节的中断,并将创建一个只有1字节(duh)的缓冲区,就像在"轮询模式"中一样。

所以我的问题是,我如何为接收到的第一个字节触发DMA,但仍然在一次中断中接收/处理它之后的所有数据?我想我可能遗漏了一些基本概念。

谨致问候,Blukrr

简而言之:HAL/SPL库不提供这样的特性

通常,一些MCU,例如STM32F091VCT6,具有Modbus和字节流分析的硬件支持(通过接收一些控制字节进行中断)-因此,如果您将在项目中使用此类MCU,您可以通过循环DMA配置接收,并通过接收"\r"或"\n"字节进行中断。

我重复一遍:HAL或SPL不支持这些功能,您只能通过使用寄存器来使用它(请参阅参考手册)。

我看了一些其他论坛,发现有解决这个问题的方法。

我在循环模式下使用DMA,然后监视NDTR,每次通过UART接口接收到字节时,它都会更新其值。然后,我循环调用一个函数(在while 1循环或循环中断处理程序中),该函数分解每个消息部分,总是寻找/n/r个字符。如果当前NDTR值自上一个"while 1"周期以来发生变化,此功能还会保存该值以供比较。如果NDTR自上一个周期以来发生了变化,我会等待几毫秒来接收剩余的消息(UART,传输速度太慢),然后将这些接收到的消息保存在字符缓冲区阵列中以进行后期处理。

如果您创建一个大约50字节的循环DMA缓冲区(HAL_UART_Receive_DMA(&huart1,uart1RxMsgBuffer, 50)),我认为这足以补偿程序周期中的任何波动。

与此同时,我打开了一张去ST的机票,他们确认了你刚才说的话,还添加了:

支持者提出的解决方案-2016年4月14日16:45:22:你好,Gilberto,

可用的DMA中断请求列在参考手册RM0090的表50上,http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf.因此,基本上,DMA中断只能在其中一个事件结束时触发。

•达到一半传输•传输完成•传输错误•Fifo错误(超限、欠载或Fifo级别错误)•直接模式错误

无法在接收数据流中接收到特定字符时触发DMA中断。您可能希望在收到每个数据包(例如30字节)时触发中断,然后处理数据字符串以检查您的字符\r\n是否已到达,以便处理数据块。

谨致问候,MCU技术支持

相关内容

  • 没有找到相关文章

最新更新