天天看點

GD32序列槽一直進溢出中斷

GD32單片機在調試序列槽時,在#1處打斷點,會導緻序列槽溢出中斷,再全速運作,會不斷地進#2處,但不會進#1。

void USART0_IRQHandler(void)
{
  uint8_t dat; 

  if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) //#2
  {
    dat= usart_data_receive(USART0);	//#1	
    usart_interrupt_flag_clear(USART0,USART_INT_FLAG_RBNE);
    //使用者資料處理函數    
  }
}
           

檢視手冊

GD32序列槽一直進溢出中斷
GD32序列槽一直進溢出中斷

即表示資料有接收的情況下,再接收到一個位元組,就會置位ORERR。這裡預設開啟了溢出中斷。這裡和51單片機和ST的晶片有所不同。是以在序列槽接收中斷中,需考慮這種情況,下面是優化之後的代碼

void USART0_IRQHandler(void)
{
  uint8_t dat; 

  if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE_ORERR)) 
  {   
    dat= usart_data_receive(USART0);		//#2
    usart_interrupt_flag_clear(USART0,USART_INT_FLAG_RBNE_ORERR);
    return;
  }
  if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) 
  {
    dat= usart_data_receive(USART0);		//#1
    usart_interrupt_flag_clear(USART0,USART_INT_FLAG_RBNE);
    //使用者資料處理函數    
  }
}
           

在#1處打斷點,會導緻序列槽溢出中斷,再全速運作,會直接進#2處,再全速運作,能正常運作了。

繼續閱讀