当前位置: 代码迷 >> WinCE >> 定时器中断驱动有关问题
  详细解决方案

定时器中断驱动有关问题

热度:75   发布时间:2016-04-28 12:55:04.0
定时器中断驱动问题
micro2440定时器中断,用定时器1,对应端口没有输出
以下是程序段

//中断IST
DWORD TIMER_IST(LPVOID lpParameter)
{DWORD dwRes = 0;
 BOOL bRes = 1;
while(1)
{dwRes = WaitForSingleObject(hIntpar,INFINITE);
  if (dwRes != WAIT_OBJECT_0)
  {
  MessageBox(NULL,_T("Wait timer event failed."), NULL, MB_OK);
  return 0;
  }
  else
  {
  //MessageBox(NULL,_T("Wait timer event ok."), NULL, MB_OK);
  if (bRes)
  {
  GpioUp();
  }
  else
  {
  GpioDown();
  }
  bRes = !bRes;
  }
InterruptDone(dwSysIntr);
  }
  return 0;
 }


//中断
VOID TimerInterrupt(void)
{
HANDLE hIntpar; //事件
HANDLE hThreadIST;//线程
DWORD dwSysIntr;
DWORD dwIrq=IRQ_TIMER1;
BOOL bRes;
//BOOL bTimerThreadRun;

//获取逻辑中断号
bRes = KernelIoControl( IOCTL_HAL_REQUEST_SYSINTR,
  &dwIrq,
  sizeof( dwIrq ),
  &dwSysIntr,
  sizeof( dwSysIntr ),
  NULL );
 if (!bRes)
 {
  RETAILMSG(1,(TEXT("Get system interrupt failed. \n")));
 // return FALSE;
 }
//创建事件
 hIntpar=CreateEvent(NULL,FALSE,FALSE,NULL);

 //创建线程
 DWORD dwThreadId;
 hThreadIST=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TIMER_IST, NULL, CREATE_SUSPENDED, &dwThreadId);
 CeSetThreadPriority(hThreadIST,5);
 //注册中断事件
 if(InterruptInitialize(dwSysIntr,hIntpar,NULL,NULL)){
RETAILMSG(1,(TEXT("Init interrupt ok! \n")));
 }
 else{ RETAILMSG(1,(TEXT("Init interrupt failed! \n")));

  }

 //bTimerThreadRun=TRUE;
//恢复线程等待
  ResumeThread(hThreadIST);
}


/*******************************************************************************************
函数名称: TIM_Init
描 述: 驱动程序初始化函数
输入参数: DWORD dwContext: 设备管理器传递给本驱动的参数, 通常为流接口驱动在注册表内的位置
输出参数: 无
返 回: 驱动程序句柄
*******************************************************************************************/
PUBLIC DWORD TIM_Init(DWORD dwContext)
{ TIM_InitializeAddresses();
TimerInterrupt();

#if 0
RETAILMSG(TRUE, (TEXT("v_pIOPregs->GPBCON is 0x%x).\r\n"), v_pIOPregs->GPBCON));
RETAILMSG(TRUE, (TEXT("v_PWMregs->TCFG0 is 0x%x).\r\n"), v_PWMregs->TCFG0)); 
RETAILMSG(TRUE, (TEXT("v_PWMregs->TCFG1 is 0x%x).\r\n"), v_PWMregs->TCFG1)); 
RETAILMSG(TRUE, (TEXT("v_PWMregs->TCMPB0 is 0x%x).\r\n"), v_PWMregs->TCMPB0)); 
RETAILMSG(TRUE, (TEXT("v_PWMregs->TCNTB0 is 0x%x).\r\n"), v_PWMregs->TCNTB0)); 
RETAILMSG(TRUE, (TEXT("v_PWMregs->TCON is 0x%x).\r\n"), v_PWMregs->TCON)); 
#endif

  RETAILMSG(1, (TEXT("::: PWM_Init Sucessfully. \r\n")));

return (DWORD)1;
}


/*******************************************************************************************
函数名称: TIM_IOControl
描 述: 驱动程序 I/O 请求
输入参数: 
输出参数:
返 回: TRUE: 成功 FALSE: 失败
*******************************************************************************************/
BOOL
TIM_IOControl(
  DWORD Handle,
  DWORD dwIoControlCode,
  PBYTE pInBuf,
  DWORD nInBufSize,
  PBYTE pOutBuf,
  DWORD nOutBufSize,
  PDWORD pBytesReturned
  相关解决方案