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

Stm32 为接收到的任何字节触发中断,stm32,uart,dma,Stm32,Uart,Dma,我正在尝试让一个代码工作,该代码触发一个中断,用于在DMA循环模式下发送到STM32板(而不是discovery)的RX输入的可变数据大小。示例:已连接\r\n请求\r\n 到目前为止还不错,我能够接收数据和所有数据,同时还能触发DMA中断 然后,我将创建一个子RX消息处理缓冲区,\r\n将每个缓冲区分解为不同的字符数组指针 msgProcessingBuffer[0]=“COM_正常” msgProcessingBuffer[1]=“数据请求” msgProcessingBuffer[n]=“

我正在尝试让一个代码工作,该代码触发一个中断,用于在DMA循环模式下发送到STM32板(而不是discovery)的RX输入的可变数据大小。示例:
已连接\r\n请求\r\n

到目前为止还不错,我能够接收数据和所有数据,同时还能触发DMA中断

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

msgProcessingBuffer[0]=“COM_正常”

msgProcessingBuffer[1]=“数据请求”

msgProcessingBuffer[n]=“BlahBlahBlah”

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

如果我使用下面的中断请求:

HAL\u UART\u Receive\u DMA(&huart1,uart1RxMsgBuffer,30)

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

如果我使用下面的中断请求:

HAL\u UART\u Receive\u DMA(&huart1,uart1RxMsgBuffer,1;

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

所以我的问题是,如何在接收到的第一个字节触发DMA,但仍然在一次中断中接收/处理它之后可能出现的所有数据?我相信我可能缺少一些基本概念

致以最良好的祝愿,
简而言之:HAL/SPL库不提供这样的功能。

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


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

简而言之:HAL/SPL库不提供此类功能。

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


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

与此同时,我打开了ST的票据,他们确认了您刚才所说的,他们还添加了:

支持者提出的解决方案-14/4/2016 16:45:22: 嗨,吉尔伯托

参考手册RM0090的表50中列出了可用的DMA中断请求。因此,基本上,DMA中断只能在其中一个事件结束时触发

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

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

问候,,
MCU技术支持

与此同时,我打开了一张到ST的机票,他们确认了您刚才所说的,他们还补充了:

支持者提出的解决方案-14/4/2016 16:45:22: 嗨,吉尔伯托

参考手册RM0090的表50中列出了可用的DMA中断请求。因此,基本上,DMA中断只能在其中一个事件结束时触发

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

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

问候,,
MCU技术支持

我正在查看一些其他论坛,我发现有一个解决此问题的方法

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


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

我正在查看一些其他论坛,我发现有一种解决此问题的方法

我在循环模式下使用
DMA
,然后我监控
NDTR
,每当通过UART接口接收到一个字节时,它就会更新它的值。然后我循环调用一个函数(在while 1循环或循环中断处理程序中),该函数会分解每个一直在寻找的消息部分