主程序:
:
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);
就没继续往下跑,
各位弟兄阿)))))))))))))
肯定出手相救阿))))))))))))
补充:
UINT32 TIMER2_IST(void)只有在
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TIMER2_IST,0, 0,&IDThread);
的时候来执行一次而已
现在不喜欢这个贴代码的方式了! 看起来头大!
动态的没搞过,到现在为止!
动态的可以再ISR里面加 响应IRQ的代码, 触摸屏的触点的动作就是Timer的,你看看是怎么弄的!
这是在AP里的,我不确定在驱动和AP有啥差别
不过已经对过n个驱动了
现在就是中断不会产生
使用应用程序读出相关寄存器,看是否符合中断的条件,
楼主以前是驱动开发网的红人啊。
哈哈,欢迎到eeworld开炉子!
http://download.eeworld.net/source/1309950
这个是基于2410的中断处理的驱动和APP。可以参考下。很简单易懂
仔细研究了..
可是..
一定得用驱动+APP的方式 才能加硬件中断吗?
能不能在APP里直接设定调用??
你总要把你所需要控制的PIN脚设置为中断响应脚,如果他本身就是终端响应就可以用。
以前貌似在hjb大牛的blog里面看到过越过driver去分析ARM寄存器的方法,Googleman也应该知道。你可以去他的blog翻翻。如果可以越过直接控制ARM寄存器就是完全可以跳过驱动来做。只不过是把对底层控制的权限上抬到了AP上。
祝好运
个人意见仅供参考
Mercury
这似乎不是单单ap可以读写寄存器就可以了..
目前知道TIMER2不能在AP层拿来当中断
TIMER0,1放在驱动里可以产生中断
但移到ap就死机了
gooogleman
我改以驱动方式,用timer0,1都可产生pwm中断.
可是问题已驱动方式很不方便阿,我必须在ap里作..
timer0,1的中断移到ap来宣告执行..就死了..唉..搞了两天了
搞定 结帖
因为测试败退出ap,改好ap再进入 还是失败
因为先前退出时 并未把timer0,1占用的中断给释放
so..答案出炉
同问:
如果是在CE6的时候呢?
看hjb写的ce6访问内存的工具,
可是问题来了,透过驱动去设定寄存器
那定时中断的IST呢? 不就得写在那驱动里了?
中断不会在自己的AP里执行了??
引用: 引用 13 楼 harktrip 的回复:
搞定 结帖
因为测试败退出ap,改好ap再进入 还是失败
因为先前退出时 并未把timer0,1占用的中断给释放
so..答案出炉
请教~~我要用定时中断,可驱动里就是不进中断,不知道你怎么解决的,帮帮我,很急!!