5910|10

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

新手求教,GPIO中断中物理中断和逻辑中断关联 [复制链接]

新手求教。(芯片ep9315,环境:wince5.0)

我想将GPIO12设为中断,        看到论坛里有两种方法:静态映射和动态映射;都没太明白。
我的程序是看论坛后拼凑的,好像物理中断和逻辑中断关联不上
问题一:现在我想用静态映射的方法,是不是必须要用OALIntrStaticTranslate(),在哪里用,如何用?
问题二:能在在xxx_init里设置吗?
比如:p2=&v_pIOPRegs->PBDDR;//设为输入端
                 *p2=0xef;
                 v_pIOPRegs->GPIOBIntEn=0x10;//GPIO12 中断
                 v_pIOPRegs->GPIOBIntType1=0x10;//edge 触发
        //         v_pIOPRegs->GPIOBIntType2=0x10;//上升沿触发。
问题二:以下与中断有关的几个文件之间有什么关系,在中断中分别起什么作用?

1、
Oalintr。H中定义了
#ifdef EDB9315A_CIR
#define SYSINTR_PIO_CIR        (SYSINTR_FIRMWARE+6)
#else
#define SYSINTR_IR              (SYSINTR_FIRMWARE+6)
#endif
2、
在D:\WINCE500\PLATFORM\Ep93xx\Src\Kernel\Hal\Common  interrupt.c中有以下函数:
OEMInterruptHandler,SysIntrNumToInterruptMask,OEMInterruptEnable,OEMInterruptDisable,OEMInterruptDone

3、nkintr.h 中有
// SYSINTR_DEVICES is the base for any non-OAL system interrupts
#define SYSINTR_DEVICES     8

#define SYSINTR_PROFILE             (SYSINTR_DEVICES+1)     // System Profiling
#define SYSINTR_TIMING              (SYSINTR_DEVICES+2)     // Latency Analysis
// SYSINTR_FIRMWARE is the base for any interrupts defined in the OAL
#define SYSINTR_FIRMWARE    (SYSINTR_DEVICES+8)

4、在intr.C中有如下代码

BSPIntrInit(){
::
  OALIntrStaticTranslate(SYSINTR_PCCARD_CSC_S0, IRQ_GPIO0_PCMCIA_S0_CSC);
    OALIntrStaticTranslate(SYSINTR_PCCARD_CD_S0, IRQ_GPIO0_PCMCIA_S0_CD);
::
}
问题四:是不是需要在这用OALIntrStaticTranslate()?会不会和其他硬件冲突?

最新回复

      谢谢!!!,正好在做的项目中作为参考.  详情 回复 发表于 2010-2-14 19:53
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
DWORD io_12INTSysIntr=SYSINTR_PIO_CIR;

DWORD WINAPI AdsThread(LPVOID pArg){    //GPIO 中断线程

        DWORD ret;
        gWaitEvent = CreateEvent(NULL,FALSE,FALSE,NULL);

                if(!gWaitEvent){
                        RETAILMSG(1,(TEXT("Create AdsThread Event error\r\n")));
                        return 0;
                }
      RETAILMSG(1,(TEXT(":::Create ads IO_INTR  SYSINTR_PIO_CIR %x\n"),SYSINTR_PIO_CIR));

                if ( !(InterruptInitialize(io_12INTSysIntr,gWaitEvent,0,0))){

                  RETAILMSG(1,(TEXT("ERROR:EINT:InterruptInitialize failed.\r\n")));
                  CloseHandle(gWaitEvent);
                  return 0;
                }
                else {
                    RETAILMSG(1,(TEXT(":::Create ads IO_INTR link ok\r\n")));
                }

while(1){

           ret = WaitForSingleObject(gWaitEvent,INFINITE);
       
           RETAILMSG(1,(TEXT(":::EINT_IntrThread 0gpio12.\r\n")));

           if (ret == WAIT_OBJECT_0){

                          RETAILMSG(1,(TEXT(":::EINT_IntrThread gpio12.\r\n")));

           }
           else {
               
                //                CloseHandle(gWaitEvent);
                                RETAILMSG(1,(TEXT(":::EINT_IntrThread Exit.\r\n")));
                                return 0;

           }
           InterruptDone(io_12INTSysIntr);
  }


      return 0;
}

   


