ARM菜鳥外部中斷學習筆記

admin @ 2014-03-25 , reply:0

概述
*----------------------------------------------------------------------     ……

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

 

LPC21XXDEF.H
/*----------------------------------------------------
文   件   名:  LPC21XXDEF.H
創   建   人:  ARM菜鳥HotPower@126.com
最近修改日期:  2005.7.21
創 建 地 點 : 西安大雁塔村隊部
------------------------------------------------------*/


#ifndef __LPC21xxDEF_H
#define __LPC21xxDEF_H

#define BV(val) (1 << val)

#define VICIntSel_Watchdog  0
#define VICIntSel_VicInt1   1
#define VICIntSel_VicInt2   2
#define VICIntSel_VicInt3   3
#define VICIntSel_Time0     4
#define VICIntSel_Time1     5
#define VICIntSel_UART0     6
#define VICIntSel_UART1     7
#define VICIntSel_PWM       8
#define VICIntSel_I2C0      9
#define VICIntSel_SPI0     10
#define VICIntSel_SSP      11
#define VICIntSel_PLLLock  12
#define VICIntSel_RTC      13
#define VICIntSel_EINT0    14
#define VICIntSel_EINT1    15
#define VICIntSel_EINT2    16
#define VICIntSel_EINT3    17
#define VICIntSel_ADC0     18
#define VICIntSel_I2C1     19
#define VICIntSel_BOD      20
#define VICIntSel_ADC1     21
#define VICIntSel_VicInt22 22
#define VICIntSel_VicInt23 23
#define VICIntSel_VicInt24 24
#define VICIntSel_VicInt25 25
#define VICIntSel_VicInt26 26
#define VICIntSel_VicInt27 27
#define VICIntSel_VicInt28 28
#define VICIntSel_VicInt29 29
#define VICIntSel_VicInt30 30
#define VICIntSel_VicInt31 31
#define VICIntSel_Enable   32

//
#define P0_0  0//P0.0
#define P0_1  1//P0.1
#define P0_2  2//P0.2
#define P0_3  3//P0.3
#define P0_4  4//P0.4
#define P0_5  5//P0.5
#define P0_6  6//P0.6
#define P0_7  7//P0.7
#define P0_8  8//P0.8
#define P0_9  9//P0.9
#define P0_10 10//P0.10
#define P0_11 11//P0.11
#define P0_12 12//P0.12
#define P0_13 13//P0.13
#define P0_14 14//P0.14
#define P0_15 15//P0.15
#define P0_16 16//P0.16
#define P0_17 17//P0.17
#define P0_18 18//P0.18
#define P0_19 19//P0.19
#define P0_20 20//P0.20
#define P0_21 21//P0.21
#define P0_22 22//P0.22
#define P0_23 23//P0.23
#define P0_24 24//P0.24
#define P0_25 25//P0.25
#define P0_26 26//P0.26
#define P0_27 27//P0.27
#define P0_28 28//P0.28
#define P0_29 29//P0.29
#define P0_30 30//P0.30
#define P0_31 31//P0.31

//
#define P1_0  0//P1.0
#define P1_1  1//P1.1
#define P1_2  2//P1.2
#define P1_3  3//P1.3
#define P1_4  4//P1.4
#define P1_5  5//P1.5
#define P1_6  6//P1.6
#define P1_7  7//P1.7
#define P1_8  8//P1.8
#define P1_9  9//P1.9
#define P1_10 10//P1.10
#define P1_11 11//P1.11
#define P1_12 12//P1.12
#define P1_13 13//P1.13
#define P1_14 14//P1.14
#define P1_15 15//P1.15
#define P1_16 16//P1.16
#define P1_17 17//P1.17
#define P1_18 18//P1.18
#define P1_19 19//P1.19
#define P1_20 20//P1.20
#define P1_21 21//P1.21
#define P1_22 22//P1.22
#define P1_23 23//P1.23
#define P1_24 24//P1.24
#define P1_25 25//P1.25
#define P1_26 26//P1.26
#define P1_27 27//P1.27
#define P1_28 28//P1.28
#define P1_29 29//P1.29
#define P1_30 30//P1.30
#define P1_31 31//P1.31


