STM32串口死机问题笔记(仅供学习用)

当STM32与上位机通讯数据量非常大时,往往容易导致死机,于是我们在网上查找添加以下代码:

void USART1(void)
{  
    if (USART_GetFlagStatus(USART1, USART_FLAG_PE) != RESET)
   {
       USART_ReceiveData(USART1);
     USART_ClearFlag(USART1, USART_FLAG_PE);
   }
    
   if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
   {
       USART_ReceiveData(USART1);
     USART_ClearFlag(USART1, USART_FLAG_ORE);
   }
    
    if (USART_GetFlagStatus(USART1, USART_FLAG_FE) != RESET)
   {
       USART_ReceiveData(USART1);
      USART_ClearFlag(USART1, USART_FLAG_FE);
   }
    
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {   
        USART_ClearFlag(USART1, USART_FLAG_RXNE);
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        Data = USART_ReceiveData(USART1);
    }
}

 

但还是会偶尔会死机,我原先的做法是加上独立看门狗,这样死机后立即复位。但是复位的声音,使用者不了解就会认为是异常,而且系统的稳定性大打折扣。

但经过的不断研究,采用寄存器的方式,每接收一个字节就跳出中断,只要在中断开头加上

 

void USART1(void)
{  

UART1->SR = 0xf5;这里可以查SR寄存器就可以啦
Rcvuart1_Buf[Rcv_uart1_Index++] = USART_ReceiveData(USART1);


}

这种方式验证了很长时间~

再加上看门狗就能有效解决 ~~

-------------------------------------------------------------------------------

 

你可能感兴趣的:(STM32串口死机问题笔记(仅供学习用))