ARM7(sc44b0)外部中断笔记 |
[ 2009-10-14 3:00:00 | By: Eddy ]
|
我的人生,何去何从 |
ARM7(sc44b0)外部中断笔记 对于sc44b0它也是一种单片机,一种比较高级的单片机而已,所以他也跟51单片机一样有外部中断,不同51单片机的是,他有8个外部中断源,对应的是8个管脚,(51只有两个,int0和int1,P3.3和P3.4),分别是Port G八个管脚。而对于外部中断4 /5/6/7很多都是共用寄存器,他们是通过或逻辑公用一个中断请求线。。下面就具体来说说使用外部中断的一些必要的配置。 一,对管脚的配置,因为Port G有三种功能用法,要通过对rPCONG的配置来选用Port G 的外部中断的功能。其配置表如下
所以应该将其配置为11; 二,中断模式的选择,中断模式有两种,FIQ(快速中断模式)和 IRQ(中断模式)两种,一般没有特殊要求都用IRQ模式即可。可以通过对中断模式寄存器rINTMOD配置获得。如表下
三,是否允许中断,即中断使能位。通过对中断控制寄存器INTCON的配置即可,如表下通过对中断控制寄存器的配置即可,
可以看出只要让intcon的【1】位置零即可使中断使能。 四,外部中断方式的选择,低电平或上升沿触发呢,还是别的,这就要对外部中断方式寄存器(EXTINT)的配置,其表如下
由上表可知,如果要用下降沿触发,就可将EXTINT 的值给0x22222222; 将所有的外部中断都设置为下降沿触发。 五,当中断捕抓到以后,要引起什么变化呢?或者说用什么来捕抓呢?在sc44b0中用了两个寄存器来捕抓,一个中断挂起寄存器(INTPND),和外部中断挂起寄存器(EXINTPND),一开始不明白挂起是什么意思,后来才懂,差不多就相当与51单片机的标志位一样,当中断发生后,就将挂起寄存器的对应的某一位置一或置零,外部中断挂起寄存器如表下
中断挂起寄存器:当中断产生后,是将INTPND的【21】位 置一的; 所以,判断有无外部中断,就可以通过读取挂起寄存器对应的为,即可知道是否有无中断。 六,当中断发生后,挂起寄存器的对应位(即中断标志位)也发生了置位,那如果要检测下一个中断,就得将挂起寄存器的对应为复原,那怎么复原呢?在51单片机中是将中断标志位软件置零就可,在44b0中也是同样的道理,它是通过将对应的中断挂起寄存器的位置一就行了,对于EXTINTPND,他是直接将对应的位置一,对于EXTINTPND是通过将rI_ISPC的对应位置一(EXTINTPND和I_ISP的位数是一样的,两个是相互对应的) 附上程序; #define EXTINT4 0 #define EXTINT5 1 #define EXTINT6 2 #define EXTINT7 3
#define EXTINT4567 21
#define INTTRIG_LOW 0x00 #define INTTRIG_HIGH 0x01 #define INTTRIG_FALLING 0x02 #define INTTRIG_RISING 0x04 #define INTTRIG_BOTHEDGE 0x05
void KeyLedTest (void) { U32 dwVal;
//设置IO 口PORT G rPCONG |= 0xff00;//设置GP4--GP7为中断输入脚配置11的时候为中断输入脚
//设置中断 rINTMOD &= ~MASK_BIT(21);//中断模式寄存器即设置为快速中断或普通中断mo //rINTMOD &= ~MASK_BIT(21)作用是让rINTCON的21位置零 //0是IRQ是指中断模式,1是FIR是指快速中断模式 rINTCON &= ~MASK_BIT(1);//INTCON第一位为0表示允许所有中断
//设置EXTINT4,5,6,7中断模式,我们这里使用低电平触发 // rEXTINT &= 0xffff; //先清除EXTINT4,5,6,7的相应设置bit位 // 外部中断寄存器,设置为双边沿触发
for (;;) { dwVal = rINTPND; if ((dwVal & MASK_BIT(21)) == 0) { continue; }
//EXTINTPND 寄存器,判断是哪个外部中断触发 dwVal = rEXTINTPND;//仿真的时候实际上是到这里的时候读取 // rEXTINTPND外部中断挂起寄存器 if ((dwVal & MASK_BIT(EXTINT4)) != 0)//判断rINTPND对应的挂起中断 //寄存器是否为0或1 {
rEXTINTPND |= MASK_BIT(EXTINT4);//絩EXTINTPND 的EXTINT4位置一清?除EXTINTPND 是通过对EXTINTPND 对应的位写1来清除的 //外部中断4 产生了,点亮LED1 sysUtilsLightLed (LED1, TRUE); printf("LED1 is on;/n");
}
if ((dwVal & MASK_BIT(EXTINT5)) != 0) { rEXTINTPND |= MASK_BIT(EXTINT5); //外部中断4 产生了,点亮LED2 sysUtilsLightLed (LED2, TRUE); printf("LED2 is on;/n"); }
if ((dwVal & MASK_BIT(EXTINT6)) != 0) { rEXTINTPND |= MASK_BIT(EXTINT6); //外部中断4 产生了,点亮LED3 sysUtilsLightLed (LED3, TRUE); printf("LED3 is on;/n"); }
if ((dwVal & MASK_BIT(EXTINT7)) != 0) { rEXTINTPND |= MASK_BIT(EXTINT7); //外部中断4 产生了,点亮LED1,2,3 sysUtilsLightLed (LED_ALL, FALSE); printf("all leds灯 is off;/n"); } //最后清除中断位 //rI_ISPC |= MASK_BIT(21); rI_ISPC = dwVal;//对I_ISPC/ F_ISPC写入1,INTPND 将被自动清除 } } |