找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1725|回復(fù): 0
收起左側(cè)

ARM UART0中斷例程問題

[復(fù)制鏈接]
ID:107189 發(fā)表于 2016-3-6 13:22 | 顯示全部樓層 |閱讀模式
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ù)提問。希望你滿意。

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表