yuyukaka789 发表于 2010-8-21 16:44:11

中断控制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控制的。

yuyukaka789 发表于 2010-8-21 16:58:11

那个清楚知道外部中断EINT4在rEINTPEND是怎么控制的

yuyukaka789 发表于 2010-8-21 22:32:27

问题都已解决,谢谢大哥大姐们的关心。

fjq 发表于 2010-9-18 14:31:03

解决后的完整代码是怎样的呢?
麻烦楼主贴上来学习下啊!!!

cd4514 发表于 2010-10-14 18:05:11

是啊打包咯麻烦下

ljw20060802 发表于 2010-11-3 21:05:14

贴出来 让大家参考参考

学海无涯 发表于 2010-11-4 20:15:32

:(能贴贴那是最好
页: [1]
查看完整版本: 中断控制LED实验