|
void __irq IrqUart0(void)
{
// uint8 i;
// uint8 RxData;
OS_ENTER_CRITICAL();
//判斷是否有中斷掛起,如果有進(jìn)入中斷
while( (U0IIR & 0x01) == 0)
{
switch( (U0IIR & 0x0E))
{
case 0x06: //RLS中斷
while( (U0LSR & 0x01) == 0);
// RxData = U0RBR;
U0THR = 'A';
while( (U0LSR & 0x40)==0);
break;
case 0x04: //RDA中斷 讀取數(shù)據(jù),接收數(shù)據(jù)可用
DealPack();
break;
case 0x0C: //CTI中斷 禁止接收及字符超時(shí)中斷
DealPack();
break;
case 0x02: //THRE中斷
// while( (U0LSR & 0x20) == 1);
// RxData = U0RBR;
U0THR = 'D';
while( (U0LSR & 0x40)==0);
break;
}
}
OS_EXIT_CRITICAL();
VICVectAddr = 0;
}
誰哪位大哥幫忙釋一下這個(gè)程序,為什么U0IIR與0X0E相與呢,而不跟別的值相與呢,哪里是不是有這樣的規(guī)定必須與0X0E相與啊??謝謝!
最佳答案
你可以查一下ARM資料,在UART0中斷處理的表格中,U0IIR[3:0]為0001時(shí),表示沒有該中斷,最后不為1表示有中斷,所以對(duì)應(yīng)程序看,與0X01與,沒有中斷就不進(jìn)入while循環(huán)。后面switch( (U0IIR & 0x0E)) 可以寫成switch(U0IIR) 本身沒有錯(cuò)誤,但對(duì)于資深的程序員,這樣的習(xí)慣是非常好的。由于判斷前三位,所以就是應(yīng)該與上1110也就是十六位的E。
程序后面翻譯可以理解為,如果有中斷產(chǎn)生,數(shù)值0X06,4,C,2分別對(duì)應(yīng)相應(yīng)的功能,就可以判斷具體的中斷原因了。具體功能還是去看ARM的UART0一章便非常清楚了。
如果還有問題可以繼續(xù)提問。希望你滿意。
|
|