HANDLE ADS_Init(DWORD dwContext)
          {
          DWORD dwRet=1;

                  volatile UINT32 *p2;
                  HANDLE  hNewThread;
                  DWORD   IDThread;

          RETAILMSG(1,(TEXT("STRINGS:ADS_Init\n")));


             v_pIOPRegs =(volatile   IOPreg*)VirtualAlloc(0,   sizeof(IOPreg),
                                                                   MEM_RESERVE,  PAGE_NOACCESS);
  
        RETAILMSG(1,(L":::VirtualAlloc reservation @%8.8lx\r\n", v_pIOPRegs));
                                                             // the lenth is 0xf0000,why?
        if(v_pIOPRegs   == NULL)
                   {
                           RETAILMSG (1,(TEXT( "v_pIOPRegs   is   not   allocated\n\r ")));
                           return   0;
                   }


          // RETAILMSG(1,(L"recv data count %d\r\n",sizeof(IOPreg)));

       if(!VirtualCopy((PVOID)v_pIOPRegs,  (PVOID)(IOP_BASE>>8),
                               sizeof(IOPreg),  PAGE_READWRITE|PAGE_NOCACHE| PAGE_PHYSICAL)        )  
          
                          {
                           RETAILMSG  (1,(TEXT( "v_pIOPRegs   is   not   mapped\n\r ")));
                           return   0;
                          }

         RETAILMSG(1,(TEXT( ":::v_pIOPRegs   is   mapped   to   %x\n\r "),   v_pIOPRegs));


   
        //         p2=&v_pIOPRegs->PBDDR;//设为输入端
        //         *p2=0xef;

        //         v_pIOPRegs->GPIOBIntEn=0x10;//GPIO12 中断
        //         v_pIOPRegs->GPIOBIntType1=0x10;//edge 触发
        //         v_pIOPRegs->GPIOBIntType2=0x10;//上升沿触发
     //v_pIOPRegs->GPIOBEOI  ?


                hNewThread=CreateThread(NULL,0,AdsThread,NULL,0,&IDThread);
            RETAILMSG(1,(L":::ADS handle=%I64u\r\n",hNewThread));

            if(!hNewThread){
                        RETAILMSG(1,(TEXT(":::Create AdsThread error\r\n")));
                        return 0;
                }


         return hNewThread;

          }
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
打印信息 到Create ads IO_INTR link ok 即InterruptInitialize()执行了,再往下就没打印了

 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
我耐心等....
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 nikiforenko11 的回复:
我耐心等....
我耐心的帮顶,马上快过年了,大犇的归意都很浓,都很少逛论坛回贴子了,建议楼主年后再结贴(如果得到自己满意的答复,那就该尽快结贴,嘻嘻),你描述的比较详细,应该会有一个比较满意的答复。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
看看OAL,以及 按键驱动的每个头文件,你会有惊喜。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

7
 
大致过程是这样的:
  1. Irq = IRQ_EINT7;  //
  2. KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(UINT32), &m_dwSysintrEINT7, sizeof(UINT32), NULL)
  3. g_keyevtSignal =CreateEvent(NULL, FALSE, FALSE, NULL);   
  4. InterruptInitialize(m_dwSysintrEINT7, g_keyevtSignal, NULL, 0))
  5. CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)InterruptThreadKey,0,0,NULL);
  6. 在线程InterruptThreadKey中WaitForSingleObject(g_keyevtSignal, INFINITE);
复制代码
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
问题1 9315 不需要用那个函数就能实现。    interrupt。c有好多东西,虽然还不太明白
问题2 不需要在xxx-init里写, 要在interrupt。c里修改要中断的管脚
问题三 我继续求答案
问题四:intr。c不是9315 bsp自带的源文件。是什么mianstoneII里的。惭愧。我看了它好久

感谢三位的帮助,几乎每个帖子的留言里都有你们。我注意到了
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 veabol 的回复:
大致过程是这样的:
C/C++ codeIrq= IRQ_EINT7;//KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,&Irq,sizeof(UINT32),&m_dwSysintrEINT7,sizeof(UINT32), NULL)
g_keyevtSignal=CreateEvent(NULL, FALSE, FALSE, NULL);   
InterruptInitialize(m_dwSysintrEINT7, g_keyevtSignal, NULL,0))
CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)InterruptThreadKey,0,0,NULL);
在线程InterruptThreadKey中WaitForSingleObject(g_keyevtSignal, INFINITE);


你说的是动态关联,我现在能静态关联上了。触碰gpio有中断事件发生(在oemintrhandle等多处加了打印信息),但waitforsingleobjct不响应
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

10
 
动态关联还不会,不过我想应该不是在这出的问题,
WaitForSingleObject 不响应事件,我还是在 interrupt。c文件里打印调试信息吧
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

11
 
   
  谢谢!!!,正好在做的项目中作为参考.
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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