<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > S3C2440外部中斷之按鍵中斷

          S3C2440外部中斷之按鍵中斷

          作者: 時間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
          要做2440的中斷實驗。首先要了解ARM的中斷體系結(jié)構(gòu)。ARM體系CPU有七種工作模式。分別是:

          用戶模式(usr):ARM處理器正常程序執(zhí)行狀態(tài)。

          本文引用地址:http://www.ex-cimer.com/article/201611/316623.htm

          快速中斷模式(fiq):用于高速數(shù)據(jù)傳輸或通道處理。

          中斷模式(irq):用于通用的中斷處理。

          管理模式(svc):操作系統(tǒng)使用的保護模式。

          數(shù)據(jù)訪問終止模式(abt):當數(shù)據(jù)或指令預取終止時進入該模式,可用于虛擬存儲及存儲保護。

          系統(tǒng)模式(sys):運行具有特權(quán)的操作系統(tǒng)任務(wù)。

          未定義指令終止模式(und):當未定義的指令執(zhí)行時進入該模式,可用于支持硬件協(xié)處理器的軟件仿真。

          此外,ARM體系的CPU有兩種工作狀態(tài),分別是:ARM狀態(tài)、Thumb狀態(tài)。

          實際上,CPU一上電就工作在ARM狀態(tài),所以我們不必關(guān)心CPU工作狀態(tài)。

          每一種工作模式對應相應的寄存器,這里就不詳細說了。可以自己查閱相關(guān)資料。

          CPU處理不預期事件有以下兩種方法:

          1.查詢方式:程序循環(huán)的查詢各個設(shè)備的狀態(tài)并作出相應的反應。

          2.當某些事件發(fā)生時,硬件會設(shè)置某個寄存器;CPU在每執(zhí)行完一個指令時,通過硬件查看這個寄存器,如果發(fā)現(xiàn)所關(guān)注的事件發(fā)生了,則中斷當前程序流程,跳轉(zhuǎn)到一個固定的地址處理這件事,最后返回繼續(xù)執(zhí)行被中斷的程序。

          我們來看一個中斷處理框圖

          可以看出帶子中斷的要比不帶子中斷的處理過程多兩個寄存器。這里面涉及到的寄存器就要看s3c2440的芯片手冊了。
          我們再來看一張圖,來了解各個寄存器的關(guān)系。
          現(xiàn)在來看一下2440外部中斷的引腳
          I/O引腳F腳與外部中斷引腳EINT復用引腳。
          現(xiàn)在結(jié)合代碼來說明中斷處理過程。

          #include "2440addr.h"
          #define U32 unsigned int

          static void __irq Key1_ISR(void) //EINT3
          {
          int led;
          rSRCPND = rSRCPND | (0x1<<3);//EINT1開中斷請求 EINT3位置一
          rINTPND = rINTPND | (0x1<<3);//經(jīng)過仲裁器選出優(yōu)先級高的中斷后,這個中斷在INTPND寄存器中相應位置一
          led = rGPBDAT & (0x1<<6);
          if (led ==0)
          rGPBDAT = rGPBDAT | (0x1<<6);//原本是亮的,熄滅
          else
          rGPBDAT = rGPBDAT & ~(0x1<<6);//原本是滅的,點亮
          }

          static void __irq Key2_ISR(void) //EINT4
          {
          int led;
          rSRCPND = rSRCPND | (0x1<<4);
          rINTPND = rINTPND | (0x1<<4);
          if(rEINTPEND&(1<<4))
          {
          rEINTPEND = rEINTPEND | (0x1<<4);
          led = rGPBDAT & (0x1<<5);
          if (led ==0)
          rGPBDAT = rGPBDAT | (0x1<<5);
          else
          rGPBDAT = rGPBDAT & ~(0x1<<5);
          }
          }

          static void __irq Key3_ISR(void) //EINT2
          {
          int led;
          rSRCPND = rSRCPND | (0x1<<2);
          rINTPND = rINTPND | (0x1<<2);
          led = rGPBDAT & (0x1<<8);
          if (led ==0)
          rGPBDAT = rGPBDAT | (0x1<<8);
          else
          rGPBDAT = rGPBDAT & ~(0x1<<8);
          }

          void __irq Key4_ISR(void) //EINT0
          {
          int led;
          rSRCPND = rSRCPND | 0x1;
          rINTPND = rINTPND | 0x1;
          led = rGPBDAT & (0x1<<10);
          if (led ==0)
          rGPBDAT = rGPBDAT | (0x1<<10);
          else
          rGPBDAT = rGPBDAT & ~(0x1<<10);
          }

          void Main(void)
          {
          int light;

          rGPBCON = 0x155550;//0000 0001 0101 0101 0101 0000
          rGPBUP = 0x7ff;//上拉無效
          rGPFCON = 0xaaaa;//1010 1010 1010 1010 GPF管腳均設(shè)為中斷模式

          rSRCPND = 0x1d;//0001 1101 EINT0、2、3、4_7開
          rINTMSK = ~0x1d;//屏蔽關(guān)
          rINTPND =0x1d;
          rEINTPEND = (1<<4);
          rEINTMASK = ~(1<<4);
          rEXTINT0 = 0x22222;//0010 0010 0010 0010 0010 設(shè)計觸發(fā)方式 均設(shè)為下降沿

          light = 0x0;
          rGPBDAT = ~light;

          pISR_EINT0 = (U32)Key4_ISR;
          pISR_EINT3 = (U32)Key1_ISR;
          pISR_EINT2 = (U32)Key3_ISR;
          pISR_EINT4_7 = (U32)Key2_ISR;

          while(1)
          ;
          }
          //******************************************************************************/

          SRCPND/INPND設(shè)置要保持一致,負責哪些中斷的開關(guān)。INTMSK是總的中斷屏蔽。EINTPEND/EINTMASK只有外部中斷EINT4-EINT23需要設(shè)置,在EXTINT0寄存器中設(shè)置觸發(fā)方式。

          //********************************************************************************/

          pISR_EINT0-pISR_EINT4_7 定義的是中斷向量入口地址,在2440addr.h文件中。如圖:



          關(guān)鍵詞: S3C2440外部中斷按鍵中

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();