最近在作有關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腳),只能在網上找資料調試。spa
發現了兩篇博客很是有用,附上兩篇博客的原文連接。.net
博客1:https://blog.csdn.net/u014798590/article/details/82560796debug
博客2:https://blog.csdn.net/a1031238455/article/details/85382595調試
第一篇提出是中斷優先級的緣由,並提供了源代碼。在測試以後發現並非這樣。第二篇是在第一篇的基礎上找出了問題的根本緣由。code
N76E003的中斷機制是中斷產生以後對應的中斷標誌位都會被置1。blog
因此問題出在了發送中斷標誌位未清零,致使串口0一直處於中斷狀態,而串口0的中斷優先級是高於串口1的,因此根本沒法進入串口1中斷。get
所以,在中斷函數中加上清發送標誌位程序input
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 */ } }
問題解決!