各位大神WINCE中断驱动有关问题
求助各位大神WINCE中断驱动问题
因为要用到一个中断,下降沿触发,所以自己尝试着写了一个中断驱动,运行起来没有什么问题,就是在关掉应用程序后再次打开应用程序后中断程序能进去,但是下降沿再也没有什么反应了:
初始化函数如下:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DWORD XPI_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
RETAILMSG(1,(TEXT("************[XPI]: XPI_OPEN***********\r\n")));
g_pGPIOReg = (volatile GPIO_REG*)DrvLib_MapIoSpace(BASE_REG_PA_GPIO, sizeof(GPIO_REG), FALSE);
if (g_pGPIOReg == NULL) {
RETAILMSG(TRUE, (TEXT("[XPI]:VirtualAlloc GPIO failed!\r\n")));
}
g_pGPIOReg->GPH0.GP_CON &= 0xfffffff0;
g_pGPIOReg->GPH0.GP_CON |= 0x0000000F;//set the pin EXT_INIT[0]
g_pGPIOReg->GPH0.GP_PUD &= 0xfffffffc;//
g_pGPIOReg->GPH0.GP_PUD |= 0x00000002;//pull-up enable
g_pGPIOReg->EINTCON.EXT_INT0_CON &= 0xfffffff0;
g_pGPIOReg->EINTCON.EXT_INT0_CON |= 0x00000002;//falling edge trigered
g_pGPIOReg->EINTFLT.EXT_FLT0_CON._FLT_CON0 &= 0xffffff00;
g_pGPIOReg->EINTFLT.EXT_FLT0_CON._FLT_CON0 |= 0x000000c0;//enable delay filter
g_pGPIOReg->EINTMSK.EXT_INT0_MASK &= 0xffffffe;//enable interrupt
g_pGPIOReg->EINTPND.EXT_INT0_PEND &= 0xffffffE;
g_pGPIOReg->EINTPND.EXT_INT0_PEND |= 0x00000001;
//
m_interruptPhyId = IRQ_EINT0;
if(!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &m_interruptPhyId, sizeof(DWORD), &m_interruptSysId, sizeof(DWORD), NULL))
{
RETAILMSG(1, (TEXT("*************kernelIoControl fail\r\n")));
m_interruptSysId = SYSINTR_UNDEFINED;
return FALSE;
}
m_interruptEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if(INVALID_HANDLE_VALUE == m_interruptEvent)
{
RETAILMSG(1, (TEXT("[XPI]:Create m_interruptEvent fail\r\n")));
return FALSE;
}
m_interruptThread=CreateThread(NULL, //Security
0, //No Stack Size
(LPTHREAD_START_ROUTINE)Threadproc,//Interrupt Thread
NULL, //No Parameters
CREATE_SUSPENDED, //Create Suspended
lpThreadId);//Thread Id
//set the thread priority
threadpriority = 6;
if( !CeSetThreadPriority( m_interruptThread, threadpriority))
{
RETAILMSG(1,(TEXT("test: Failed setting Thread Priority.\r\n")));
return FALSE;
}
if (!InterruptInitialize(m_interruptSysId,m_interruptEvent,NULL,0))
{
ERRORMSG( 1, (TEXT("test interrupt is not initialized\n\r")));
return(FALSE);
因为要用到一个中断,下降沿触发,所以自己尝试着写了一个中断驱动,运行起来没有什么问题,就是在关掉应用程序后再次打开应用程序后中断程序能进去,但是下降沿再也没有什么反应了:
初始化函数如下:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DWORD XPI_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
RETAILMSG(1,(TEXT("************[XPI]: XPI_OPEN***********\r\n")));
g_pGPIOReg = (volatile GPIO_REG*)DrvLib_MapIoSpace(BASE_REG_PA_GPIO, sizeof(GPIO_REG), FALSE);
if (g_pGPIOReg == NULL) {
RETAILMSG(TRUE, (TEXT("[XPI]:VirtualAlloc GPIO failed!\r\n")));
}
g_pGPIOReg->GPH0.GP_CON &= 0xfffffff0;
g_pGPIOReg->GPH0.GP_CON |= 0x0000000F;//set the pin EXT_INIT[0]
g_pGPIOReg->GPH0.GP_PUD &= 0xfffffffc;//
g_pGPIOReg->GPH0.GP_PUD |= 0x00000002;//pull-up enable
g_pGPIOReg->EINTCON.EXT_INT0_CON &= 0xfffffff0;
g_pGPIOReg->EINTCON.EXT_INT0_CON |= 0x00000002;//falling edge trigered
g_pGPIOReg->EINTFLT.EXT_FLT0_CON._FLT_CON0 &= 0xffffff00;
g_pGPIOReg->EINTFLT.EXT_FLT0_CON._FLT_CON0 |= 0x000000c0;//enable delay filter
g_pGPIOReg->EINTMSK.EXT_INT0_MASK &= 0xffffffe;//enable interrupt
g_pGPIOReg->EINTPND.EXT_INT0_PEND &= 0xffffffE;
g_pGPIOReg->EINTPND.EXT_INT0_PEND |= 0x00000001;
//
m_interruptPhyId = IRQ_EINT0;
if(!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &m_interruptPhyId, sizeof(DWORD), &m_interruptSysId, sizeof(DWORD), NULL))
{
RETAILMSG(1, (TEXT("*************kernelIoControl fail\r\n")));
m_interruptSysId = SYSINTR_UNDEFINED;
return FALSE;
}
m_interruptEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if(INVALID_HANDLE_VALUE == m_interruptEvent)
{
RETAILMSG(1, (TEXT("[XPI]:Create m_interruptEvent fail\r\n")));
return FALSE;
}
m_interruptThread=CreateThread(NULL, //Security
0, //No Stack Size
(LPTHREAD_START_ROUTINE)Threadproc,//Interrupt Thread
NULL, //No Parameters
CREATE_SUSPENDED, //Create Suspended
lpThreadId);//Thread Id
//set the thread priority
threadpriority = 6;
if( !CeSetThreadPriority( m_interruptThread, threadpriority))
{
RETAILMSG(1,(TEXT("test: Failed setting Thread Priority.\r\n")));
return FALSE;
}
if (!InterruptInitialize(m_interruptSysId,m_interruptEvent,NULL,0))
{
ERRORMSG( 1, (TEXT("test interrupt is not initialized\n\r")));
return(FALSE);