none
wince 6.0 按键中断问题 RRS feed

  • 问题

  • wince 6.0
    pxa270

    请帮忙看下下面的这个中断,按键的中断,GPIO101和GPIO104。其中101为中断线,104为高电平。
    总是默认产生一个中断,用电表去测,发现101为低,104为高。
    再按下按键的时候也不会产生中断。
    请高手帮忙看一下啊。是不是这段代码有什么问题啊,帮忙修改一下啊

     

    UINT32 dwSysIntr = SYSINTR_KEYPAD;
    volatile XLLP_GPIO_T *v_pGPIOReg = (XLLP_GPIO_T *)(0xA8500000 + 0x00E00000);
    volatile XLLP_INTC_T  * v_pICReg;
    
    /* 中断处理线程*/
    HANDLE gEINTIntrThread;
    
    /* 按键按下中断事件*/
    HANDLE gWaitEvent;
    
    BOOL Key_IsPushed(VOID)
    {
        return ((v_pGPIOReg->GEDR3&(1<<5)?TRUE:FALSE));
    }
    VOID EINT_ConfigPinDefault(VOID)
    {
        v_pGPIOReg->GEDR3|=(1<<5);
    }
    DWORD EINTKey_IntrThread(PVOID pArg)
    {
        DWORD ret;
        gWaitEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
        if ( !( InterruptInitialize(dwSysIntr,gWaitEvent,0,0)))
        {
            RETAILMSG(1,(TEXT("ERROR:EINTKey:InterruptInitialize failed.\r\n")));
            CloseHandle(gWaitEvent);
            return 0;
    
        }
        while (1)
        {
            ret = WaitForSingleObject(gWaitEvent,INFINITE);
            if (ret == WAIT_OBJECT_0)
            {
                if (Key_IsPushed())
                {
                    Sleep(20);        //延时20ms用于滤去噪声
                    if(Key_IsPushed())
                    {
                        RETAILMSG(1,(TEXT(":::The Key1 Pushed.\r\n")));
                    }
                }
            }
            else
            {
    
            }
            InterruptDone(dwSysIntr);//通知内核,中断处理结束
        }
        return 1;
    
    }
    BOOL KYP_Init(DWORD dwContext)
    {
        DWORD IDThread;
        v_pGPIOReg->GPDR3 &=~( 0x1<<5 );//GPIO101
        v_pGPIOReg->GRER3 |=( 0x1<<5 );//使能上升沿中断
        v_pGPIOReg->GFER3 &=~( 0x1<<5 );//禁止下降沿中断
        v_pGPIOReg->GAFR3_L &=~( 0x3<<10);//设置为通用的IO口
            
        v_pGPIOReg->GPDR3 |= ( 0x1<<8 );//GPIO104
        v_pGPIOReg->GPSR3 |= ( 0x1<<8 );
        v_pGPIOReg->GAFR3_L &=~( 0x3<<16);//设置为通用的IO口
    
        v_pICReg->icmr |=( 0x1<<10 );//开屏蔽中断位
        v_pICReg->iclr &=~( 0x1<<10 );//中断被传递到IRQ中断输入
        v_pICReg->iccr |=0x01;        //没有被屏蔽的中断才能将处理器从空闲状态中唤醒
    
    
        KernelIoControl( IOCTL_HAL_REQUEST_SYSINTR,&d_SysIntr,sizeof(UINT32),
                        &d_SysIntr,sizeof(UINT32),NULL);
        //创建一个外部中断处理线程IST
        gEINTIntrThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)EINTKey_IntrThread,0,0,&IDThread);
        return TRUE;
    }
    
    2009年8月6日 6:35

答案

全部回复

  • 你的代码都是和硬件相关的,可是你用的是什么硬件平台呢??

    “其中101为中断线,104为高电平。
    总是默认产生一个中断,用电表去测,发现101为低,104为高”这段描述,也看的我晕乎乎的,不知道啥意思。
    Hello everybody
    2009年8月6日 7:11
    版主
  • 你的代码都是和硬件相关的,可是你用的是什么硬件平台呢??

    “其中101为中断线,104为高电平。
    总是默认产生一个中断,用电表去测,发现101为低,104为高”这段描述,也看的我晕乎乎的,不知道啥意思。
    Hello everybody

    将按键的一端接在GPIO101上,另一端接在GPIO104上了。设置104为输入口,为高电平。GPIO101为输入口。上升沿有效。
    将驱动加到映像中,下载,启动时。总是进入到中断中。但此时,我用电表量了一下按键的两端电压。接在GPIO104口上的一端为高电平,接在gpio101口的一端为低电平。电压应该说是正常的。但是不知道为什么产生了中断。
    当按下按键时,GPIO101端为高电平,应该是会产生中断才对啊,但是不知道为什么就是不能进入到中断中。
    2009年8月6日 7:19
  • 你的代码都是和硬件相关的,可是你用的是什么硬件平台呢??


    Hello everybody

    pxa270 wince 6.0
    2009年8月6日 7:20
  • 中断截获和发Event由ISR完成,建议LZ看看OAL的代码。ISR那里只能Enable LOG去看的,不能Debug哟。
    http://wince.cn/ or http://windowsce.com.cn/
    2009年8月6日 10:03
    版主