一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

s3c2440之外部中斷

 創(chuàng)科之龍 2012-01-05

對(duì)s3c2440的硬件操作無非就是配置寄存器,中斷也不例外:

需要設(shè)置的寄存器:

      GPGCON :引腳配置寄存器,設(shè)置為第二功能,中斷引腳;

      EINTPEND:中斷掛起寄存器,當(dāng)有中斷發(fā)生且沒有被屏蔽,相應(yīng)位會(huì)自動(dòng)置1,在進(jìn)入中斷服務(wù)程序后必須用軟件將其相應(yīng)位清0以免發(fā)生錯(cuò)誤中斷;

      SRCPND:源掛起寄存器由32位組成,其每一位都涉及一個(gè)中斷源。如果中斷源產(chǎn)生了中斷則相應(yīng)的位被置1并且等待中斷服務(wù)。此寄存器指示出是哪個(gè)中斷源正在等待請(qǐng)求服務(wù)。

   注意:此寄存器不顧INTMAST的屏蔽位,由硬件自動(dòng)將相應(yīng)中斷位置1,在進(jìn)入中斷服務(wù)程序后必須通過寫1清除相應(yīng)位,以防發(fā)生錯(cuò)誤中斷。

      EINTMASK:外部中斷屏蔽寄存器,若相應(yīng)位置1;則相應(yīng)中斷被屏蔽不會(huì)產(chǎn)生下一級(jí)請(qǐng)求;

     INTPND:中斷掛起寄存器中32位的每一位都表明了是否相應(yīng)位未被屏蔽并且正在等待中斷服務(wù)的中斷請(qǐng)求具有最高的優(yōu)先級(jí)。

   注意:在多個(gè)中斷共用一個(gè)中斷服務(wù)程序時(shí)可能通過判斷INPND的相應(yīng)位知道是哪個(gè)中斷發(fā)生(比如本次實(shí)驗(yàn)),但確定相應(yīng)位以后必須對(duì)其寫1防止引發(fā)錯(cuò)誤中斷。


下圖將說明中斷如何被通知到CPU:

如果中斷源產(chǎn)生了中斷則SRCPND和INTPND相應(yīng)的位被置1,前提是SUBMASK和MASK相應(yīng)位不使能(即中斷開啟),MODE決定是IRQ還是FIQ,PRIORITY決定中斷優(yōu)先級(jí)

具體編程流程如下:

要想正確地執(zhí)行2440的外部中斷,一般需要完成兩個(gè)部分內(nèi)容:中斷初始化和中斷處理函數(shù)。

1,具體執(zhí)行中斷之前,要初始化好要用的中斷。2440的外部中斷引腳EINT與通用IO引腳F和G復(fù)用,要想使用中斷功能,就要把相應(yīng)的引腳配置成中斷模式。

  1. rGPGCONrGPGCON = rGPGCON & (~((3<<22)|(3<<6)|(3<<0)|(3<<10)|(3<<12)|(3<<14))) |    //相應(yīng)位清零  
  2. ((2<<22)|(2<<6)|(2<<0)|(2<<10)|(2<<12)|(2<<14)) ;       //GPG11,3,0,5,6,7set EINT第二功能  


配置完引腳后,還需要配置具體的中斷功能。我們要打開某一中斷的屏蔽,這樣才能響應(yīng)該中斷,相對(duì)應(yīng)的寄存器為INTMSK;如:

  1. rEINTMASK &= ~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19)); //enable eint8, 11,13,14,15,19  


還要設(shè)置外部中斷的觸發(fā)方式,如低電平、高電平、上升沿、下降沿等,相對(duì)應(yīng)的寄存器為EXTINTn。如:

  1. rEXTINT1 &= ~(7|(7<<0));//clear  3 bits     
  2. rEXTINT1 |= (0|(0<<0));   //set eint8 low level int  


另外由于EINT4到EINT7共用一個(gè)中斷向量,EINT8到EINT23也共用一個(gè)中斷向量,而INTMSK只負(fù)責(zé)總的中斷向量的屏蔽,要具體打開某一具體的中斷屏蔽,還需要設(shè)置EINTMASK。如:

  1. rEINTMASK &= ~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19)); //enable eint8, 11,13,14,15,19  


上面介紹的是最基本的初始化,當(dāng)然還有一些其他的配置,如當(dāng)需要用到快速中斷時(shí),要使用INTMOD,當(dāng)需要配置中斷優(yōu)先級(jí)時(shí),要使用PRIORITY等。

