20910|121

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

[googleman帮我看看]定时器产生的中断请求,无法进入中断帮忙看看! [复制链接]

static HANDLE TimerEvent;
static HANDLE  TimerThread;
static    UINT32    g_TIMER2Irq = IRQ_TIMER2;
static    UINT32    g_TIMER2SysIntr = SYSINTR_UNDEFINED;


/*******************************************************************************************
函数名称: TimerGpioInit
描    述: 配置GPB4禁止上拉  引脚为TCLK[0]  Select PCLK with CLKOUT0   
          定时器4 :TCFG0 TCFG1 清零 GPG7为OUTPUT
输入参数: 无       
输出参数: 无
返    回: 无
********************************************************************************************/

BOOL TimerGpioInit()

{

RETAILMSG(1,(TEXT("TIMER_INTR_Gpio_setting --- \r\n")));

        s2440IO->rGPGCON=GPG7_out;
        s2440IO->rGPBCON &=~(0x03 << 4);
        s2440IO->rGPBCON |=  (0x02 << 4); //GPB2设置为TOUT2
    s2440IO->rGPBUP |= 0x1 << 2;
   


    return TRUE;

}


/*******************************************************************************************
函数名称:Timer4_Setup
描    述: 配置了Timer2定时器。
输入参数: 无       
输出参数: 无
返    回:  无
*******************************************************************************************/

void Timer2_Setup()

{


s2440PWM->rTCFG0 &= ~0xFF00;                                 // Timer2 预分频恢复为0
        //s2440PWM->rTCFG0 |= 0x4400;                    // 设置定时器 2 的预分频值          68
    s2440PWM->rTCFG0 |= 0x2200;                    // 设置定时器 2 的预分频值          68
        s2440PWM->rTCFG1 &= ~(0xF<<8);
        s2440PWM->rTCFG1 &= 0x0ff;                                 // MUX2: 1/2
        s2440PWM->rTCNTB2 = 2000;
        s2440PWM->rTCMPB2 = 1000;

        s2440PWM->rTCON &= ~(0xF<<12);
        s2440PWM->rTCON |= (0xB<<12);// /interval, inv-off, update TCNTB3&TCMPB3, start timer2
    s2440PWM->rTCON &= ~(2<<12);//clear manual update bit

}




/*******************************************************************************************
函数名称: TimerIntrProcessThread(void)
描    述:IST的具体执行过程在TimerIntrProcessThread函数中实现:
输入参数:
输出参数: 无
返    回:
*******************************************************************************************/
DWORD TimerIntrProcessThread(void)

{     
               
        while(1)

       {
              DWORD ret;

              RETAILMSG(1,(TEXT("I am in IST !!!\r\n")));

             ret= WaitForSingleObject(TimerEvent, INFINITE);

                          if (ret == WAIT_OBJECT_0)
              {
                    
                                  if((s2440IO->rGPGDAT &0x80)==0) //灯亮
                                 s2440IO->rGPGDAT |= 0xFFFF; //GPG7>>LED3灭
                             else
                             s2440IO->rGPGDAT &= 0xFF7F; //GPG7>>LED3亮
                    
              }
                           InterruptDone(g_TIMER2SysIntr);

       }



return TRUE;
}

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

DWORD TIM_Init(DWORD dwcontext)

{

      DWORD IDThread;
   
       TimerGpioInit();

       Timer2_Setup();
           // 创建中断中断事件
       TimerEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

// 初始化外部按键中断: 注册中断事件, 允许外部中断
        if (!(InterruptInitialize(g_TIMER2SysIntr, TimerEvent, 0, 0)))
        {
                RETAILMSG(1, (TEXT("ERROR: TIMER2TIM: InterruptInitialize failed.\r\n")));
                CloseHandle(TimerEvent);
                return 0;
        }
// 从 OAL 请求一个 SYSINTR 值
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_TIMER2Irq, sizeof(UINT32), &g_TIMER2SysIntr, sizeof(UINT32), NULL))
    {
        RETAILMSG(1, (TEXT("ERROR: TIMER2: Failed to request sysintr value for EINT interrupt.\r\n")));
        return(0);
    }
    RETAILMSG(1,(TEXT("INFO: TIMER2: Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_TIMER2Irq, g_TIMER2SysIntr));

    // 创建一个外部中断处理线程 IST
        TimerThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) TimerIntrProcessThread, 0, 0, &IDThread);
        if (TimerThread == NULL)
        {
                RETAILMSG(1, (TEXT("::: TIM_Init: CreateThread() Fail.\r\n")));
                KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR, &g_TIMER2SysIntr, sizeof(UINT32), NULL, 0, NULL);
                return 0;
        }

  
    RETAILMSG(1, (TEXT("::: TIM_Init Sucessfully! \r\n")));
   
    // 返回不为0的数
        return (DWORD)TimerThread;

}






