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

Posted

技术标签:

【中文标题】Stm32L151RCxxx USART 挂起问题,同时基于中断的 TX/RX【英文标题】:Stm32L151RCxxx USART Hang issue, Interrupt Based TX/RX simultaneously 【发布时间】:2014-02-01 05:16:37 【问题描述】:

我正在运行 USART3,波特率 921600,使用 RTS CTS,当我尝试同时执行 RX 和 TX 时,我总是面临系统挂起。我已经粘贴了主代码和 IRQ 代码。 IRQ 被设计为在丢弃所有接收到的数据的同时传输一个字符“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;

【问题讨论】:

您的逻辑可能陷入僵局。连接一个 SWD 调试器(任何 STM32 发现板都可以)并找出它挂在哪里,或者它是否没有挂起但崩溃并最终进入故障处理程序。此外,您可能需要考虑设置 UART 错误标志的可能性(线路噪声,或以您的波特率,缓冲区溢出)并清除它们。 您应该禁用 USART 时钟吗? USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; 您是否尝试过使用 gpio 引脚在不同位置进行调试和设置/重置?这样您就可以跟踪代码的哪一部分处于无限循环中。 试试coocox.org/show_exam/USART/391.html 【参考方案1】:

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

【讨论】:

以上是关于Stm32L151RCxxx USART 挂起问题,同时基于中断的 TX/RX的主要内容,如果未能解决你的问题,请参考以下文章

STM32L151 LL库串口发送丢数据解决办法

STM32L151 LL库串口发送丢数据解决办法

STM32L151 LL库串口发送丢数据解决办法

STM32L151解密STM32L152芯片解密IC程序破译多少钱?

STM32L151 RTC闹钟中断

STM32L011 无法在 rx 模式下设置 USART