ST意法半导体
直播中

陈游斗

7年用户 1115经验值
擅长:控制/MCU
私信 关注
[问答]

如何在使用HAL_UART_Transmit_DMA时仅处理UART RX中断事件?

我正在使用 F413,我正在使用 USART3 通过 UART 接收和传输数据。因为我需要接收未知大小的数据,所以我为 RX 编写了自己的中断处理程序。但是我想在 DMA 的帮助下传输数据。
如果我调用常规轮询 UART_Transmit(...) 函数,设备将发送数据并且来自目标的响应将被 RX IRQ 处理程序拾取到缓冲区而不会出现问题。我不想摆脱阻塞 UART_Transmit() 功能。出于这个原因,我配置和设置 DMA,以便我可以使用非阻塞 UART_Transmit_DMA(...) 函数。
使用逻辑分析器,我可以看到正确形成的传出和传入流量。我会说 DMA 传输工作正常......但现在我的 RX IRQ 处理程序有问题......

我的接收 IRQ 处理程序如下所示:
  • /* USART3 RX handler */
  • UART_RX_INTERRUPT_HANDLER_DECLARAtiON(USART3)
  • {
  •         /* Check if receive register is not empty status */
  •   if __HAL_UART_GET_FLAG(&UARTS_Instance()->consts[UART_INSTANCE_3].huart, USART_SR_RXNE)
  •         {
  •                 /* Disable/ clear flag */
  •                 __HAL_UART_CLEAR_FLAG(&UARTS_Instance()->consts[UART_INSTANCE_3].huart, USART_SR_RXNE);
  •                 /* Process received data */
  •                  UARTS_Instance()->rx_irq_callback(UARTS_Instance()->consts[UART_INSTANCE_3].index ,__HAL_UART_FLUSH_DRREGISTER(&UARTS_Instance()->consts[UART_INSTANCE_3].huart));
  •                 /* Flush register*/
  •                 __HAL_UART_FLUSH_DRREGISTER(&UARTS_Instance()->consts[UART_INSTANCE_3].huart);
  •                 /* Re-enable interrupt */
  •                 __HAL_UART_ENABLE_IT(&UARTS_Instance()->consts[UART_INSTANCE_3].huart, UART_IT_RXNE);
  •         }
  • }
现在发生的是我被困在这个处理程序中并且它被反复调用,因此我的程序“冻结”。如果我在处理程序中放置断点并检查外围寄存器,我会看到有 TCIE 寄存器启用....虽然我从来没有在我的代码中的任何地方手动启用它(我已经检查了好几次)...所以现在我在想 DMA 是否可以对此有任何影响,以及我应该如何正确处理该处理程序中的标志和中断(而 DMA Stream 有它自己的处理程序 - HAL_DMA_IRQHandler(&dma) )。

  • void DMA1_Stream3_IRQHandler(void)
  • {
  •   HAL_DMA_IRQHandler(&UARTS_Instance()->consts[UART_INSTANCE_3].hdma);
  • }

更多回帖

发帖
×
20
完善资料,
赚取积分