|  | 
 
| 各位朋友大家好,我自己写了个外部中断控制程序,目的是K1--K4分别控制LED1--LED4,按一下亮,再按一下熄,但K1,K3,K4都没问题,K2却按一下就亮,但再按一下却不会熄,然后再按K1,K3,K4都不会产生中断,令我很费解啊,我只列出核心代码,启动代码没有! #define _ISR_STARTADDRESS 0x33ffff00
 #define U32 unsigned int
 #define pISR_EINT0            (*(unsigned *)(_ISR_STARTADDRESS+0x20))
 #define pISR_EINT1            (*(unsigned *)(_ISR_STARTADDRESS+0x24))
 #define pISR_EINT2            (*(unsigned *)(_ISR_STARTADDRESS+0x28))
 #define pISR_EINT4_7  (*(unsigned *)(_ISR_STARTADDRESS+0x30))
 #define rSRCPND     (*(volatile unsigned *)0x4a000000)      //Interrupt request status
 #define rINTMSK     (*(volatile unsigned *)0x4a000008)       //Interrupt mask control
 #define rINTPND     (*(volatile unsigned *)0x4a000010)       //Interrupt request status
 #define rGPBCON    (*(volatile unsigned *)0x56000010) //Port B control
 #define rGPBDAT    (*(volatile unsigned *)0x56000014) //Port B data
 #define rGPBUP     (*(volatile unsigned *)0x56000018)  //Pull-up control B
 #define rGPFCON    (*(volatile unsigned *)0x56000050) //Port F control
 #define rEXTINT0   (*(volatile unsigned *)0x56000088)
 #define rEINTMASK  (*(volatile unsigned *)0x560000a4) //External interrupt mask
 #define rEINTPEND  (*(volatile unsigned *)0x560000a8) //External interrupt pending
 #include <stdlib.h>
 #include <string.h>
 #include "def.h"
 #include "option.h"
 #include "2440addr.h"
 #include "2440lib.h"
 #include "2440slib.h"
 static U32 cpu_freq;
 static U32 UPLL;
 static void __irq key1_interrupt(void);
 static void __irq key2_interrupt(void);
 static void __irq key3_interrupt(void);
 static void __irq key4_interrupt(void);
 int x=1;
 int y=1;
 int z=1;
 int w=1;
 static void cal_cpu_bus_clk(void)
 {
 U32 val;
 U8 m, p, s;
 
 val = rMPLLCON;
 m = (val>>12)&0xff;
 p = (val>>4)&0x3f;
 s = val&3;
 
 //(m+8)*FIN*2 不要超出32位数!
 FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;
 
 val = rCLKDIVN;
 m = (val>>1)&3;
 p = val&1;
 val = rCAMDIVN;
 s = val>>8;
 
 switch (m) {
 case 0:
 HCLK = FCLK;
 break;
 case 1:
 HCLK = FCLK>>1;
 break;
 case 2:
 if(s&2)
 HCLK = FCLK>>3;
 else
 HCLK = FCLK>>2;
 break;
 case 3:
 if(s&1)
 HCLK = FCLK/6;
 else
 HCLK = FCLK/3;
 break;
 }
 
 if(p)
 PCLK = HCLK>>1;
 else
 PCLK = HCLK;
 
 if(s&0x10)
 cpu_freq = HCLK;
 else
 cpu_freq = FCLK;
 
 val = rUPLLCON;
 m = (val>>12)&0xff;
 p = (val>>4)&0x3f;
 s = val&3;
 UPLL = ((m+8)*FIN)/((p+2)*(1<<s));
 UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;
 }
 static void __irq key1_interrupt(void)
 { int led;
 rSRCPND=rSRCPND | 0x01<<1;
 rINTPND=rINTPND | 0x01<<1;
 led =0x01c0;
 if(x!=0)
 {
 rGPBDAT=led;
 x=0;
 }
 else  {
 rGPBDAT=0x0ff0;
 x=1;       };
 
 }
 static void __irq key2_interrupt(void)
 { int led;
 rSRCPND=rSRCPND | 0x01<<4;
 rINTPND=rINTPND | 0x01<<4;
 led=0x01a0;
 if(y!=0)
 {
 rGPBDAT=led;
 y=0;
 }
 else
 {
 rGPBDAT=0x0ff0;
 y=1;       };
 }
 static void __irq key3_interrupt(void)
 { int led;
 rSRCPND=rSRCPND | 0x01<<2;
 rINTPND=rINTPND | 0x01<<2;
 led=0x0160;
 if(z!=0)
 {
 rGPBDAT=led;
 z=0;
 }
 else  {
 rGPBDAT=0x0ff0;
 z=1;       };
 }
 static void __irq key4_interrupt(void)
 {
 int led;
 rSRCPND=rSRCPND | 0x01;
 rINTPND=rINTPND | 0x01;
 led=0x0e0;
 if(w!=0)
 {
 rGPBDAT=led;
 w=0;
 }
 else  {
 rGPBDAT=0x0ff0;
 w=1;       };
 }
 void Main(void)
 {
 U8 key;
 int i;
 U32 mpll_val = 0;
 
 Port_Init();
 
 i = 2 ;        //don't use 100M!
 switch ( i ) {
 case 0:        //200
 key = 12;
 mpll_val = (92<<12)|(4<<4)|(1);
 break;
 case 1:        //300
 key = 13;
 mpll_val = (67<<12)|(1<<4)|(1);
 break;
 case 2:        //400
 key = 14;
 mpll_val = (92<<12)|(1<<4)|(1);
 break;
 case 3:        //440!!!
 key = 14;
 mpll_val = (102<<12)|(1<<4)|(1);
 break;
 default:
 key = 14;
 mpll_val = (92<<12)|(1<<4)|(1);
 break;
 }
 
 ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
 ChangeClockDivider(key, 12);
 cal_cpu_bus_clk();
 rSRCPND = 0x17;
 rINTMSK = ~0x17;
 rINTPND =0x17;
 rEINTPEND = (1<<4);
 rEINTMASK = ~(1<<4);
 rEXTINT0 = 0x20222;
 rGPBDAT=0x1ff;
 while(1)
 {
 pISR_EINT0  = (U32)key4_interrupt;
 pISR_EINT1  = (U32)key1_interrupt;
 pISR_EINT2  = (U32)key3_interrupt;
 pISR_EINT4_7= (U32)key2_interrupt;
 }
 
 }
 关键看哈K2的中断,它是由EINT4控制的。
 | 
 |