主题 : 菜鸟写的按键中断程序,却怎么也实现不了,请老鸟们指点一二。 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 27280
精华: 0
发帖: 15
金钱: 75 两
威望: 15 点
综合积分: 30 分
注册时间: 2010-08-23
最后登录: 2011-06-17
楼主  发表于: 2010-09-12 15:00

 菜鸟写的按键中断程序,却怎么也实现不了,请老鸟们指点一二。

先谢谢了。


#include "def.h"
#include "option.h"
#include "2440addr.h"    
#include "2440lib.h"
#include "2440slib.h"      
//================================
#define LED1 (1<<5)
#define LED2 (1<<6)
#define LED3 (1<<7)
#define LED4 (1<<8)

/*
led1--gpb5-k1--eint8--gpg0
led2--gpb6-k2--eint11-gpg3
led3--gpb7-k3--eint13-gpg5
led4--gpb8-k4--eint14-gpg6
*/
void delay(int tt)
{
  int i;
   for(;tt>0;tt--)
  {
     for(i=0;i<1000;i++);
  }
}


void ledinit()
{
    rGPBCON=rGPBCON&(~((3<<0)|(3<<10)|(3<<12)|(3<<14)|(3<<16)))|((0<<0)|(1<<10)|(1<<12)|(1<<14)|(1<<16));
    rGPBDAT=rGPBDAT&(~((LED1|LED2|LED3|LED4)))|((LED1|LED2|LED3|LED4));    
        
}

void clearpnd()
{
    rSRCPND|=(1<<5);
    rINTPND|=(1<<5);
}

unsigned int keyscan()
{
    if(!(rGPGDAT&(1<<0)))
    {
        delay(100);
        if(!(rGPGDAT&(1<<0)))
        {
            while(!(rGPGDAT&(1<<0)));
            return 1;
        }
    }    
    else if(!(rGPGDAT&(1<<3)))
    {
        delay(100);
        if(!(rGPGDAT&(1<<3)))
        {
            while(!(rGPGDAT&(1<<3)));
            return 2;
        }
    }    
    else if(!(rGPGDAT&(1<<5)))
    {
        delay(100);
        if(!(rGPGDAT&(1<<5)))
        {
            while(!(rGPGDAT&(1<<5)));
            return 3;
        }
    }
    else if(!(rGPGDAT&(1<<6)))
    {
        delay(100);
        if(!(rGPGDAT&(1<<6)))
        {
            while(!(rGPGDAT&(1<<6)));
            return 4;
        }
    }        
    else if(!(rGPGDAT&(1<<7)))
    {
        delay(100);
        if(!(rGPGDAT&(1<<7)))
        {
            while(!(rGPGDAT&(1<<7)));
            return 5;
        }
    }    
    else if(!(rGPGDAT&(1<<11)))
    {
        delay(100);
        if(!(rGPGDAT&(1<<11)))
        {
            while(!(rGPGDAT&(1<<11)));
            return 6;
        }
    }    
    else
        return 0xff;
        
}


static void __irq key_irq()
{
    unsigned int key;
    if(rINTPND==(1<<5))                                //BIT_EINT8_23
    {
        clearpnd();
        if(rEINTPEND&(1<<8))
        {
            rEINTPEND|=(1<<8);
        }
        if(rEINTPEND&(1<<11))
        {
            rEINTPEND|=(1<<11);
        }
        if(rEINTPEND&(1<<13))
        {
            rEINTPEND|=(1<<13);
        }
        if(rEINTPEND&(1<<14))
        {
            rEINTPEND|=(1<<14);
        }
        if(rEINTPEND&(1<<15))
        {
            rEINTPEND|=(1<<15);
        }
        if(rEINTPEND&(1<<19))
        {
            rEINTPEND|=(1<<19);
        }        
    }
    
//    rGPBDAT=rGPBDAT&(~((LED1|LED2|LED3|LED4)));
    key=keyscan();
    rGPBDAT&=~(key<<5);
        
}


