USB中国技术论坛

armer 发表于 2006-8-3 20:42

ARM外部中断笔记

[b]ARM外部中断笔记[/b]

作者:转载



#include     // Philips Peripheral Registers
#include "LPC21xxDEF.H"    //ARM菜鸟HotPower创建定义文件
/*
* software interrupt function accept parameters and run in
* supervisor mode (interrupt protected).
*/
int myfunc1 (int i1, long i2) __swi (8)  {
  return (i1 / i2);
}

int myfunc2 (int i1) __swi (9)  {
  return (i1<<4);
}


/*
* standard interrupt function saves only R0 - R12 and returns with
*/
void DefaultIRQ (void) __irq {
unsigned int temp;
  temp = VICIRQStatus;
  IOPIN1 ^= (1 << P1_15);    //取反P1.15
}

void EINT0IRQ (void) __irq {
unsigned int temp;
  temp = VICIRQStatus;
  IOPIN1 ^= (1 << P1_16);    //取反P1.16
  EXTINT = (1 << EINT0);    //清除INT0中断标志
  VICVectAddr = 0;
}

void EINT1IRQ (void) __irq {
unsigned int temp;
  temp = VICIRQStatus;
  IOPIN1 ^= (1 << P1_14);    //取反P1.14
  EXTINT = (1 << EINT1);    //清除INT1中断标志
  VICVectAddr = 0;
}

/*
* fast interrupt function saves only R0 - R7 and returns with
*/
void FIQ_Handler (void)    __fiq  {
//IOSET1 = 0x00010000;        // Set pin P1.16
//  IOSET1 = (1 << P1_15);    // Set pin P1.15
  IOPIN1 ^= (1 << P1_15);    //取反P1.15
//EXTINT = 0x00000002;        // Clear the peripheral interrupt flag
  EXTINT = (1 << EINT2);    //清除INT2中断标志
}

/*
* task functions have no register save/restore and no return.
*/
void tsk (void) __task {
  while (1);
}



/*
* Sample main function
*/
int res;

void main (void)  {
//  IODIR1         = 0x00FF0000;      // Set the LED pins as outputs
  IODIR1         = (1 << P1_23) | (1 << P1_22) | (1 << P1_21) | (1 << P1_20)
                  |(1 << P1_19) | (1 << P1_18) | (1 << P1_17) | (1 << P1_16);//设置LED输出方式
//  PINSEL0          = 0x20000000;    // Enable the EXTINT1 interrupt
  PINSEL0          |= (P0_14_EINT1 << P0_14_PINSEL);//选择P0.14为INT1外部中断引脚

  EXTMODE        |= (1 << EXTMODE1);//设置INT1为边沿触发,低电平有效

  PINSEL1          |= (P0_16_EINT0 << P0_16_PINSEL);//选择P0.16为INT0外部中断引脚

  EXTMODE        |= (1 << EXTMODE0);//设置INT1为边沿触发,低电平有效

  PINSEL0          |= (P0_15_EINT2 << P0_15_PINSEL);//选择P0.15为INT2外部中断引脚

  EXTMODE        |= (1 << EXTMODE2);//设置INT2为边沿触发,低电平有效

//  VICVectAddr15  = (unsigned long) DefaultIRQ;

//  VICIntSelect   = 0x00008000;      // Enable a Vic Channel as FIQ
  VICIntSelect   = (1 << VICIntSel_EINT2);      // Enable a Vic Channel as FIQ
//  VICIntSelect   = 0;      // Enable a Vic Channel as FIQ

  VICVectCntl0   = VICIntSel_Enable | VICIntSel_EINT0;
  VICVectAddr0   = (unsigned long *) &EINT0IRQ;//取INT0中断服务地址


  VICVectCntl1   = VICIntSel_Enable | VICIntSel_EINT1;
  VICVectAddr1   = (unsigned long *) &EINT1IRQ;//取INT1中断服务地址


//  VICIntEnable   = 0x00008000;      // Set Default interrupt vector
  VICIntEnable   = (1 << VICIntSel_EINT0)
                 | (1 << VICIntSel_EINT1)
                 | (1 << VICIntSel_EINT2);//使能中断

  EXTINT = (1 << EINT0) | (1 << EINT1) | (1 << EINT2);    //清除INT中断标志

//  VICDefVectAddr = (unsigned long *) &DefaultIRQ;

//  VICSoftInt     = (1 << VICIntSel_EINT1);

  res = myfunc1 (10, 2);          // call SWI functions
  res  = myfunc2 (res);


  while (1);                      // endless loop
}

Powered by USB中国技术论坛 Archiver 6.1.0  © 2001-2007USB中国技术论坛

USB开发中国论坛静态html版本,已经seo36.com协助优化!