打印

求助贴!S3C2440按键中断,始终进不去中断

[复制链接]
3157|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kaiy|  楼主 | 2012-9-11 21:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大神,想实现按键中断使LED点亮,MDK平台,但是硬件仿真时总是什么效果都没有,没有进入中断,急求指点,谢谢啦!


程序如下:
/************利用中断方式,设计按键key1-4,分别使led1-4点亮**************/

#include "2440addr.h"

//LED低电平有效,依次为GPB5-GPB8
#define LED1_ON   ~(1<<5)    //灯1亮,PB5置0
#define LED2_ON   ~(1<<6)         //灯2亮,PB6置0
#define LED3_ON   ~(1<<7)    //灯3亮,PB7置0
#define LED4_ON   ~(1<<8)    //灯4亮,PB8置0

#define LED1_OFF   (1<<5)         //灯1灭,PB5置1
#define LED2_OFF   (1<<6)         //灯2灭,PB6置1
#define LED3_OFF   (1<<7)         //灯3灭,PB7置1
#define LED4_OFF   (1<<8)         //灯4灭,PB8置1

//按键有效时,对应的GPGIO口为0
#define KEY1      ~(1<<0)         //按键1有效 ,按下键为低电平
#define KEY2      ~(1<<3)         //按键2有效
#define KEY3      ~(1<<5)         //按键3有效
#define KEY4      ~(1<<6)         //按键4有效

/******************外部中断服务函数*************************/
void __irq IRQ_KEY(void)
{
if(rINTPND&BIT_EINT8_23)//一级中断源判断
   {
           ClearPending(BIT_EINT8_23);//中断清空,以进行下一次中断判断
        if(rEINTPEND&(1<<8))                  //EINT8中断有效
          {
           rGPBDAT&=LED1_ON;
           rEINTPEND|=1<<8;                 //清外部中断
          }
        if(rEINTPEND&(1<<11))         //EINT11中断有效
          {
           rGPBDAT&=LED2_ON;
           rEINTPEND|=1<<11;                 //清外部中断
          }
        if(rEINTPEND&(1<<13))         //EINT13中断有效
          {
           rGPBDAT&=LED3_ON;
           rEINTPEND|=1<<13;                 //清外部中断
          }
        if(rEINTPEND&(1<<14))         //EINT14中断有效
          {
           rGPBDAT&=LED4_ON;
           rEINTPEND|=1<<14;                 //清外部中断
          }
   }

//为下一次中断触发作准备
  rEINTPEND = 0xFFFFFF;          //清空 EINTPEND中断请求
  rEINTMASK&=~((1<<8)|(1<<11)|(1<<13)|(1<<14)); //外部中断允许,置0
  rINTMSK&=~(1<<5);//一级中断源允许EINT8_23           
}

/*********************外部中断初始化函数************************/
void EINT_init(void)
{
rGPGCON&=~((3<<0)|(3<<6)|(3<<10)|(3<<12)); //控制位置0
rGPGCON|=(2<<0)|(2<<6)|(2<<10)|(2<<12);           //控制位置10,作为中断引脚模式
//外部中断寄存器初始化
rEXTINT1&=~((7<<0)|(7<<12)|(7<<20)|(7<<24));//EINT8、EINT11、EINT13、EINT14的控制位先置0
rEXTINT1|=(2<<0)|(2<<12)|(2<<20)|(2<<24);        //三个外部中断设置为下降沿中断方式

//外部中断入口地址
pISR_EINT8_23=(unsigned int)IRQ_KEY;
rINTMSK&=~(1<<5);//一级中断源允许EINT8_23
rEINTMASK&=~((1<<8)|(1<<11)|(1<<13)|(1<<14)); //外部中断允许,置0
rEINTPEND=0xffffffff;                                                 //清空外部中断
//源中断寄存器初始地化
rSRCPND=rSRCPND; //清空所有中断
rINTPND=rINTPND; //清空所有中断
rINTMOD=0x0;     //IRQ中断
rPRIORITY=0x0;         //使用默认的中断优先级


}

int main(void)
{
/**************GPB控制寄存器初始化***********************************/        
        rGPBCON&=~((3<<10)|(3<<12)|(3<<14)|(3<<16));//GPB5-GPB6的控制位为[10:17],全部置为0
        rGPBCON|=(1<<10)|(1<<12)|(1<<14)|(1<<16);//        [10:17]每两位控制一个GPB口为输出,设置为01
/**************GPB数据寄存器初始**********************************/
        rGPBDAT|=LED1_OFF|LED2_OFF|LED3_OFF|LED4_OFF;//初始化使每一个灯关闭
        EINT_init();
        while(1);
}
这是为什么呢?为什么呢?谢谢大家了!