void keyinit()
{
    rGPGCON=rGPGCON&(~((3<<0)|(3<<6)|(3<<10)|(3<<12)|(3<<14)|(3<<22)))|((2<<0)|(2<<6)|(2<<10)|(2<<12)|(2<<14)|(2<<22));
    rEXTINT1=rEXTINT1&(~((7<<0)|(7<<12)|(7<<20)|(7<<24)|(7<<28)))|((2<<0)|(2<<12)|(2<<20)|(2<<24)|(2<<28));
    rEXTINT2=rEXTINT2&(~(7<<12))|(2<<12);
    
    rEINTPEND|=(1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19);
    rEINTMASK&=~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19));
    
    rSRCPND|=(1<<5);
    rINTMSK&=~(1<<5);
    rINTMOD=0X0;
    rPRIORITY=0X0;
    rINTPND|=(1<<5);
        
    pISR_EINT8_23=(unsigned int )key_irq;            

}

void Main()
{
    ledinit();//
    keyinit();
    while(1);
    
}
级别: 侠客
UID: 11461
精华: 0
发帖: 89
金钱: 450 两
威望: 93 点
综合积分: 178 分
注册时间: 2009-12-08
最后登录: 2017-08-29
1楼  发表于: 2010-09-12 18:23
初始化部分看似没问题
你先打开MMU试试
级别: 新手上路
UID: 27280
精华: 0
发帖: 15
金钱: 75 两
威望: 15 点
综合积分: 30 分
注册时间: 2010-08-23
最后登录: 2011-06-17
2楼  发表于: 2010-09-13 10:15
main()中加上这个MMU_EnableICache()也还是不行。   
级别: 侠客
UID: 11461
精华: 0
发帖: 89
金钱: 450 两
威望: 93 点
综合积分: 178 分
注册时间: 2009-12-08
最后登录: 2017-08-29
3楼  发表于: 2010-09-13 12:09
加 MMU_Init();    
级别: 新手上路
UID: 27280
精华: 0
发帖: 15
金钱: 75 两
威望: 15 点
综合积分: 30 分
注册时间: 2010-08-23
最后登录: 2011-06-17
4楼  发表于: 2010-09-13 14:15
我在工程中加入了mmc.h和mmc.h,main()中加了MMU_Init();,
但在编译时Error提示:Undefined symbol _ENTRY (referred from mmu.o)??
为什么呢?
级别: 侠客
UID: 11461
精华: 0
发帖: 89
金钱: 450 两
威望: 93 点
综合积分: 178 分
注册时间: 2009-12-08
最后登录: 2017-08-29
5楼  发表于: 2010-09-13 14:38
_ENTRY这个没定义咯
在2440init.s里面的入口地方加个标号,然后用EXPORT输出
    EXPORT    __ENTRY
__ENTRY

或者你把mmu.c里面的__ENTRY改成常数0x30000000试一试
贵在坚持!
级别: 新手上路
UID: 27785
精华: 0
发帖: 37
金钱: 185 两
威望: 37 点
综合积分: 74 分
注册时间: 2010-08-31
最后登录: 2012-05-26
6楼  发表于: 2011-02-11 11:39
我发现3个问题、
1.加 MMU_Init();    
2.     if(rEINTPEND&(1<<8))  //中断服务子程序里面没有代码
        {
            rEINTPEND|=(1<<8);
           //灯亮?
        }
3.unsigned int keyscan()     //这个函数是轮询的按键代码。你不是用中断吗?怎么有这个函数?
付上ADS工程。看我的附件。
附件: Key_example.rar (110 K) 下载次数:69
级别: 新手上路
UID: 39660
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
综合积分: 4 分
注册时间: 2011-03-10
最后登录: 2011-03-21
7楼  发表于: 2011-03-11 11:21
讲得都不错啊
级别: 新手上路
UID: 33177
精华: 0
发帖: 5
金钱: 25 两
威望: 5 点
综合积分: 10 分
注册时间: 2010-11-26
最后登录: 2012-06-26
8楼  发表于: 2011-12-14 15:57

 回 5楼(myitlover) 的帖子

感谢您,我正遇到找个问题,看到您的回答解决了。谢谢。