|
#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 } |