2. 中斷處理函數(shù)負(fù)責(zé)執(zhí)行具體的中斷指令,除此以外還需要把SRCPND和INTPND中的相應(yīng)的位清零(通過置1來清零),因?yàn)楫?dāng)中斷發(fā)生時(shí),2440會(huì)自動(dòng)把這兩個(gè)寄存器中相對(duì)應(yīng)的位置1,以表示某一中斷發(fā)生,如果不在中斷處理函數(shù)內(nèi)把它們清零,系統(tǒng)會(huì)一直執(zhí)行該中斷函數(shù)。如:

  1. <span style="font-family:SimSun;">#define BIT_EINT0       (0x1)  
  2. #define BIT_EINT2       (0x1<<2)  
  3. #define BIT_EINT8_23    (0x1<<5)  
  4. ClearPending(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);         //SRCPND和INTPND中的相應(yīng)的位清零(通過置1來清零)  
  5. __inline void ClearPending(int bit)  
  6. {  
  7.     register i;  
  8.     rSRCPND = bit;  
  9.     rINTPND = bit;  
  10.     i = rINTPND;  
  11. }</span>  


另外還是由于前面介紹過的,有一些中斷是共用一個(gè)中斷向量的,而一個(gè)中斷向量只能有一個(gè)中斷執(zhí)行函數(shù),因此具體是哪個(gè)外部中斷,還需要EINTPEND來判斷,并同樣還要通過置1的方式把相應(yīng)的位清零。

  1. rEINTPEND |= (1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19);        //clear eint8, 11,13,14,15,19  


keysan.c源碼:

  1. /**************************************************************  
  2. 4*4 Key Scan  
  3. **************************************************************/  
  4.   
  5. #include "def.h"  
  6. #include "option.h"  
  7. #include "2440addr.h"  
  8. #include "2440lib.h"  
  9. #include "2440slib.h"   
  10.   
  11. /******************************************************************************  
  12.     1X6 矩陣鍵盤  
  13. 六個(gè)輸入引腳: EINT8 -----( GPG0  )  
  14.                 EINT11 -----( GPG3  )  
  15.                 EINT13-----( GPG5  )  
  16.                 EINT14-----( GPG6 )  
  17.                 EINT15-----( GPG7 )  
  18.                 EINT19-----( GPG11 )  
  19.                   
  20.                   
  21. ******************************************************************************/  
  22. U8 Key_Scan( void )  
  23. {  
  24.     Delay( 80 ) ;  
  25.   
  26.     if(      (rGPGDAT&(1<< 0)) == 0 ) //按下后IO口為低電平  
  27.         return 1 ;  
  28.     else if( (rGPGDAT&(1<< 3)) == 0 )  
  29.         return 2;  
  30.     else if( (rGPGDAT&(1<< 5)) == 0 )  
  31.         return 3 ;  
  32.     else if( (rGPGDAT&(1<< 6)) == 0 )  
  33.         return 4 ;  
  34.     else if( (rGPGDAT&(1<< 7)) == 0 )  
  35.         return 5 ;  
  36.     else if( (rGPGDAT&(1<<11)) == 0 )  
  37.         return 6 ;  
  38.     else  
  39.         return 0xff;  
  40.   
  41. }  
  42.   
  43. static void __irq Key_ISR(void)  
  44. {  
  45.     U8 key;  
  46.     U32 r;  
  47.   
  48.     EnterCritical(&r);              //設(shè)置相應(yīng)cpsr的值  
  49.     if(rINTPND==BIT_EINT8_23) {    //為1表示8~23號(hào)中有中斷  
  50.         ClearPending(BIT_EINT8_23);//清除INTPND中斷標(biāo)志位  
  51.         if(rEINTPEND&(1<<8)) {     //通過EINTPEND查看具體是哪一個(gè)中斷源  
  52.                                  //eint8 occur!  
  53.             rEINTPEND |= 1<< 8;  
  54.         }  
  55.         if(rEINTPEND&(1<<11)) {  
  56.                                 //eint11 occur!  
  57.             rEINTPEND |= 1<< 11;  
  58.         }  
  59.         if(rEINTPEND&(1<<13)) {  
  60.                                 //eint13 occur!  
  61.             rEINTPEND |= 1<< 13;  
  62.         }  
  63.         if(rEINTPEND&(1<<14)) {  
  64.                                 //eint14 occur!  
  65.             rEINTPEND |= 1<< 14;  
  66.         }  
  67.         if(rEINTPEND&(1<<15)) {  
  68.                                 //eint15 occur!  
  69.             rEINTPEND |= 1<< 15;  
  70.         }  
  71.         if(rEINTPEND&(1<<19)) {  
  72.                                 //eint19 occur!       
  73.             rEINTPEND |= 1<< 19;  
  74.         }  
  75.     }  
  76.   
  77.     key=Key_Scan();//按鍵掃描,讀取按鍵鍵值  
  78.     if( key == 0xff )  
  79.         Uart_Printf( "Interrupt occur... Key is released!\n") ;  
  80.     else  
  81.         Uart_Printf( "Interrupt occur... K%d is pressed!\n", key) ;//打印信息  
  82.   
  83.     ExitCritical(&r);//恢復(fù)相應(yīng)的cpsr位  
  84. }  
  85.   
  86. void KeyScan_Test(void)  
  87. {  
  88.     Uart_Printf("\nKey Scan Test, press ESC key to exit !\n");  //串口打印  
  89.   
  90.       
  91.     rGPGCONrGPGCON = rGPGCON & (~((3<<22)|(3<<6)|(3<<0)|(3<<10)|(3<<12)|(3<<14))) |    //相應(yīng)位清零  
  92.                          ((2<<22)|(2<<6)|(2<<0)|(2<<10)|(2<<12)|(2<<14)) ;      //GPG11,3,0,5,6,7set EINT第二功能  
  93.       
  94.     rEXTINT1 &= ~(7|(7<<0));//clear  3 bits     
  95.     rEXTINT1 |= (0|(0<<0));   //set eint8 low level int  
  96.       
  97.     rEXTINT1 &= ~(7<<12);  
  98.     rEXTINT1 |= (0<<12);  //set eint11 low level int  
  99.       
  100.     rEXTINT1 &= ~(7<<20);  
  101.     rEXTINT1 |= (0<<20);  //set eint13 low level int  
  102.       
  103.     rEXTINT1 &= ~(7<<24);  
  104.     rEXTINT1 |= (0<<24);  //set eint14 low level int  
  105.       
  106.     rEXTINT1 &= ~(7<<28);  
  107.     rEXTINT1 |= (0<<28);  //set eint15 low level int  
  108.           
  109.     rEXTINT2 &= ~(0xf<<12);  
  110.     rEXTINT2 |= (0<<12);  //set eint19 low level int  
  111.       
  112.   
  113.     rEINTPEND |= (1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19);        //clear eint8, 11,13,14,15,19  
  114.     rEINTMASK &= ~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19)); //enable eint8, 11,13,14,15,19  
  115.     ClearPending(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);         //清除相應(yīng)中斷源的位  
  116.     pISR_EINT0 = pISR_EINT2 = pISR_EINT8_23 = (U32)Key_ISR;//得到相應(yīng)中斷信息  
  117.     EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);    //打開相應(yīng)中斷源eint0,2,8~23  
  118.   
  119.      while( Uart_GetKey() != ESC_KEY ) ;//使能中斷后在此等待,直到按鍵中斷產(chǎn)生,跳到Key_ISR();  
  120.      DisableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);//關(guān)閉相應(yīng)中斷源eint0,2,8~23,中斷已發(fā)生,禁止再次中斷      
  121. }  

