S3C2440中斷控制器
UART、IIC等等。在這些中斷源中,UARTn、AC97 和EINTn中斷對(duì)于中斷控制器而言是“或”關(guān)系。
當(dāng)從內(nèi)部外設(shè)和外部中斷請(qǐng)求引腳收到多個(gè)中斷請(qǐng)求時(shí),中斷控制器在仲裁步驟后請(qǐng)求ARM920T 內(nèi)核的FIQ
或IRQ。
中斷控制器所用到的專業(yè)寄存器,其詳細(xì)的使用請(qǐng)看數(shù)據(jù)手冊(cè)
SRCPND 中斷標(biāo)志(掛起)寄存器
寫(xiě)1時(shí) 對(duì)應(yīng)位中斷源有中斷請(qǐng)求,寫(xiě)0時(shí),對(duì)應(yīng)位中斷源無(wú)中斷請(qǐng)求
INTPND 中斷服務(wù)(掛起)寄存器
寫(xiě)1時(shí) 對(duì)應(yīng)位中斷源被響應(yīng),寫(xiě)0時(shí),對(duì)應(yīng)位中斷源未被響應(yīng)
。。。。。。。。。
現(xiàn)在主要說(shuō)下外部中斷(其寄存器使用說(shuō)明在數(shù)據(jù)手冊(cè)的輸入輸出端口章節(jié))
S3C2440有24個(gè)外部中斷,GPF0--GPF7對(duì)應(yīng)于外部中斷EINT0--EINT7,GPG0--GPG15對(duì)應(yīng)于外部中斷EINT8--EINT23,支持上升沿、下降沿、高電平、低電平、雙邊沿觸發(fā)。
EXTINTn(外部中斷控制寄存器)
EINTFLTn(外部中斷濾波寄存器)
EINTMASK(外部中斷屏蔽寄存器)
EINTPEND(外部中斷掛起寄存器)
設(shè)置外部中斷的一般步驟
1,選擇管腳功能為外部中斷功能
2,設(shè)置觸發(fā)方式
3,清中斷源掛起寄存器,中斷服務(wù)寄存器(可選,防止原有中斷干擾)
4,設(shè)置中斷模式(IRQ、FRQ, 默認(rèn)為IRQ)
5,設(shè)置中斷優(yōu)先級(jí)(可選,一般默認(rèn))
6,打開(kāi)外部中斷屏蔽
7,設(shè)置中斷服務(wù)入口程序
外部中斷按鍵按一下進(jìn)入中斷程序?qū)?yīng)LED燈閃一下
- #include"2440addr.h"
- #include"option.h"http://這個(gè)文件中定義了中斷服務(wù)程序的起始地址
- #defineLED1_ON(rGPBDAT&=~(1<<5))
- #defineLED1_OFF(rGPBDAT|=(1<<5))
- #defineLED2_ON(rGPBDAT&=~(1<<6))
- #defineLED2_OFF(rGPBDAT|=(1<<6))
- #defineLED3_ON(rGPBDAT&=~(1<<7))
- #defineLED3_OFF(rGPBDAT|=(1<<7))
- #defineLED4_ON(rGPBDAT&=~(1<<8))
- #defineLED4_OFF(rGPBDAT|=(1<<8))
- voidDelay(void)
- {
- inti;
- for(i=0;i<100000;i++);
- }
- void__irqIRQ_KEY1(void)
- {
- rSRCPND|=(1<<1);//清除中斷標(biāo)志位
- rINTPND|=(1<<1);
- LED1_ON;
- Delay();
- LED1_OFF;
- }
- void__irqIRQ_KEY2(void)
- {
- rSRCPND|=(1<<4);//清除中斷標(biāo)志位
- rINTPND|=(1<<4);
- rEINTPEND|=(1<<4);//清除ENIT4的中斷標(biāo)志位
- LED2_ON;
- Delay();
- LED2_OFF;
- }
- void__irqIRQ_KEY3(void)
- {
- rSRCPND|=(1<<2);//清除中斷標(biāo)志位
- rINTPND|=(1<<2);
- LED3_ON;
- Delay();
- LED3_OFF;
- }
- void__irqIRQ_KEY4(void)
- {
- rSRCPND|=1<<0;//清除中斷標(biāo)志位
- rINTPND|=1<<0;
- LED4_ON;
- Delay();
- LED4_OFF;
- }
- voidEint_Init(void)
- {
- rGPFCON&=~(0x33f);
- rGPFCON|=0x22a;//設(shè)置GPF0、1、2、4為中斷輸入功能
- rEXTINT0=0x20222;//ENIT0、1、2、4下降沿觸發(fā)中斷
- rSRCPND=0x17;//清除ENIT0、1、2、4的中斷標(biāo)志位
- rINTPND=0x17;//清除ENIT0、1、2、4的中斷標(biāo)志位
- rEINTPEND=(1<<4);//清除ENIT4的中斷標(biāo)志位
- rINTMOD=0x0;//所有中斷為IRQ中斷
- rINTMSK&=~0x17;//ENIT0、1、2、4中斷服務(wù)有效(這里就是使能外部中斷)
- rEINTMASK&=~(1<<4);//EINT4中斷服務(wù)有效
- pISR_EINT0=(unsigned)IRQ_KEY4;//設(shè)置各中斷服務(wù)子程序地址
- pISR_EINT1=(unsigned)IRQ_KEY1;
- pISR_EINT2=(unsigned)IRQ_KEY3;
- pISR_EINT4_7=(unsigned)IRQ_KEY2;
- }
- voidMain(void)
- {
- rGPBCON&=~((3<<10)|(3<<12)|(3<<14)|(3<<16));//對(duì)GPBCON[10:17]清零
- rGPBCON|=((1<<10)|(1<<12)|(1<<14)|(1<<16));//設(shè)置GPB5~8為輸出
- rGPBUP&=~((1<<5)|(1<<6)|(1<<7)|(1<<8));//設(shè)置GPB5~8的上拉功能
- rGPBDAT|=(1<<5)|(1<<6)|(1<<7)|(1<<8);//關(guān)閉LED
- Eint_Init();
- while(1);
- }
評(píng)論