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

          新聞中心

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

          S3C2440外部中斷之按鍵中斷

          作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏
          要做2440的中斷實(shí)驗(yàn)。首先要了解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)使用的保護(hù)模式。

          數(shù)據(jù)訪問(wèn)終止模式(abt):當(dāng)數(shù)據(jù)或指令預(yù)取終止時(shí)進(jìn)入該模式,可用于虛擬存儲(chǔ)及存儲(chǔ)保護(hù)。

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

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

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

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

          每一種工作模式對(duì)應(yīng)相應(yīng)的寄存器,這里就不詳細(xì)說(shuō)了??梢宰约翰殚喯嚓P(guān)資料。

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

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

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

          我們來(lái)看一個(gè)中斷處理框圖

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

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

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

          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;//上拉無(wú)效
          rGPFCON = 0xaaaa;//1010 1010 1010 1010 GPF管腳均設(shè)為中斷模式

          rSRCPND = 0x1d;//0001 1101 EINT0、2、3、4_7開(kāi)
          rINTMSK = ~0x1d;//屏蔽關(guān)
          rINTPND =0x1d;
          rEINTPEND = (1<<4);
          rEINTMASK = ~(1<<4);
          rEXTINT0 = 0x22222;//0010 0010 0010 0010 0010 設(shè)計(jì)觸發(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è)置要保持一致,負(fù)責(zé)哪些中斷的開(kāi)關(guān)。INTMSK是總的中斷屏蔽。EINTPEND/EINTMASK只有外部中斷EINT4-EINT23需要設(shè)置,在EXTINT0寄存器中設(shè)置觸發(fā)方式。

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

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



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

          評(píng)論


          技術(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); })();