中断控制LED实验
各位朋友大家好,我自己写了个外部中断控制程序,目的是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控制的。 那个清楚知道外部中断EINT4在rEINTPEND是怎么控制的 问题都已解决,谢谢大哥大姐们的关心。 解决后的完整代码是怎样的呢?
麻烦楼主贴上来学习下啊!!! 是啊打包咯麻烦下 贴出来 让大家参考参考 :(能贴贴那是最好
页:
[1]