#define EXTMODE0 0//EXTMODE.0
#define EXTMODE1 1//EXTMODE.1
#define EXTMODE2 2//EXTMODE.2
#define EXTMODE3 3//EXTMODE.3

#define EINT0 0//EXTINT.0
#define EINT1 1//EXTINT.1
#define EINT2 2//EXTINT.2
#define EINT3 3//EXTINT.3

//
#define P0_0_GPIO    0
  #define P0_0_TXD0  1
  #define P0_0_PWM1  2
#define P0_0_PINSEL 2 * P0_0

#define P0_1_GPIO 0
  #define P0_1_RXD0  1
  #define P0_1_PWM1  2
  #define P0_1_EINT0 3
#define P0_1_PINSEL 2 * P0_1

#define P0_2_GPIO    0
  #define P0_2_SCL0  1
#define P0_2_PINSEL 2 * P0_2

#define P0_3_GPIO    0
  #define P0_3_SDA0  1
  #define P0_3_EINT1 3
#define P0_3_PINSEL 2 * P0_3

#define P0_4_GPIO 0
#define P0_4_PINSEL 2 * P0_4

#define P0_5_GPIO 0
#define P0_5_PINSEL 2 * P0_5

#define P0_6_GPIO 0
#define P0_6_PINSEL 2 * P0_6

#define P0_7_GPIO 0
#define P0_7_PINSEL 2 * P0_7

#define P0_8_GPIO 0
#define P0_8_PINSEL 2 * P0_8

#define P0_9_GPIO 0
#define P0_9_PINSEL 2 * P0_9

#define P0_10_GPIO 0
#define P0_10_PINSEL 2 * P0_10

#define P0_11_GPIO 0
#define P0_11_PINSEL 2 * P0_11

#define P0_12_GPIO 0
#define P0_12_PINSEL 2 * P0_12

#define P0_13_GPIO 0
#define P0_13_PINSEL 2 * P0_13

#define P0_14_GPIO 0
  #define P0_14_CD    1//LPC2138
  #define P0_14_EINT1 2
  #define P0_14_SDA1  3
#define P0_14_PINSEL 2 * P0_14

#define P0_15_GPIO 0
  #define P0_15_RI    1//LPC2138
  #define P0_15_EINT2 2
#define P0_15_PINSEL 2 * P0_15

#define P0_16_GPIO 0
  #define P0_16_EINT0 1
#define P0_16_PINSEL 2 * P0_0


#define P0_17_GPIO 0
#define P0_17_PINSEL 2 * P0_1

#define P0_18_GPIO 0
#define P0_18_PINSEL 2 * P0_2


#define P0_19_GPIO 0
#define P0_19_PINSEL 2 * P0_3


#define P0_20_GPIO 0
#define P0_20_PINSEL 2 * P0_4


#define P0_21_GPIO 0
#define P0_21_PINSEL 2 * P0_5


#define P0_22_GPIO 0
#define P0_22_PINSEL 2 * P0_6


#define P0_23_GPIO 0
#define P0_23_PINSEL 2 * P0_7


#define P0_24_GPIO 0
#define P0_24_PINSEL 2 * P0_8


#define P0_25_GPIO 0
#define P0_25_PINSEL 2 * P0_9


#define P0_26_GPIO 0
#define P0_26_PINSEL 2 * P0_10


#define P0_27_GPIO 0
#define P0_27_PINSEL 2 * P0_11


#define P0_28_GPIO 0
#define P0_28_PINSEL 2 * P0_12


#define P0_29_GPIO 0
#define P0_29_PINSEL 2 * P0_13


#define P0_30_GPIO 0
#define P0_30_PINSEL 2 * P0_14


#define P0_31_GPIO 0
#define P0_31_PINSEL 2 * P0_15

 

#endif  // __LPC21xxDEF_H




[admin via 研發互助社區 ] ARM菜鳥外部中斷學習筆記已經有2921次圍觀

http://cocdig.com/docs/show-post-42941.html