效果圖:

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    亚洲中文字幕三区四区| 国产精品日本女优在线观看| 亚洲男女性生活免费视频| 日韩欧美91在线视频| 91免费精品国自产拍偷拍| 免费啪视频免费欧美亚洲| 伊人欧美一区二区三区| 欧美日韩国产自拍亚洲| 久七久精品视频黄色的| 亚洲一区二区三区精选| 国产精品二区三区免费播放心| 欧美又大又黄刺激视频| 国产精品日韩精品最新| 亚洲中文字幕在线综合视频| 草草夜色精品国产噜噜竹菊| 一区二区在线激情视频| 欧美不卡午夜中文字幕| 日本人妻中出在线观看| 欧美自拍系列精品在线| 国产日韩欧美在线播放| 精品视频一区二区三区不卡| 老司机精品视频在线免费| 国产精品一区二区传媒蜜臀| 日韩午夜老司机免费视频| 色婷婷国产熟妇人妻露脸| 欧美一级特黄特色大色大片| 日韩精品一区二区亚洲| 人妻精品一区二区三区视频免精 | 91人妻人澡人人爽人人精品| 成年女人下边潮喷毛片免费| 日本av在线不卡一区| 天堂网中文字幕在线观看| 91人妻丝袜一区二区三区| av中文字幕一区二区三区在线| 黄色激情视频中文字幕| 中日韩美一级特黄大片| 日韩欧美亚洲综合在线| 老司机精品一区二区三区| 日韩中文字幕有码午夜美女| 国产亚洲系列91精品| 日韩欧美国产三级在线观看|