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

yaodi_1985_84   2009-9-15 17:23 楼主


   
主程序:
:
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);
就没继续往下跑,

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

回复评论 (15)

补充:
UINT32 TIMER2_IST(void)只有在
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TIMER2_IST,0, 0,&IDThread);
的时候来执行一次而已
点赞  2009-9-15 17:28
汗。。。
小弟还没有在ap中这么用过呢
点赞  2009-9-15 17:57
跪求各位弟兄阿
点赞  2009-9-15 20:36
现在不喜欢这个贴代码的方式了! 看起来头大!
动态的没搞过,到现在为止!
动态的可以再ISR里面加 响应IRQ的代码,  触摸屏的触点的动作就是Timer的,你看看是怎么弄的!
点赞  2009-9-15 21:19
这是在AP里的,我不确定在驱动和AP有啥差别
不过已经对过n个驱动了

现在就是中断不会产生
点赞  2009-9-16 09:20
使用应用程序读出相关寄存器,看是否符合中断的条件,
楼主以前是驱动开发网的红人啊。

哈哈,欢迎到eeworld开炉子!
点赞  2009-9-16 09:58
http://download.eeworld.net/source/1309950

这个是基于2410的中断处理的驱动和APP。可以参考下。很简单易懂
点赞  2009-9-16 10:37
仔细研究了..
可是..
一定得用驱动+APP的方式 才能加硬件中断吗?
能不能在APP里直接设定调用??

点赞  2009-9-16 11:22
你总要把你所需要控制的PIN脚设置为中断响应脚,如果他本身就是终端响应就可以用。
以前貌似在hjb大牛的blog里面看到过越过driver去分析ARM寄存器的方法,Googleman也应该知道。你可以去他的blog翻翻。如果可以越过直接控制ARM寄存器就是完全可以跳过驱动来做。只不过是把对底层控制的权限上抬到了AP上。

祝好运

个人意见仅供参考

Mercury
点赞  2009-9-16 11:37
这似乎不是单单ap可以读写寄存器就可以了..
目前知道TIMER2不能在AP层拿来当中断
TIMER0,1放在驱动里可以产生中断

但移到ap就死机了
点赞  2009-9-16 13:49
引用: 引用 10 楼 harktrip 的回复:
这似乎不是单单ap可以读写寄存器就可以了..
目前知道TIMER2不能在AP层拿来当中断
TIMER0,1放在驱动里可以产生中断

但移到ap就死机了


老兄,你在驱动中使用过了吗?

是否已经被驱动使用了这个timer?

比如触摸屏是需要timer的

检查一下,少走弯路。
点赞  2009-9-16 14:05
gooogleman
我改以驱动方式,用timer0,1都可产生pwm中断.
可是问题已驱动方式很不方便阿,我必须在ap里作..

timer0,1的中断移到ap来宣告执行..就死了..唉..搞了两天了
点赞  2009-9-16 16:20
搞定 结帖

因为测试败退出ap,改好ap再进入 还是失败
因为先前退出时 并未把timer0,1占用的中断给释放
so..答案出炉
点赞  2009-9-17 11:27
同问:
如果是在CE6的时候呢?
看hjb写的ce6访问内存的工具,

可是问题来了,透过驱动去设定寄存器
那定时中断的IST呢? 不就得写在那驱动里了?
中断不会在自己的AP里执行了??

点赞  2009-9-21 13:37
引用: 引用 13 楼 harktrip 的回复:
搞定 结帖

因为测试败退出ap,改好ap再进入 还是失败
因为先前退出时 并未把timer0,1占用的中断给释放
so..答案出炉

请教~~我要用定时中断,可驱动里就是不进中断,不知道你怎么解决的,帮帮我,很急!!
点赞  2009-10-20 10:07
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复