N76E003雙串口無法進UART1中斷問題解決辦法


最近在做有關N76E003的項目,使用到雙串口。串口的配置沒有特殊要求,最基本的配置

void Uart0_Init(void)
{
    //—————————串口0引腳初始化————————
    set_P06;
    set_P07;  
    set_ES;                                 //enable uart0 interrupt    
    InitialUART0_Timer1(9600);              //UART0 Baudrate initial,T1M=0,SMOD=0  
}

void Uart1_Init(void)
{
    //—————————串口1引腳初始化————————
    set_P02;
    set_P16;  
    set_ES_1;                               //enable uart1 interrupt
    InitialUART1_Timer3(9600);
}

並配置了中斷函數

void SerialPort0_ISR(void) interrupt 4
{
    if(RI)
    { /* if reception occur */
        clr_RI; /* clear reception flag for next reception */
        uart_receive_input(SBUF);
    }
}

void SerialPort1_ISR(void) interrupt 15
{
    if(RI_1)
    {
        clr_RI_1;
        uart1_receive_input(SBUF);
    }
}

運行程序發現無法進入串口1中斷,在使用串口1又沒辦法debug的情況下(UART1的TX_1/RX_1腳也分別是ICP的SDA/LCK腳),只能在網上找資料調試。

發現了兩篇博客非常有用,附上兩篇博客的原文鏈接。

博客1:https://blog.csdn.net/u014798590/article/details/82560796

博客2:https://blog.csdn.net/a1031238455/article/details/85382595

第一篇提出是中斷優先級的原因,並提供了源代碼。在測試之后發現並不是這樣。第二篇是在第一篇的基礎上找出了問題的根本原因。

N76E003的中斷機制是中斷產生之后對應的中斷標志位都會被置1。

 

所以問題出在了發送中斷標志位未清零,導致串口0一直處於中斷狀態,而串口0的中斷優先級是高於串口1的,所以根本無法進入串口1中斷。

因此,在中斷函數中加上清發送標志位程序

void SerialPort0_ISR(void) interrupt 4
{
    if(RI)
    { /* if reception occur */
        clr_RI; /* clear reception flag for next reception */
        uart_receive_input(SBUF);
    }
    if(TI)
    {
        clr_TI; /* if emission occur */
    }
}

void SerialPort1_ISR(void) interrupt 15
{
    if(RI_1)
    {
        clr_RI_1;
        uart1_receive_input(SBUF);
    }
    if(TI_1)
    {
        clr_TI_1; /* if emission occur */
    }
}

問題解決!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM