2857|1

84

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

定时器中断驱动问题 [复制链接]

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
    )
{
        BOOL bErr = FALSE;  
               
        switch (dwIoControlCode)
        {
                case IOCTL_TIM_SET_PRESCALER:                                           /* 设置预分频值 */
                        if (nInBufSize >= 2)                            /* 需要2个字节缓冲区 */
                        {
                                TIM_SetPrescaler(pInBuf[0], pInBuf[1]);
                                bErr = TRUE;       
                        }
                break;
               
                case IOCTL_TIM_SET_DIVIDER:       
                    if (nInBufSize >= 2)                            /* 需要2个字节缓冲区 */
                bErr = TIM_SetDivider(pInBuf[0], pInBuf[1]);
                // 设置分频值        (定时器编号, 分频值)  
                   break;
               
                case IOCTL_TIM_START:
                        if (nInBufSize >= 3)                           /* 需要3个字缓冲区 */  
                        {
                            DWORD t_num = *((DWORD *)pInBuf);
                            DWORD cycle = *((DWORD *)(pInBuf + 4));
                            DWORD duty = *((DWORD *)(pInBuf + 8));               
#if 0
                                RETAILMSG(TRUE, (TEXT("t_num is 0x%x).\r\n"), t_num));
                                RETAILMSG(TRUE, (TEXT("cycle is 0x%x).\r\n"), cycle));
                                RETAILMSG(TRUE, (TEXT("duty  is 0x%x).\r\n"), duty));
#endif
                        bErr = TIM_StartPWM(t_num, cycle, duty);
                        }
                break;

                case IOCTL_TIM_GET_FREQUENCY:
                        if ((nInBufSize >= 0) && (nOutBufSize > 0))
                        {
                            DWORD t_num = *((DWORD *)pInBuf);

                        bErr = TIM_GetFrequency(t_num, (DWORD *)pOutBuf);
                                *pBytesReturned = 1;
                        }
                break;               

                default:
                break;
        }
       
    return bErr;
}   // TIM_IOControl




在应用程序中
void CTimeDlg::OnBnClickedStart()
{
        // TODO: Add your control notification handler code here
        BOOL ret;
        BYTE prescale[2]={1,97};
        BYTE divider[2]={1,2};
        UpdateData(TRUE);
       
        ret=::DeviceIoControl(hFile,IOCTL_TIM_SET_PRESCALER,prescale,2,NULL,0,NULL,NULL);
        if(ret!=TRUE)
        {MessageBox(_T("设置预分频失败"));
         return;
        }

        ret=::DeviceIoControl(hFile,IOCTL_TIM_SET_DIVIDER,divider,2,NULL,0,NULL,NULL);
        if(ret!=TRUE)
        {MessageBox(_T("设置分频失败"));
         return;
        }

        DWORD buff[3]={1,FREQ_VALUE,0};
    ret=::DeviceIoControl(hFile,IOCTL_TIM_START,buff,3,NULL,0,NULL,NULL);
        if(ret!=TRUE)
        {MessageBox(_T("启动定时器失败"));
        return;}

         DWORD timer=1,curfreq,actlen;
     ret=::DeviceIoControl(hFile,IOCTL_TIM_GET_FREQUENCY,&timer,1,&curfreq,1,&actlen,NULL);
         if(ret!=TRUE)
        {MessageBox(_T("获取频率失败"));
         return;
                 }
    m_srtTIMfreq.Format(_T("%d"),curfreq);
        UpdateData(FALSE);

}
用定时器0,TOUT0有输出。。。但用定时器1,中断,设置的端口没有反应,求助

最新回复

你没有对定时器1做设置和start吧。 你的TIM_setXXX函数原型看不到。 不知你怎么做的。 TimerInterrupt 最好不要放到init中做,也放在iocontrol中做,因为你会改变timerIrq  详情 回复 发表于 2010-6-7 20:21
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
你没有对定时器1做设置和start吧。 你的TIM_setXXX函数原型看不到。
不知你怎么做的。
TimerInterrupt 最好不要放到init中做,也放在iocontrol中做,因为你会改变timerIrq
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表