⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 中断.c

📁 各种器件的驱动程序
💻 C
字号:
/*----------------------------------------------------------------------
              ARM菜鸟外部中断学习笔记
HotPower@126.com  2005.7.21 与西安大雁塔村队部
-----------------------------------------------------------------------*/
/***********************************************************************/
/*  This file is part of the CA ARM C Compiler package                 */
/*  Copyright KEIL ELEKTRONIK GmbH 2002 - 2004                         */
/***********************************************************************/
/*                                                                     */
/*  MAIN.C:  Demonstration of various interrupt functions              */
/*                                                                     */
/***********************************************************************/


#include <LPC21xx.H>    // 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
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -