综合资讯 技术文章 原文阅读 在线商城 下载专区 DATASHEET 技术论坛 商务频道

电子技术 | 技术资料 | 嵌入式系统 | 单片机专题 | DSP专题
EDA/PLD专题 | 电源技术专题 | 电子制作专题 | 其他综合 | 芯片选型

所在的位置:首页在线阅读嵌入式系统ARM技术专辑正文
 
给你个没调通的GCC版的菜鸟笔记

#include <LPC213x.H>    // Philips Peripheral Registers
#include <LPC213xDEF.H>    //ARM菜鸟HotPower创建定义文件

void EXTintIRQ (void) __attribute__ ((interrupt("IRQ")));

//void FIQ_Handler (void) __attribute__ ((interrupt("FIQ")));
//void IRQ_Handler (void) __attribute__ ((interrupt("IRQ")));

void EINT0IRQ(void) __attribute__ ((interrupt));
void EINT1IRQ(void) __attribute__ ((interrupt));
void EINT2IRQ(void) __attribute__ ((interrupt));
void EINT3IRQ(void) __attribute__ ((interrupt));

//void UserDefineIRQ(void) __attribute__ ((interrupt));
void UserDefineIRQ(void)
{
  if (VICIRQStatus & (1 << VICIntSel_SoftInt31)) {
    IOPIN1 ^= (1 << P1_19);    //取反P1.19
    EXTINT = (1 << VICIntSel_SoftInt31);    //清除VICIntSel_SoftInt31中断标志
//    VICSoftIntClr = (1 << VICIntSel_SoftInt31);
  }
  VICVectAddr = 0;
}

//extern
void EXTintFIQ (void) __attribute__ ((interrupt("FIQ")));

void EXTintFIQ(void)
{//VICIntSelect非0
unsigned temp;
  temp = VICFIQStatus;
  if (temp & (1 << VICIntSel_EINT0)) {
    IOPIN1 ^= (1 << P1_16);    //取反P1.16
    EXTINT = (1 << EINT0);    //清除INT0中断标志
  }
  else if (temp & (1 << VICIntSel_EINT1)) {
    IOSET1 = (1 << P1_17);    //P1.17=1
    while(EXTINT & (1 << EINT1)) {
      EXTINT = (1 << EINT1);    //清除INT1中断标志
    }
    IOCLR1 = (1 << P1_17);    //P1.17=0
  }
  else if (temp & (1 << VICIntSel_EINT2)) {
    IOPIN1 ^= (1 << P1_18);    //取反P1.18
    EXTINT = (1 << EINT2);    //清除INT2中断标志
  }
  else if (temp & (1 << VICIntSel_EINT3)) {
    IOPIN1 ^= (1 << P1_19);    //取反P1.19
    EXTINT = (1 << EINT3);    //清除INT3中断标志
  }
  else {//其他干扰源
//再次填入干扰处理代码
  }
//  VICSoftIntClr = temp;//抗击无效VICSoftInt=XXX的入侵
  VICVectAddr = 0;
}

void EXTintIRQ (void) {//VICIntSelect=0且VICVectCntl0~VICVectCntl15都未中断使能
unsigned long temp;
  temp = VICIRQStatus;
  if (temp & (1 << VICIntSel_EINT0)) {
    IOPIN1 ^= (1 << P1_16);    //取反P1.16
    EXTINT = (1 << EINT0);    //清除INT0中断标志
  }
  else if (temp & (1 << VICIntSel_EINT1)) {
    IOPIN1 ^= (1 << P1_17);    //取反P1.17
    while(EXTINT & (1 << EINT1)) {
      EXTINT = (1 << EINT1);    //清除INT1中断标志
    }
  }
  else if (temp & (1 << VICIntSel_EINT2)) {
    IOPIN1 ^= (1 << P1_18);    //取反P1.18
    EXTINT = (1 << EINT2);    //清除INT2中断标志
  }
  else if (temp & (1 << VICIntSel_EINT3)) {
    IOPIN1 ^= (1 << P1_19);    //取反P1.19
    EXTINT = (1 << EINT3);    //清除INT3中断标志
  }
  else {//其他干扰源
//再次填入干扰处理代码
  }
//  VICSoftIntClr = temp;//抗击无效VICSoftInt=XXX的入侵
  VICVectAddr = 0;
}

void EINT0IRQ (void) {//IRQ中断函数EINT0IRQ被挂接在VICVectCntl0
  if (VICIRQStatus & (1 << VICIntSel_EINT0)) {
    IOPIN1 ^= (1 << P1_16);    //取反P1.16
  }
  VICSoftIntClr = (1 << VICIntSel_EINT0);
  EXTINT = (1 << EINT0);    //清除INT0中断标志
  VICVectAddr = 0;
}

void EINT1IRQ (void) {//IRQ中断函数EINT1IRQ被挂接在VICVectCntl1
  if (VICIRQStatus & (1 << VICIntSel_EINT1)) {
    IOSET1 = (1 << P1_17);    //P1.17=1
//  while(EXTINT & (1 << EINT1)) {
      EXTINT = (1 << EINT1);    //清除INT1中断标志
//  }
    IOCLR1 = (1 << P1_17);    //P1.17=0
    VICSoftIntClr = (1 << VICIntSel_EINT1);
  }
  VICVectAddr = 0;
}

void EINT2IRQ (void) {//IRQ中断函数EINT2IRQ被挂接在VICVectCntl2
  if (VICIRQStatus & (1 << VICIntSel_EINT2)) {
    IOPIN1 ^= (1 << P1_18);    //取反P1.18
  }
  EXTINT = (1 << EINT2);    //清除INT2中断标志
//  VICSoftIntClr = (1 << VICIntSel_EINT2);
  VICVectAddr = 0;
}

void EINT3IRQ (void) {//IRQ中断函数EINT3IRQ被挂接在VICVectCntl3
  if (VICIRQStatus & (1 << VICIntSel_EINT3)) {
    IOPIN1 ^= (1 << P1_19);    //取反P1.19
  }
  EXTINT = (1 << EINT3);    //清除INT3中断标志
//  VICSoftIntClr = (1 << VICIntSel_EINT3);
  VICVectAddr = 0;
}


