/*************************************************************************/ /* */ /* External Interrupt Demo Program */ /* */ /* Input: J6-10 (p0.3) as EINT1 external interrupt input */ /* (falling-edge trigger) */ /* */ /* Note: external interrupt inputs can be set as level */ /* or edge trigger depends on EXTMODE setting and */ /* can be set as high or low active in EXTPOLAR. */ /* EXTPOLAR default setting is low active. */ /* */ /* Outputs: J6-11 (p0.8) Red LED; J6-12 (p0.9) Green LED */ /* */ /*************************************************************************/ /* */ /* ARM CPU: Philips LPC2138 */ /* Crystal clock: 11.0592 MHz */ /* Serial port baudrate: 57600 */ /* Programming tool: KEIL uVision3 RealView for ARM */ /* */ /*************************************************************************/ #include extern void init_timer_Eint(void); #define RED_LED 0x00000100 //define p0.8 as Red LED output #define GREEN_LED 0x00000200 //define p0.9 as Green LED output #define NEWLINE sendchar(0x0a); sendchar(0x0d) //define global variables long timeval; long exint; //=============================== void Init_Serial_A(void) { U0LCR = 0x83; //8 bit length ,DLAB=1 U0DLL = 0x0F; //Pclk/(16*baudrate)=(11059200 x 5)/(4 x 16 x 57600); U0DLM = 0x00; U0LCR = 0x03; //DLAB=0 } char getchar(void) { volatile char ch = '0'; while ((U0LSR&0x1)==0) // wait until receive a byte ; ch = U0RBR; // receive character return ch; } void sendchar(char ch) { while( (U0LSR&0x40)==0 ); U0THR = ch; // Transmit next character } int print(char *p) { while(*p!='\0') { sendchar(*p++); } return(0); } void putint(int count) { sendchar('0' + count/10000); sendchar('0' + (count/1000) % 10); sendchar('0' + (count/100) % 10); sendchar('0' + (count/10) % 10); sendchar('0' + count % 10); } int read_sensor(int channel) { int temp; ADCR=0x1<>=6; temp&=0x3ff;//TEMP IS 0-3V PRESICION IS 1024 return (temp*33); } int main(void) { PINSEL0 = 0x00000005; // set p0.0 to TXD0, p0.1 to RXD0 and the rest to GPIO PINSEL0 |= 0x000000C0; // set p0.3 as EINT1 external interrupt input Init_Serial_A(); // Init COM port init_timer_Eint(); // Init TIMER 0 & EINT1 NEWLINE; print("======================================================================="); NEWLINE; print("* *"); NEWLINE; print("* CUHK Computer Science and Engineering Department *"); NEWLINE; print("* LPC2138 ARM Board (2009) *"); NEWLINE; print("* *"); NEWLINE; print("* External Interrupt Demo (2009) *"); NEWLINE; print("* *"); NEWLINE; print("======================================================================="); NEWLINE; NEWLINE; //set p0.8 and p0.9 as output IO0DIR|=RED_LED; IO0DIR|=GREEN_LED; while(1) { } } void __irq IRQ_Exception() { timeval++; //Blink the Red LED if((timeval%2)==0) IO0SET|=RED_LED; else IO0CLR|=RED_LED; T0IR = 1; // Clear interrupt flag VICVectAddr = 0; // Acknowledge Interrupt } void __irq IRQ_Eint1() { exint++; //Blink the Green LED if((exint%2)==0) IO0SET|=GREEN_LED; else IO0CLR|=GREEN_LED; EXTINT = 0x02; // Clear EINT1 flag VICVectAddr = 0; // Acknowledge Interrupt } /* Setup the Timer Counter 0 Interrupt */ void init_timer_Eint (void) { T0PR = 0; // set prescaler to 0 T0MR0 =1382400; // set interrupt interval to 1mS // Pclk/10Hz = (11059200 x 5)/(4 x 1000) T0MCR = 3; // Interrupt and Reset on MR0 T0TCR = 1; // Timer0 Enable VICVectAddr0 = (unsigned long)IRQ_Exception; // set interrupt vector in 0 VICVectCntl0 = 0x20 | 4; // use it for Timer 0 Interrupt VICIntEnable = 0x00000010; // Enable Timer0 Interrupt EXTMODE=0x02; // set EINT1 as edge trigger VICVectAddr1 = (unsigned long)IRQ_Eint1; // set interrupt vector in 1 VICVectCntl1 = 0x20 | 15; // use it for EINT1 Interrupt VICIntEnable |= 0x00008000; // Enable EINT1 interrupt EXTINT = 0x02; // Clear EINT1 flag }