×
单片机 > 单片机程序设计 > 详情

ARM7入门8,向量IRQ中断

发布时间:2020-05-28 发布时间:
|

主程序:


/*******************************************************************************
*File: Main.c
*功能: 使能外部中断0和外部中断1,当外部中断0有效时,控制LED1取反;
*      当外部中断1有效时,控制LED2取反
*******************************************************************************/
#include  "config.h"
#define   LED1CON   0x00000400   /*P0.10引脚控制LED1,低电平点亮*/
#define   LED2CON   0x00000800   /*P0.11引脚控制LED2,低电平点亮*/


/*******************************************************************************
*名称:IRQ_Eint0()
*功能:外部中断EINT0服务函数,取反LED1
*******************************************************************************/
void  __irq  IRQ_Eint0(void)
{  uint32   i;
   
   i=VICIRQStatus;               //读出VICIRQStatus的值
   i=IO0SET;                      //读取当前LED1控制值
   if((i&LED1CON)==0)            //控制LED1输出
   { IO0SET=LED1CON;
   }
   else
   { IO0CLR=LED1CON;
   }
   while((EXTINT&0x01)!=0)       //等待外部中断信号恢复为高电平
   { EXTINT=0x01;                  //清除EINT0中断标志
   }
   VICVectAddr=0x00;
}
/*******************************************************************************
*名称: IRQ_Eint1()
*功能: 外部中断EINT1服务函数,取反LED2
*******************************************************************************/
void  __irq IRQ_Eint1(void)
{ uint32  i;

  i=VICIRQStatus;                  //读出VICIRQStatus的值
  
  i=IO0SET;                         //读出当前LED2控制值
  if((i&LED2CON)==0)               //控制LED2控制值
  { IO0SET=LED2CON; 
  }
  else
  { IO0CLR=LED2CON;
  }
  while((EXTINT&0x02)!=0)          //等待外部中断信号恢复为高电平
  { EXTINT=0x02;                   //清除EINT1中断标志
  }
  
  VICVectAddr=0x00;
}
/*******************************************************************************
*名称:main()
*功能:初始化外部中断0,外部中断1及I/O连接等
*******************************************************************************/
int main(void)
{ PINSEL0=0x20000000;               //设置I/O口工作模式,P0.14设置为EINT1
  PINSEL1=0x00000001;               //P0.16设置为EINT0
  IO0DIR=LED1CON|LED2CON;            //设置LED1,LED2控制口为输出,其它I/O为输入
  IO0CLR=LED1CON|LED2CON;
  
  IO0SET=LED1CON|LED2CON;
  VICIntSelect=0x00000000;          //设置所有通道为IRQ中断
  VICVectCntl0=0x2E;                //EINT0通道分配到IRQ Slot0,即优先级最高
  VICVectAddr0=(int)IRQ_Eint0;      //设置EINT0向量地址
  VICVectCntl1=0x2F;
  VICVectAddr1=(int)IRQ_Eint1;
  VICIntEnable=0x0001C000;          //使能EINT0,EINT1中断
  EXTINT=0x07;                       //清除外部中断
 
  while(1);                         //等待中断
 // return(0);
}

关键字:ARM7入门  向量IRQ中断

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32 TIMER2的使用