Stm32L151RCxxx USART挂起问题,同时基于中断TX / RX

时间:2014-01-13 12:43:59

标签: c embedded stm32 usart

我在921600 BaudRate上运行USART3,使用RTS CTS,当我尝试同时执行RX和TX时,我总是面临系统挂起。我已粘贴主要和IRQ代码。 IRQ旨在传输char'A',同时丢弃所有接收的数据。我们停用USART_ITConfig(USART3, USART_IT_TXE, DISABLE);

时会挂起

Uart_Configuration()...

USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
USART_ClockInit(USART3, &USART_ClockInitStructure);

USART_InitStructure.USART_Mode = (USART_Mode_Tx|USART_Mode_Rx);
USART_InitStructure.USART_BaudRate = u32BaudRate;
USART_OverSampling8Cmd(USART3, DISABLE);
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS; 
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_Init(USART3, &USART_InitStructure);  
USART_ITConfig(USART3,USART_IT_TXE, DISABLE);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
USART_Cmd(USART3, ENABLE);

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;
}

1 个答案:

答案 0 :(得分:4)

在禁用之前可能会发生USART_IT_TXE中断吗?因此,已经设置了“Tx empty”中断挂起标志,并且IRQHandler中没有用于清除该标志的过程。