S3C2440A 中的中止操控器承受来自 60 个中止源的恳求。供给这些中止源的是内部外设,如 DMA 操控器、
UART、IIC等等。在这些中止源中,UARTn、AC97 和EINTn中止关于中止操控器而言是“或”联系。
当从内部外设和外部中止恳求引脚收到多个中止恳求时,中止操控器在裁定过程后恳求ARM920T 内核的FIQ
或IRQ。
中止操控器所用到的专业寄存器,其具体的运用请看数据手册
SRCPND 中止标志(挂起)寄存器
写1时 对应位中止源有中止恳求,写0时,对应位中止源无中止恳求
INTPND 中止服务(挂起)寄存器
写1时 对应位中止源被呼应,写0时,对应位中止源未被呼应
。。。。。。。。。
现在首要说下外部中止(其寄存器运用说明在数据手册的输入输出端口章节)
S3C2440有24个外部中止,GPF0–GPF7对应于外部中止EINT0–EINT7,GPG0–GPG15对应于外部中止EINT8–EINT23,支撑上升沿、下降沿、高电平、低电平、双边缘触发。
EXTINTn(外部中止操控寄存器)
EINTFLTn(外部中止滤波寄存器)
EINTMASK(外部中止屏蔽寄存器)
EINTPEND(外部中止挂起寄存器)
设置外部中止的一般过程
1,挑选管脚功用为外部中止功用
2,设置触发方法
3,清中止源挂起寄存器,中止服务寄存器(可选,避免原有中止搅扰)
4,设置中止形式(IRQ、FRQ, 默以为IRQ)
5,设置中止优先级(可选,一般默许)
6,翻开外部中止屏蔽
7,设置中止服务进口程序
外部中止按键按一下进入中止程序对应LED灯闪一下
- #include”2440addr.h”
- #include”option.h”//这个文件中界说了中止服务程序的开始地址
- #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);//铲除中止标志位
- rINTPND|=(1<<1);
- LED1_ON;
- Delay();
- LED1_OFF;
- }
- void__irqIRQ_KEY2(void)
- {
- rSRCPND|=(1<<4);//铲除中止标志位
- rINTPND|=(1<<4);
- rEINTPEND|=(1<<4);//铲除ENIT4的中止标志位
- LED2_ON;
- Delay();
- LED2_OFF;
- }
- void__irqIRQ_KEY3(void)
- {
- rSRCPND|=(1<<2);//铲除中止标志位
- rINTPND|=(1<<2);
- LED3_ON;
- Delay();
- LED3_OFF;
- }
- void__irqIRQ_KEY4(void)
- {
- rSRCPND|=1<<0;//铲除中止标志位
- rINTPND|=1<<0;
- LED4_ON;
- Delay();
- LED4_OFF;
- }
- voidEint_Init(void)
- {
- rGPFCON&=~(0x33f);
- rGPFCON|=0x22a;//设置GPF0、1、2、4为中止输入功用
- rEXTINT0=0x20222;//ENIT0、1、2、4下降沿触发中止
- rSRCPND=0x17;//铲除ENIT0、1、2、4的中止标志位
- rINTPND=0x17;//铲除ENIT0、1、2、4的中止标志位
- rEINTPEND=(1<<4);//铲除ENIT4的中止标志位
- rINTMOD=0x0;//一切中止为IRQ中止
- rINTMSK&=~0x17;//ENIT0、1、2、4中止服务有用(这儿便是使能外部中止)
- rEINTMASK&=~(1<<4);//EINT4中止服务有用
- pISR_EINT0=(unsigned)IRQ_KEY4;//设置各中止服务子程序地址
- 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));//对GPBCON[10:17]清零
- rGPBCON|=((1<<10)|(1<<12)|(1<<14)|(1<<16));//设置GPB5~8为输出
- rGPBUP&=~((1<<5)|(1<<6)|(1<<7)|(1<<8));//设置GPB5~8的上拉功用
- rGPBDAT|=(1<<5)|(1<<6)|(1<<7)|(1<<8);//封闭LED
- Eint_Init();
- while(1);
- }