BOOL TIM_Deinit(DWORD hDeviceContext)

{

       BOOL bRet = TRUE;

       RETAILMSG(1, (TEXT("TIMER_INTR_Deinit --- \r\n")));

       InterruptDisable(g_TIMER2SysIntr);

       CloseHandle(TimerThread);

       VirtualFree((void*)s2440IO, sizeof(IOPreg), MEM_RELEASE);

       VirtualFree((void*)s2440INT, sizeof(INTreg), MEM_RELEASE);

       VirtualFree((void*)s2440PWM, sizeof(PWMreg), MEM_RELEASE);

       return TRUE;

}

**********************************************************************
各位大侠 帮忙看看啊,哪里设置不对了呢,为什么中断没有呢?求解答,拜托了!!
加载驱动就失败 但是TIMER2端口有脉冲波出来~~~~·再不做出来,后果很严重了 ,555555555
可联系我QQ20461368

最新回复

我重复尝试同一个方法试已经没有意义了,因为不成功,我也照你们的方法做了,还是不成功,别人做成了的我如法炮制还是不成功,提示申请中断错误  详情 回复 发表于 2009-11-26 16:18
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
No irq for timer triggered in OEMInterruptHandler()?
Have you enabled this
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 faked 的回复:
No irq for timer triggered in OEMInterruptHandler()?
Have you enabled this

OEMInterruptHandler()里面要加使能吗?
这个是动态申请也要修改OEMInterruptHandler(),OEMInterruptEnable(),OEMInterruptDone()ma ?
我没有在这里进行添加程序、、、
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
高手来帮帮我啊。 再做不出来我就要被炒了5555555
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

5
 
嘿嘿,googleman不是我吧。

开玩笑的了。


-----------------------------------
楼主,我没有时间帮你看代码。
只有建议:
你找个timer使用的例子就可以找出你的不同点了。

比如触摸屏驱动下的timer使用问题,比如ADS下的timer测试程序。比较一下,自然豁然开朗。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
waiting for your superman  ...
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

7
 