相关帖子

沙发
kaiy|  楼主 | 2012-9-11 22:05 | 只看该作者
难道是工程里面还要作什么特别设置么?才能进入中断向量表么?
唉,都木了,求各位指教,谢谢!

使用特权

评论回复
板凳
阿南| | 2012-9-12 09:48 | 只看该作者
看看这个测试代码,是否对你有用。

/**************************************************************
4*4 Key Scan
**************************************************************/

#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"

/******************************************************************************
        4X4 矩阵键盘
四个输入引脚:        EINT0 -----( GPF0  )----INPUT
                                EINT2 -----( GPF2  )----INPUT
                                EINT11-----( GPG3  )----INPUT
                                EINT19-----( GPG11 )----INPUT
                               
四个输出引脚:                           ( GPB6 )----OUTPUT
                                           ( GPB7 )----OUTPUT
                               
******************************************************************************/
U8 Key_Scan( void )
{
        Delay( 80 ) ;
        //rGPGDAT = rGPGDAT & (~((1<<6)|(1<<2))) | (1<<6) | (0<<2) ;                //GPG6,2 output 0
        rGPBDAT &=~(1<<6);
        rGPBDAT |=1<<7;
        //Delay(10);
        //rGPEDAT = rGPEDAT & (~((1<<13)|(1<<11))) | (1<<13) | (1<<11) ;                //GPE13,11 output 0
        if(      (rGPFDAT&(1<< 0)) == 0 )                return 1 ;
        else if( (rGPFDAT&(1<< 2)) == 0 )                return 3 ;
        else if( (rGPGDAT&(1<< 3)) == 0 )                return 5 ;
        else if( (rGPGDAT&(1<<11)) == 0 )                return 7 ;

        //rGPGDAT = rGPGDAT & (~((1<<6)|(1<<2))) | (0<<6) | (1<<2) ;                //GPG6,2 output 0
        //rGPEDAT = rGPEDAT & (~((1<<13)|(1<<11))) | (1<<13) | (1<<11) ;                //GPE13,11 output 0
        rGPBDAT &=~(1<<7);
        rGPBDAT |=1<<6;
        if(      (rGPFDAT&(1<< 0)) == 0 )                return 2 ;
        else if( (rGPFDAT&(1<< 2)) == 0 )                return 4 ;
        else if( (rGPGDAT&(1<< 3)) == 0 )                return 6 ;
        else if( (rGPGDAT&(1<<11)) == 0 )                return 8 ;
        else return 0xff ;
       
}

static void __irq Key_ISR(void)
{
        U8 key;
        U32 r;

        EnterCritical(&r);
        if(rINTPND==BIT_EINT8_23) {
                ClearPending(BIT_EINT8_23);
                if(rEINTPEND&(1<<11)) {
        //        Uart_Printf("eint11\n");
                        rEINTPEND |= 1<< 11;
                }
                if(rEINTPEND&(1<<19)) {
        //                Uart_Printf("eint19\n");               
                        rEINTPEND |= 1<< 19;
                }
        }
        if(rINTPND==BIT_EINT0) {
                //Uart_Printf("eint0\n");
                ClearPending(BIT_EINT0);
        }
        if(rINTPND==BIT_EINT2) {
        //        Uart_Printf("eint2\n");
                ClearPending(BIT_EINT2);
        }
        key=Key_Scan();
        if( key != 0xff )
        Uart_Printf( "Interrupt occur... K%d is pressed!\n", key ) ;

        rGPBCON &=~((3<<12)|(3<<14));
        rGPBCON |=((1<<12)|(1<<14));
        rGPBUP &=~(3<<6);
        rGPBDAT &=~(3<<6);
        ExitCritical(&r);
}

