我正在尝试获取一个代码,以便在DMA循环模式下触发可变数据大小的中断到达STM32板的RX输入(而不是发现)。例如:CONNECTED\r\nDATAREQUEST\r\n
到目前为止,我能够接收数据和所有数据,同时还会触发DMA中断。
然后我将创建一个子RX消息处理缓冲区,将每个\ r \ n分解为不同的char数组指针。
msgProcessingBuffer[0] = "COM_OK"
msgProcessingBuffer[1] = "DATAREQUEST"
msgProcessingBuffer[n] = "BlahBlahBlah"
我的问题实际上是来自中断的触发器。我想从任意数量的数据中触发中断并处理收到的任何数据。
如果我使用下面的中断请求:
HAL_UART_Receive_DMA(&huart1,uart1RxMsgBuffer, 30);
输入缓冲区将占用30个字节来触发中断,但是等待的时间太长,因为我想在字符串中找到\r\n
后立即处理RX数据。所以我不能等待完整的缓冲区填充开始处理它。
如果我使用下面的中断请求:
HAL_UART_Receive_DMA(&huart1,uart1RxMsgBuffer, 1;
它将按我的意愿触发,但在这种情况下使用DMA是没有意义的,因为它将触发每个字节的中断,并且将创建一个仅1字节(duh)的缓冲区,就像在“轮询模式”中一样。
所以我的问题是,如何触发接收到的第一个字节的DMA,但仍然接收/处理单个中断后可能出现的所有数据?我相信我可能会遗漏一些基本概念。
祝你好运, Blukrr
答案 0 :(得分:1)
简而言之:HAL / SPL图书馆不提供此类服务。
通常一些MCU,例如STM32F091VCT6具有支持Modbus和字节流分析的硬件(通过接收一些控制字节来中断) - 所以如果你将在你的项目中使用这样的MCU,你可以通过接收通过循环DMA配置接收' \ r'或者' \ n'字节。
我再说一遍: HAL或SPL不支持此功能,您可以使用仅使用寄存器(参见参考手册)。
答案 1 :(得分:0)
与此同时,我开了一张去往ST的门票,他们确认了你刚刚说的话,他们还补充道:
支持者提出的解决方案 - 2016年4月14日16:45:22: 嗨Gilberto,
可用的DMA中断请求列在参考手册的表50中,RM0090,http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf。因此,基本上,DMA中断只能在其中一个事件结束时触发。
•达到半转移 •转移完成 •传输错误 •Fifo错误(溢出,欠载或FIFO级错误) •直接模式错误
无法在接收到接收数据流中的特定字符时触发DMA中断。您可能希望在收到每个30字节的数据包时触发中断,然后处理数据字符串以检查您的\ r \ n字符是否已到达,以便您可以处理数据块。
此致 MCU技术支持
答案 2 :(得分:0)
我正在看一些其他论坛,我发现有一个解决这个问题的方法。
我在循环模式下使用DMA
,然后我监视每次通过UART接口接收到字节时更新其值的NDTR
。然后我循环调用一个函数(在1循环或循环中断处理程序中),分解每个消息部分总是在寻找/ n / r字符。如果自上次“while 1”循环以来已更改,此函数还会保存当前NDTR
值以进行比较。如果NDTR
自上一个周期以来发生了变化,我会等待几毫秒来接收剩余的消息(UART传输速度太慢),然后将这些接收到的消息保存在char缓冲区数组中进行后期处理。
如果你创建一个大约50字节(HAL_UART_Receive_DMA(&huart1,uart1RxMsgBuffer, 50)
)的循环DMA缓冲区,我认为这足以弥补程序周期中的任何波动。