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);
//使用者資料處理函數
}
}
檢視手冊
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLyAzNiVGM0MzYiJWNzQzNiVDN0QDOjNTYwIGM4EmM2gzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
即表示資料有接收的情況下,再接收到一個位元組,就會置位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處,再全速運作,能正常運作了。