void KeyScan_Test(void)
{
        Uart_Printf("\nKey Scan Test, press ESC key to exit !\n");       

        //rGPGCON &= ~((3<<12)|(3<<4));
        //rGPGCON |= (1<<12)|(1<<4);                //GPG6,2 output 0
        //rGPGDAT &= ~((1<<6)|(1<<2));
       
        //rGPECON &= ~((3<<26)|(3<<22));
        //rGPECON |= (1<<26)|(1<<22);                //GPE13,11 output 0
        //rGPEDAT &= ~((1<<13)|(1<<11));
       
        rGPGCON = rGPGCON & (~((3<<22)|(3<<6))) | ((2<<22)|(2<<6)) ;                //GPG11,3 set EINT
        rGPFCON = rGPFCON & (~((3<<4)|(3<<0))) | ((2<<4)|(2<<0)) ;                //GPF2,0 set EINT
       
        rEXTINT0 &= ~(7|(7<<8));       
        rEXTINT0 |= (0|(0<<8));        //set eint0,2 falling edge int
        rEXTINT1 &= ~(7<<12);
        rEXTINT1 |= (0<<12);        //set eint11 falling edge int
        rEXTINT2 &= ~(0xf<<12);
        rEXTINT2 |= (0<<12);        //set eint19 falling edge int
       
        rGPBCON &=~((3<<12)|(3<<14));
        rGPBCON |=((1<<12)|(1<<14));
        rGPBUP |=(3<<6);
        rGPBDAT &=~(3<<6);

        rEINTPEND |= (1<<11)|(1<<19);                //clear eint 11,19
        rEINTMASK &= ~((1<<11)|(1<<19));        //enable eint11,19
        ClearPending(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);
        pISR_EINT0 = pISR_EINT2 = pISR_EINT8_23 = (U32)Key_ISR;
        EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);       

        //rGPGCON &= ~(3<<20);
       
        //rGPGUP  &= ~(1<<10);
         while( Uart_GetKey() != ESC_KEY ) ;
         DisableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);       
}

使用特权

评论回复
地板
kaiy|  楼主 | 2012-9-12 15:26 | 只看该作者
3# 阿南


呀,阿南哥亲自回的呀,太幸运了!谢谢阿南哥,我看看先,不知道是什么问题,困扰了两天了!:loveliness:

使用特权

评论回复
5
kaiy|  楼主 | 2012-9-12 17:20 | 只看该作者
3# 阿南
阿南哥,不行呀,要不麻烦您看下我的代码?应该没有问题呀!就是进不去中断!

使用特权

评论回复
6
beyond696| | 2012-9-12 18:44 | 只看该作者
关键是看你启动代码有没有实现中断向量表的功能,之前我也在研究这个,后来我改写下了启动代码就可以了

使用特权

评论回复
7
kaiy|  楼主 | 2012-9-12 19:39 | 只看该作者
6# beyond696
谢谢您!应该有呀,具体是哪部分呀?

使用特权

评论回复
8
阿南| | 2012-9-12 20:26 | 只看该作者
在0x18处设一个断点,看是否能走到这里,以判断GPIO中断使能和触发是否正常。

使用特权

评论回复
9
xinzha| | 2012-9-13 11:06 | 只看该作者
我没有看到你使能cpsr中的中断位,这一位才是最根儿上的中断使能。

使用特权

评论回复
10
kaiy|  楼主 | 2012-9-13 17:03 | 只看该作者
8# 阿南
怎样在指定地址设断点呢?谢谢!

使用特权

评论回复
11
阿南| | 2012-9-13 17:07 | 只看该作者
进入仿真模式,在某行的左边双击鼠标左键应该主可以了。

使用特权

评论回复
12
kaiy|  楼主 | 2012-9-13 17:42 | 只看该作者
9# xinzha
在启动代码中,中断入口处这位应该就被置0呀,中断发生后自动就置1了呀!

使用特权

评论回复
13
阿南| | 2012-9-13 22:47 | 只看该作者
9楼说的是中断使能位,而12楼说的可能是指中断标志位

使用特权

评论回复
14
fatbobwang| | 2014-2-22 12:06 | 只看该作者
LZ,关于和硬件设计有关的问题别在国内论坛问了,基本问了时白问。我之前也问过一个问题,比你这个简单多了,在百度上和很多论坛上都发过帖子求助过,但根本没人能给出答复,还让你先看这个学那个。
你的代码我看了下,问题不是再代码上,如果你能看到我的回帖就给我回信,我私信告诉你为什么进中断有问题。
话说中国的硬件设计水平太差,不是一般的差,还非常不谦虚~

使用特权

评论回复
15
剑藏锋| | 2015-1-23 08:42 | 只看该作者
解决了吗问题

使用特权

评论回复
16
sunnyjulie| | 2015-3-17 16:09 | 只看该作者
LM3S6911-IQC50-A2, S3C2440A40-YQ80, 大量全新原装现货,有用到的私我!广兴隆电子,只做原装,假一罚十!QQ:1546625035, 电话:0755-83265881

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

22

帖子

1

粉丝