int main (void)  {


  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          |= (P0_14_EINT1 << P0_14_PINSEL) //选择P0.14为INT1外部中断引脚
//                     | (P0_7_EINT2 << P0_7_PINSEL)   //选择P0.7为INT2外部中断引脚
                     | (P0_15_EINT2 << P0_15_PINSEL); //选择P0.15为INT2外部中断引脚
//                     | (P0_9_EINT3 << P0_9_PINSEL)   //选择P0.9也为INT3外部中断引脚
//                     | (P0_1_EINT0 << P0_1_PINSEL)   //选择P0.1也为INT0外部中断引脚
//                     | (P0_3_EINT1 << P0_3_PINSEL);  //选择P0.3也为INT1外部中断引脚

  PINSEL1          |= (P0_16_EINT0 << P0_16_PINSEL) //选择P0.16为INT0外部中断引脚
//                     | (P0_20_EINT3 << P0_20_PINSEL) //选择P0.20也为INT3外部中断引脚
                     | (P0_30_EINT3 << P0_30_PINSEL);//选择P0.30也为INT3外部中断引脚(Keil仿真不了)
  
  EXTPOLAR       &= ~((1 << EXTPOLAR0) //INT0为低电平有效
                  |  (1 << EXTPOLAR1)  //INT1为低电平有效
                  |  (1 << EXTPOLAR2)  //INT2为低电平有效
                  |  (1 << EXTPOLAR3));//INT3为低电平有效

//  EXTPOLAR       |= (1 << EXTPOLAR0); //INT0为高电平有效


  EXTMODE        |= (1 << EXTMODE0) //设置INT0为边沿触发
                  | (1 << EXTMODE2) //设置INT2为边沿触发
                  | (1 << EXTMODE3);//设置INT3为边沿触发

//  EXTMODE        &= ~(1 << EXTMODE1);//设置INT1为电平触发

  VICVectCntl0   = VICIntSel_Enable//使能IRQ中断
                 | VICIntSel_EINT0;//获取EINT0的IRQ级别
  VICVectAddr0   = (long) EINT0IRQ;//取INT0中断服务地址


  VICVectCntl1   = VICIntSel_Enable//使能IRQ中断
                 | VICIntSel_EINT1;//获取EINT1的IRQ级别
  VICVectAddr1   = (long)EINT1IRQ;//取INT1中断服务地址

  VICVectCntl2   = VICIntSel_Enable//使能IRQ中断
                 | VICIntSel_EINT2;//获取EINT2的IRQ级别
  VICVectAddr2   = (long)EINT2IRQ;//取INT2中断服务地址

  VICVectCntl3   = VICIntSel_Enable//使能IRQ中断
                 | VICIntSel_EINT3;//获取EINT3的IRQ级别
  VICVectAddr3   = (long)EINT3IRQ;//取INT3中断服务地址

  VICVectCntl4   = VICIntSel_Enable//使能IRQ中断
                 | VICIntSel_SoftInt31;//获取VICIntSel_SoftInt31的IRQ级别
//  VICVectAddr4   = (long)UserDefineIRQ;//取VicInt31中断服务地址


//  VICVectCntl0  &= ~VICIntSel_Enable;//放弃EINT0的IRQ级别,获取默认中断级别
//  VICVectCntl1  &= ~VICIntSel_Enable;//放弃EINT1的IRQ级别,获取默认中断级别
//  VICVectCntl2  &= ~VICIntSel_Enable;//放弃EINT2的IRQ级别,获取默认中断级别

//  VICDefVectAddr = (long)EXTintIRQ;//取默认中断服务地址

  VICIntSelect   = 0;//全部中断为IRQ中断或默认中断
  VICIntSelect   = (1 << VICIntSel_EINT0); //设置EINT0为FIQ中断

/*
  VICIntSelect   = (1 << VICIntSel_EINT0) //设置EINT0为FIQ中断
                 | (1 << VICIntSel_EINT1) //设置EINT1为FIQ中断
                 | (1 << VICIntSel_EINT2) //设置EINT2为FIQ中断
                 | (1 << VICIntSel_EINT3);//设置EINT2为FIQ中断
*/

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


//  VICSoftIntClr = 0xffffffff;//清除所有软中断标志
  VICSoftIntClr  = (1 << VICIntSel_EINT0) //清除EINT0软中断标志
                 | (1 << VICIntSel_EINT1) //清除EINT1软中断标志
                 | (1 << VICIntSel_EINT2) //清除EINT2软中断标志
                 | (1 << VICIntSel_EINT3);//清除EINT3软中断标志

  VICIntEnable   = (1 << VICIntSel_EINT0) //使能EINT0中断
                 | (1 << VICIntSel_EINT1) //使能EINT1中断
                 | (1 << VICIntSel_EINT2) //使能EINT2中断
                 | (1 << VICIntSel_EINT3);//使能EINT3中断

  VICIntEnable  |= (1 << VICIntSel_SoftInt31);//使能VICIntSel_SoftInt31中断

//  SetVICProtection(1);//打开特权保护,阻止VICSoftInt软中断
  VICSoftInt     = (1 << VICIntSel_EINT0);//(VICIntEnable & (1 << VICIntSel_EINT0))使能才能软中断

//  SetVICProtection(0);//关闭特权保护,允许VICSoftInt软中断
  VICSoftInt     = (1 << VICIntSel_EINT1);//(VICIntEnable & (1 << VICIntSel_EINT1))使能才能软中断

//  SetVICProtection(1);//打开特权保护,阻止VICSoftInt软中断
  VICSoftInt     = (1 << VICIntSel_EINT2);//(VICIntEnable & (1 << VICIntSel_EINT2))使能才能软中断

//  SetVICProtection(0);//关闭特权保护,允许VICSoftInt软中断
  VICSoftInt     = (1 << VICIntSel_EINT3);//(VICIntEnable & (1 << VICIntSel_EINT3))使能才能软中断

//  SetVICProtection(0);//关闭特权保护,允许VICSoftInt软中断
  VICSoftInt     = (1 << VICIntSel_SoftInt31);//(VICIntEnable & (1 << VICIntSel_SoftInt31))使能才能软中断

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


  while (1);                      // endless loop
  return 0;
}

返回 上一页 下一页   信息发布:工号01   转引自: 【 】 【打印】 【关闭

关于我们 ┋ 友情链接


深圳市福田区海滨广场福业大厦12C
电话:0755-88305880 25960580 传真:0755-88305880
Copyright©2005-2007 无忧电子开发网版权所有

粤ICP备05064233号