harktrip
驱动小牛
驱动小牛
  • 注册日期2003-11-30
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望457点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分2分
阅读:2019回复:4

2440+CE5,ap中增加TIMER2定时中断,为何无法进入中断?? (冰天雪地跪求)

楼主#
更多 发布于:2009-09-15 17:12
    
主程序:
:
PLC2->DT[900]=Init_TIMER2_Interrupt();
:
}


static    UINT32     g_TIMER2Irq = IRQ_TIMER2;
static    UINT32     g_TIMER2SysIntr = SYSINTR_UNDEFINED;
static    HANDLE     gTIMER2Thread;
static    HANDLE     gWaitEvent;
static    UINT32         fuck1;
UINT16 Init_TIMER2_Interrupt(void)
{
    DWORD IDThread;
    TIMER= (_TIMER*)V_Alloc((LPVOID)(TIMER_PH), sizeof(_TIMER));
    INTS= (_INTS*)V_Alloc((LPVOID)(INT_PH), sizeof(_INTS));

    //调用TIMER2, SRC=1 000 000 HZ
    TIMER->TCFG1&=~(0xf<<8);
    TIMER->TCFG1|=0x0<<8;            //div 2
    
    TIMER->TCNTB2=1000;            //每秒1000次
    TIMER->TCMPB2=500;
    
    TIMER->TCON&=~(0xf<<12);
    TIMER->TCON|=0x2<<12;
    TIMER->TCON&=~(0xf<<12);
    TIMER->TCON|=0x9<<12;            //启动TIMER-2+AUTO RELOAD模式

    gWaitEvent= CreateEvent(NULL, FALSE, FALSE, NULL);
    if (!gWaitEvent) return 0;
    
    // 从 OAL 请求一个 SYSINTR 值
    fuck1=KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_TIMER2Irq, sizeof(UINT32),&g_TIMER2SysIntr, sizeof(UINT32), NULL);
    PLC2->DT[14]=fuck1&0xffff;
    if (fuck1==NULL) return 1;
    
    if (!(InterruptInitialize(g_TIMER2Irq , gWaitEvent, NULL, 0)))  return 2;
    
     // 创建一个TIMER2中断处理线程 IST
    gTIMER2Thread= CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TIMER2_IST,0, 0,&IDThread);
    if (gTIMER2Thread== NULL)      return 3;
    return 4;    

}


UINT32 TIMER2_IST(void)
{    

    DWORD ret;
    PLC2->DT[6]++;

    // 外部中断线程开始运行
    while (1) {
            PLC2->DT[8]++;
            ret = WaitForSingleObject(gWaitEvent, INFINITE);
            PLC2->DT[10]++;
            if (ret == WAIT_OBJECT_0)
            {
                //测试有无中断
                PLC2->DT[0]++;                        
            }
            else
            {    
                PLC2->DT[2]++;    
                return 0;    
            }
            // 通知内核: 中断处理结束
            InterruptDone(g_TIMER2SysIntr);    
 
    }  
    
      return 1;

}


***********************
调用timer2 pwm中断如上:
调用中断的步骤正常,(返回值正常)

timer2的pwm有正常产生

但是...停在WaitForSingleObject(gWaitEvent, INFINITE);
就没继续往下跑,

各位弟兄阿)))))))))))))
肯定出手相救阿))))))))))))

harktrip
驱动小牛
驱动小牛
  • 注册日期2003-11-30
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望457点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分2分
沙发#
发布于:2009-09-15 17:30
补充:
UINT32 TIMER2_IST(void)只有在
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TIMER2_IST,0, 0,&IDThread);
的时候来执行一次而已
cfanlwn
驱动牛犊
驱动牛犊
  • 注册日期2009-09-17
  • 最后登录2009-10-21
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-09-18 09:22
是不是在操作系统下  TIMER2已经被占用了
fishly_0
驱动小牛
驱动小牛
  • 注册日期2005-09-10
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望466点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-09-18 17:35
Timer2中断有产生吗? 我之前遇到一个问题,由于一个中断源频繁的产生中断,导致Timer4中断无法得到响应。
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2009-09-22 21:43
这个硬件没用过,不清楚你对硬件的操作对不对,
注意几点就行了:
1,在IRQ中打印一下,看硬件中断来了没有。
2,程序的主纯种是否会退出,例如,是不是main函数中建了这个线程以后就返回了?如果main函数会返回就有可能会有问题。
学海无涯
游客

返回顶部