Stm32L151RCxxx USART挂起问题,同时基于中断的发送/接收

Stm32L151RCxxx USART挂起问题,同时基于中断的发送/接收,c,embedded,stm32,usart,C,Embedded,Stm32,Usart,我在921600波特率上运行USART3,使用RTS CTS,当我试图同时执行RX和TX时,我总是面临系统挂起。我已经粘贴了main和IRQ代码。IRQ设计用于在删除所有接收数据的同时传输字符“a”。当我们禁用USART\u ITConfig(USART\u IT\u TXE,disable)时会发生挂起 Uart_配置() Main.c uint8_t UART_TransmitData(void) { if(u8IntTxFlag==1) { u8IntTxFlag

我在921600波特率上运行USART3,使用RTS CTS,当我试图同时执行RX和TX时,我总是面临系统挂起。我已经粘贴了main和IRQ代码。IRQ设计用于在删除所有接收数据的同时传输字符“a”。当我们禁用
USART\u ITConfig(USART\u IT\u TXE,disable)时会发生挂起

Uart_配置()

Main.c

uint8_t UART_TransmitData(void)
{
   if(u8IntTxFlag==1)
   {
       u8IntTxFlag=0;
       USART_ITConfig(USART3, USART_IT_TXE, ENABLE);      
       return TRUE;
   }
   return FALSE;
}


void USART3_IRQHandler(void)
{
   /* Implemented full duplex serial communication */
   /*  UART RX  */
   if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
   {
     USART_ReceiveData(USART3);
   }

   /*    UART TX    */
   if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)
   {
     if(USART_GetFlagStatus(USART3, USART_FLAG_CTS) == RESET)
     {
         while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
         USART_SendData(USART3, 'A');
         while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
         USART_ClearFlag(USART3, USART_FLAG_TC);
         USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
         u8IntTxFlag=1;
     }
     else
     {
        USART_ClearFlag(USART3, USART_FLAG_CTS);
     }
   }
}


int main(void)
{
  RCC_ClocksTypeDef RCC_Clocks;

  RCC_Configuration();
  RCC_GetClocksFreq(&RCC_Clocks);
  SysTick_Config(RCC_Clocks.HCLK_Frequency / 2000);

  NVIC_Configuration();

  Init_GPIOs();

  SerialUARTConfig(921600, 0, 1, 8, 1);

                while(1)
                {
                                UART_TransmitData();
                                f_SleepMs(5);

                }
                return 0;
}

也许USART\U IT\U TXE中断发生在您禁用它之前?因此,“Tx empty”中断挂起标志已经设置,并且IRQHandler中没有清除该标志的过程。

您的逻辑可能出现死锁。连接一个SWD调试器(任何STM32发现板都可以)并找出它挂起的位置,或者它是否没有挂起但崩溃并最终进入故障处理程序。此外,您可能需要考虑UART错误标志设置的可能性(行噪声,或在波特率,缓冲区溢出),并清除那些。您是否应该禁用USAT时钟?代码>USART\u ClockInitStructure.USART\u Clock=USART\u Clock\u Disable您是否尝试过使用gpio引脚进行调试并在不同位置设置/重置它?这样,您就可以跟踪代码的哪一部分在无限循环中
uint8_t UART_TransmitData(void)
{
   if(u8IntTxFlag==1)
   {
       u8IntTxFlag=0;
       USART_ITConfig(USART3, USART_IT_TXE, ENABLE);      
       return TRUE;
   }
   return FALSE;
}


void USART3_IRQHandler(void)
{
   /* Implemented full duplex serial communication */
   /*  UART RX  */
   if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
   {
     USART_ReceiveData(USART3);
   }

   /*    UART TX    */
   if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)
   {
     if(USART_GetFlagStatus(USART3, USART_FLAG_CTS) == RESET)
     {
         while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
         USART_SendData(USART3, 'A');
         while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
         USART_ClearFlag(USART3, USART_FLAG_TC);
         USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
         u8IntTxFlag=1;
     }
     else
     {
        USART_ClearFlag(USART3, USART_FLAG_CTS);
     }
   }
}


int main(void)
{
  RCC_ClocksTypeDef RCC_Clocks;

  RCC_Configuration();
  RCC_GetClocksFreq(&RCC_Clocks);
  SysTick_Config(RCC_Clocks.HCLK_Frequency / 2000);

  NVIC_Configuration();

  Init_GPIOs();

  SerialUARTConfig(921600, 0, 1, 8, 1);

                while(1)
                {
                                UART_TransmitData();
                                f_SleepMs(5);

                }
                return 0;
}