// 初始化外部按键中断: 注册中断事件, 允许外部中断
if (!(InterruptInitialize(g_TIMER2SysIntr, TimerEvent, 0, 0)))
{
RETAILMSG(1, (TEXT("ERROR: TIMER2TIM: InterruptInitialize failed.\r\n")));
CloseHandle(TimerEvent);
return 0;
}
// 从 OAL 请求一个 SYSINTR 值
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_TIMER2Irq, sizeof(UINT32), &g_TIMER2SysIntr, sizeof(UINT32), NULL))
    {
        RETAILMSG(1, (TEXT("ERROR: TIMER2: Failed to request sysintr value for EINT interrupt.\r\n")));
        return(0);
    }
    RETAILMSG(1,(TEXT("INFO: TIMER2: Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_TIMER2Irq, g_TIMER2SysIntr));

这两个顺序反了吧, 先请求 sysIntr 的值
然后再绑定事件
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 4 楼 gooogleman 的回复:
嘿嘿,googleman不是我吧。

开玩笑的了。


-----------------------------------
楼主,我没有时间帮你看代码。
只有建议:
你找个timer使用的例子就可以找出你的不同点了。

比如触摸屏驱动下的timer使用问题,比如ADS下的timer测试程序。比较一下,自然豁然开朗。


就是说的你了啊:)
我看了,但是里面的timer没用中断啊,我走遍百度andGoogle ,现在问题也没解决!!
你帮帮我吧~~~~5555555
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 reallyu 的回复:
// 初始化外部按键中断: 注册中断事件, 允许外部中断
if (!(InterruptInitialize(g_TIMER2SysIntr, TimerEvent, 0, 0)))
{
RETAILMSG(1, (TEXT("ERROR: TIMER2TIM: InterruptInitialize failed.\r\n")));
CloseHandle(TimerEvent);
return 0;
}
// 从 OAL 请求一个 SYSINTR 值
? ? if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_TIMER2Irq, sizeof(UINT32), &g_TIMER2SysIntr, sizeof(UINT32), NULL))
? ? {
? ? ? ? RETAILMSG(1, (TEXT("ERROR: TIMER2: Failed to request sysintr value for EINT interrupt.\r\n")));
? ? ? ? return(0);
? ? }
? ? RETAILMSG(1,(TEXT("INFO: TIMER2: Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_TIMER2Irq, g_TIMER2SysIntr));

这两个顺序反了吧, 先请求 sysIntr 的值
然后再绑定事件


我不知道这个顺序有没反,我也是看别的程序上写的这个顺序呢

~~~~
等待 super man
 
 
 

回复

1

帖子

0

TA的资源

禁止访问

10
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
"加载驱动就失败"
这是什么意思?
实在不行用静态申请中断方法试试先
方法:在KERNEL中加上:OALIntrStaticTranslate(SYSINTR_TIMER2, IRQ_TIMER2);
     并且给SYSINTR_TIMER2一个逻辑号
      #define SYSINTR_TIMER2          (SYSINTR_FIRMWARE+x)
去掉kerneliocontrol 直接让g_TIMER2SysIntr = SYSINTR_TIMER2

把这段放在InterruptInitialize前面
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
上海联翔保洁公司简介 为上海世博会提供展馆专业保洁维护人员,具体详情请来电咨询!!
  联翔-上海保洁服务有限公司提供,,迎世博,清洁上海-美化城市!酒店,商场,展厅,外墙涂料,商务楼等是一家专业化与多元化为一体的上海保洁公司,上海清洁公司,上海清洗公司,地毯清洗,pvc地板打蜡,沙发清洗,大理石翻新,杨浦保洁,徐汇保洁,普陀保洁,长宁保洁,宝山保洁,卢湾保洁,浦东保洁,虹口保洁公司,成立于1998年。在短短的几年内,凭着精良的设备、丰富的经验以及真挚的服务,迅速发展。同时亦被“上海市保洁行业协会”指定为专业保洁单位。
    联翔-上海保洁公司不仅拥有专业的清洗保洁清洗技术人员,并有一流的进口机械设备, 如进口干泡清洗沙发机 、 多功能 地板打蜡抛光机、清洗刷地机、大理石翻新机、大功力地毯清洗清洁吸尘吸水机等, 及进口高效等一系列清洁剂,环保管理标准要求的保洁体系,通过宾馆式的服务程序,酒店星级保洁要求,保证我公司的服务质量满足客户的要求,
联翔-上海保洁公司真对上海各区分部与,浦东,卢湾,普陀,闵行,虹口,杨浦,徐汇,宝山,闸北,嘉定,松江,保洁公司,上海联翔保洁公司各区的分部, 希望上海新老客户来电咨询。谢谢 网址http://www.shlxbj.com
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

13
 
广告无孔不入。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 9 楼 gooogleman 的回复:
引用 6 楼 reallyu 的回复:
// 初始化外部按键中断: 注册中断事件, 允许外部中断
if (!(InterruptInitialize(g_TIMER2SysIntr, TimerEvent, 0, 0)))
{
RETAILMSG(1, (TEXT("ERROR: TIMER2TIM: InterruptInitialize failed.\r\n")));
CloseHandle(TimerEvent);
return 0;
}
// 从 OAL 请求一个 SYSINTR 值
? ? if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_TIMER2Irq, sizeof(UINT32), &g_TIMER2SysIntr, sizeof(UINT32), NULL))
? ? {
? ? ? ? RETAILMSG(1, (TEXT("ERROR: TIMER2: Failed to request sysintr value for EINT interrupt.\r\n")));
? ? ? ? return(0);
? ? }
? ? RETAILMSG(1,(TEXT("INFO: TIMER2: Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_TIMER2Irq, g_TIMER2SysIntr));

这两个顺序反了吧, 先请求 sysIntr 的值
然后再绑定事件


我也觉得是反了

我的是

if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_CamIrq, sizeof(UINT32), &g_CamSysIntr, sizeof(UINT32), NULL))
? ? {
? ? ? ? RETAILMSG(1, (TEXT("ERROR: CIS_INIT: Failed to request sysintr value for Camera interrupt.\r\n")));
? ? ? ? return(0);
? ? }

RETAILMSG(1,(TEXT("INFO: Mapped g_CamIrq 0x%x to g_CamSysIntr 0x%x.\r\n"), g_CamIrq, g_CamSysIntr));
//#define IRQ_CAM? ? ? ? ? ? 6
bSuccess = InterruptInitialize(g_CamSysIntr, CameraEvent, NULL, 0);
? ? if (!bSuccess)
? ? {
? ? ? ? RETAILMSG(1,(TEXT("Fail to initialize camera interrupt event\r\n")));
? ? ? ? return FALSE;
? ? }? ?

? ? CameraThread = CreateThread(NULL,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (LPTHREAD_START_ROUTINE)CameraCaptureThread,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &threadID);
? ?
? ? if (NULL == CameraThread ) {
? ? RETAILMSG(1,(TEXT("Create Camera Thread Fail\r\n")));
? ? }

触摸屏有定时器中断的,你仔细看看。


我都看了好几遍了,它里面只是设置了参数,但是没有IST啊~~~
我改了顺序后,还是不行,放在开发板上调试程序加载失败,但是有PWM脉冲波输出就是没有中断!!!
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 10 楼 wangxin_801115 的回复:
"加载驱动就失败"
这是什么意思?
实在不行用静态申请中断方法试试先
方法:在KERNEL中加上:OALIntrStaticTranslate(SYSINTR_TIMER2, IRQ_TIMER2);
? ? 并且给SYSINTR_TIMER2一个逻辑号
? ? ? #define SYSINTR_TIMER2? ? ? ? ? (SYSINTR_FIRMWARE+x)
去掉kerneliocontrol 直接让g_TIMER2SysIntr = SYSINTR_TIMER2

把这段放在InterruptInitialize前面


加载驱动是,我再开发板上用驱动调试器加载提示失败,但是有脉冲波输出那个端口,就是没中断。你说的静态的方法我也试过,还是不行,快帮帮我!!!!有没例程给我看看的
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 12 楼 gooogleman 的回复:
广告无孔不入。


还有  g_TIMER2Irq = IRQ_TIMER2;
这句我写的,IR1_TIMER2这个值是不是在s3c2410x_intr.h文件里都是定义好的,我确认下!!这个也是我估计的。。。
你快帮帮我啊~~·有没例程~~
 
 
 

回复

23

帖子

0

TA的资源

一粒金砂(高级)

17
 
驱动都没有哪还有中断啊

什么叫驱动调试器??

你先把这个驱动加载正确了
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

18
 
而且我只要加了相关中断的参数,(参照了触摸屏的)加载到开发板就死机。。
我也不会别的方法调试,只能每次都加载然后看行不行~~~555555555
哪位达人 帮帮我吧  QQ20461368
s2440INT->rINTMSK |= BIT_TIMER2;     // Mask timer1 interrupt.
    s2440INT->rSRCPND = BIT_TIMER2;     // Clear pending bit
    s2440INT->rINTPND = BIT_TIMER2;
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(中级)

19
 
引用 15 楼 september_119 的回复:
引用 12 楼 gooogleman 的回复:
广告无孔不入。


还有? g_TIMER2Irq = IRQ_TIMER2;
这句我写的,IR1_TIMER2这个值是不是在s3c2410x_intr.h文件里都是定义好的,我确认下!!这个也是我估计的。。。
你快帮帮我啊~~·有没例程~~

当然定义好的
不定义好编译器能让你过吗
估计你的BSP对TIME2的ISR已经处理好了
你只需要做IST,还有你得把你的驱动正确加载啊大哥
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

20
 
楼主使用应用动态加载驱动?

涉及中断的驱动用软件加载要小心,一定要在推出的时候卸载中断才行的。
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表