当前位置: 代码迷 >> 综合 >> ARM7(sc44b0)外部中断笔记---转载
  详细解决方案

ARM7(sc44b0)外部中断笔记---转载

热度:41   发布时间:2023-12-09 19:54:39.0
ARM7(sc44b0)外部中断笔记
[ 2009-10-14 3:00:00 | By: Eddy ]
 我的人生,何去何从

                 ARM7sc44b0)外部中断笔记

   对于sc44b0它也是一种单片机,一种比较高级的单片机而已,所以他也跟51单片机一样有外部中断,不同51单片机的是,他有8个外部中断源,对应的是8个管脚,(51只有两个,int0int1P3.3P3.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的对应位置一(EXTINTPNDI_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)作用是让rINTCON21位置零

                                          //0IRQ是指中断模式,1FIR是指快速中断模式

  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对应的挂起中断

                                                                   //寄存器是否为01

    {

  

   

   

      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 将被自动清除

  }

}