ST意法半导体
直播中

赵淑洁

7年用户 892经验值
私信 关注
[问答]

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

在尝试学习嵌入式 STM32 编程时,我遇到了另一个我似乎无法解决的障碍。我有一个简单的测试程序,它通过 UART 传输字符,RX 和 TX 引脚循环在一起,并使用中断接收它们。当我使用 HAL_UART_Transmit 传输数据时,我可以在 IRQHandler 中很好地处理接收到的字符。但是当我使用 HAL_UART_Transmit_IT 时,我的 IRQHandler 会为我传输的每个字符在接收缓冲区中放置 2 个字符。我很确定这是因为我的 IRQHandler 被调用以传输每个字符和接收到每个字符。您可以在下面看到我如何尝试仅处理我的 IRQHandler 中接收到的字符,但它在几个字符后挂断了。关于我的任何想法
谢谢
PS 从长远来看,我想让它与 DMA 一起工作,并使用字符匹配中断结束传输。我已经在 STM32H7A3 Nucleo 板上工作,但在我需要使用的 STM32H7B3Discovery 板上没有。所以我现在正在研究这个 IT 方法。
  • initUART4();
  •         uint8_t txBuffer[] = { "$PUBX,00*33rn" };
  •         memset(rxBuffer, 0, sizeof(rxBuffer));
  •         memset(gpsMessage, 0, sizeof(gpsMessage));
  •         msgReceivedUART4 = false;
  •         HAL_UART_Receive_IT(&uart4Handle, rxBuffer, 1);
  •         HAL_UART_Transmit(&uart4Handle, txBuffer, sizeof(txBuffer), 2000);        //This works
  •         //HAL_UART_Transmit_IT(&uart4Handle, txBuffer, sizeof(txBuffer));                //This doesn't work
  •         while (1)
  •         {
  •                 //Do other stuff
  •                 if(msgReceivedUART4)
  •                 {
  •                         //process UART4msg
  •                         HAL_Delay(1);
  •                 }
  •         }
  • }
  • void UART4_IRQHandler()
  • {
  •         HAL_UART_IRQHandler(&uart4Handle);
  • //        if (__HAL_UART_GET_FLAG(&uart4Handle, UART_FLAG_RXNE))
  • //        {
  •                 if (rxBuffer[0] != 0)
  •                 {
  •                         gpsMessage[gpsMsgCount] = rxBuffer[0];
  •                         gpsMsgCount++;
  •                 }
  •                 if (rxBuffer[0] == 'n')
  •                 {
  •                         fifoEnqueue(rxBuffer);
  •                         msgReceivedUART4 = true;
  •                 }
  •                 else
  •                         HAL_UART_Receive_IT(&uart4Handle, rxBuffer, 1);
  • //        }
  • }







回帖(1)

张瑜

2022-12-28 09:19:35
使用 HAL 回调,只有在设置了相关标志时才会调用它。在这种情况下,HAL_UART_RxCpltCallback。
在 HAL_UART_IRQHandler 中检查和清除标志,因此之后检查它们将没有用。
举报

更多回帖

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