Stm32 为接收到的任何字节触发中断
我正在尝试让一个代码工作,该代码触发一个中断,用于在DMA循环模式下发送到STM32板(而不是discovery)的RX输入的可变数据大小。示例: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]=“
已连接\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循环或循环中断处理程序中),该函数会分解每个一直在寻找的消息部分