问个简单的中断问题

fengjia   2009-2-27 23:06 楼主
中断申请成功了。



DWORD GetUartSysIRQ(DWORD dwUartIRQ)
{
RETAILMSG(1, (TEXT("GetUartSysIRQ! \r\n")));
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwUartIRQ, sizeof(DWORD), &g_UartSysIntr, sizeof(DWORD), NULL))
    {
        RETAILMSG(1, (TEXT("ERROR:  Failed to request sysintr value for Uart interrupt.\r\n")));
        return(0);
    }
    RETAILMSG(1,(TEXT("INFO: Mapped UartIrq 0x%x to UartSysIntr 0x%x.\r\n"), dwUartIRQ, g_UartSysIntr));
return g_UartSysIntr;

}
——这些打印信息都正常。申请中断成功。







在初始化驱动的时候把GPF1配置成EINT1



PRIVATE volatile IOPreg *s2440IOP;



PRIVATE BOOL
SER_VirtualAllocIOP(VOID)
{
    RETAILMSG(1,(TEXT("::: SER_VirtualAlloc()-+IO PORT \r\n")));
s2440IOP = (volatile IOPreg *)SER_RegAlloc((PVOID)IOP_BASE, sizeof(IOPreg));
if (s2440IOP == NULL)
{
  ERRORMSG(1,(TEXT("For IOPreg: VirtualAlloc failed!\r\n")));
  VirtualFree((PVOID)s2440IOP, sizeof(IOPreg), MEM_RELEASE);
  return 0;
}
return 1;  
}






s2440IOP->rGPFCON = (s2440IOP->rGPFCON & ~(0x3<<2)) | (0x2<<2); //GPF1==EINT1 把IO配置成外部中断
s2440IOP->rGPFUP = (s2440IOP->rGPFUP | (0x1<<1));   // Disable pull-up.禁止上拉
s2440IOP->rEXTINT0=(s2440IOP->rEXTINT0 & ~(0xf<<4)) | (0x4<<4);  // Rising edge triggered.上升沿触发。



这个设置是有效 的,


但是我在EINT1所在端口接入一个能够产生上升沿的信号,就是死活不产生中断。根本没有跳到运行。


我是这么初始化的。


g_SYSINTR_SERIAL3=GetUartSysIRQ(g_Uart2Irq);
   //pSerObj = (PHWOBJ)(&IoObj3);
   pSerObj->BindFlags = THREAD_AT_INIT;  //  create thread when device is first attached.
   pSerObj->dwIntID = g_SYSINTR_SERIAL3;


//这里初始化中断也成功
if ( !InterruptInitialize(pSerialHead->pHWObj->dwIntID,
                              pSerialHead->hSerialEvent,
                              NULL,
                              0) ) {
        DEBUGMSG(ZONE_INIT | ZONE_ERROR,
                 (TEXT("Error initializing interrupt\n\r")));
        return(FALSE);
    }


从示波器看,这个外部中断EINT1已经接入了能产生上升沿的波形。
但是根据信息提示,根本没有产生中断,我真的搞得好郁闷。看了三天,什么芯片的数据手册都看了。

从5.0BSP可以知道,这个ISR三星5.0BSP已经实现的。我们不必理会。POWERBUTTON也是类似的。



我是完全照着POWERBUTTON驱动做的,但是就是不行。非常郁闷。

真的觉得很不应该,这种问题都搞不定。但是想来想去,查来、查去都查不出原因。请大家帮帮忙看看,这个问题应该很简单普遍的,只是我不知道还错在哪里、

对了,我的平台是2440 5.0BSP。我上面是外部扩展串口的中断部分。以前这个驱动在4.2BSP下运行正常的。我搬到5.0BSP下来自带串口驱动已经可行,就是这个外部串口驱动不行,实在找不到什么原因。

说来惭愧,以前看代码看的多,做的少,现在实践起来连这个小问题都解决不了,请大家帮忙一下。实在没有法子才来问这个弱智问题的。

回复评论 (17)

最好把中断的流程整清楚
点赞  2009-2-28 08:46
有可能是EINT10的边沿触发方式和其它的EINT 的 是一起控制的。
当你在初始化的时候把它搞成上边沿触发,
可能在其它的某一个地方又被改成下跳沿了,而且,另一个的优先级可能很搞,然后就不执行你的EINT10了 ,比如说RESET \POWER BUttonn的!
------------猜想!
点赞  2009-2-28 09:09
学习。。
点赞  2009-2-28 09:11
引用: 引用 1 楼 xqhrs232 的回复:
最好把中断的流程整清楚


我觉得我的步骤没有错,因为我就是这么做,自带的三个串口都已经正常了。我觉得极有可能是被其他驱动的初始化干扰了。

我下次把其他的驱动禁用,再来试试。

下面的位操作太多了。不小心会改变其他设置。

反而简单的外部中断不会产生中断。


了解的帮一下忙,哈哈,谢谢。先买票去深圳逛两天先了。
点赞  2009-2-28 09:11
引用: 引用 2 楼 YZZ2086 的回复:
有可能是EINT10的边沿触发方式和其它的EINT 的 是一起控制的。
当你在初始化的时候把它搞成上边沿触发,
可能在其它的某一个地方又被改成下跳沿了,而且,另一个的优先级可能很搞,然后就不执行你的EINT10了 ,比如说RESET \POWER BUttonn的!
------------猜想!


我觉得这个可能性比较大。哈哈,最好写个EVC程序,读出所有寄存器的值,看看是否是和设置的一样,这样就知道被什么干扰了。

周一就这么干。我上次弄GPIO模拟IIC也出现这种问题,在4.2BSP完全可行的,奶奶的,搬到5.0BSP就不行了。就是被别的地方干扰了。

使用个应用程序来读寄存器的值是非常合理的办法。


哦,来不及了,先去深圳了。
点赞  2009-2-28 09:15
写出来可以分享不?哈哈
点赞  2009-2-28 09:30
兄弟,最好再检查一下程序的配置,我以前也遇到过,其它中断都没有问题,但就是EINT0,1,2不行,时间过得太久了,具体我不记得是哪的问题了,但确定要检查清楚,如果还搞不定我再帮你去查一下我之前是怎么做的
点赞  2009-2-28 11:05
引用: 引用 7 楼 xyj0663 的回复:
兄弟,最好再检查一下程序的配置,我以前也遇到过,其它中断都没有问题,但就是EINT0,1,2不行,时间过得太久了,具体我不记得是哪的问题了,但确定要检查清楚,如果还搞不定我再帮你去查一下我之前是怎么做的


哈哈,谢谢你,这是我到深圳后看到的最开心的回复了。thanks
点赞  2009-2-28 14:02
顶。
点赞  2009-2-28 16:14
在深圳还是想着这个郁闷的问题,大家没有过这种经验吗?
点赞  2009-2-28 20:46
跟串口有关?写个其他的IST试试
点赞  2009-3-1 10:54
引用: 引用 11 楼 xiaopi224 的回复:
跟串口有关?写个其他的IST试试


IST 是在串口MDD层的,微软写好了,不用写的。


我明天开始使用应用程序逐一读出寄存器的值,这样估计就有机会了。
点赞  2009-3-1 22:08
PRIVATE volatile IOPreg *s2440IOP;


PRIVATE BOOL
SER_VirtualAllocIOP(VOID)
{
    RETAILMSG(1,(TEXT("::: SER_VirtualAlloc()-+IO PORT \r\n")));
s2440IOP = (volatile IOPreg *)SER_RegAlloc((PVOID)IOP_BASE, sizeof(IOPreg));
if (s2440IOP == NULL)
{
  ERRORMSG(1,(TEXT("For IOPreg: VirtualAlloc failed!\r\n")));
  VirtualFree((PVOID)s2440IOP, sizeof(IOPreg), MEM_RELEASE);
  return 0;
}
return 1;
}
楼主怎么把串口虚拟地址分配的代码借来用,不要乱了。直接用virtualalloc,virtualcopy.不是更明了。
我也感觉IO口可能被复用了。在什么地方又给设成输出或者输入功能是很有可能的!
点赞  2009-3-2 09:04
问题解决。这次是个经典的教训。打印信息这个方法不可靠。使用应用程序读出寄存器才是王道。

——果然是在别的地方被覆盖了,是键盘驱动。

C:\WINCE500\PLATFORM\SMDK2440A\Src\Drivers\Keybd\Kbdcommon\s3c2440kbd.cpp(388):  
// Setup IO port for SPI interface & Keyboard
        // Setup EINT1 (KBDINT)
    v_pIOPregs->GPFCON &= ~(0x3 << 2);         // Clear GPF1
    v_pIOPregs->GPFCON |= (0x2 << 2);          // Set GPF1 to EINT1 for Keyboard interrupt

    v_pIOPregs->EXTINT0 &= ~(0x7 << 4);    // Clear EINT1
    v_pIOPregs->EXTINT0 |= (0x2 << 4);     // fallig edge triggered for EINT1

在这里要隆重介绍论坛牛人sunrain_hjb,它的寄存器读写工具在一分钟以内让我找到问题。
这是它的博客。

http://www.cnblogs.com/we-hjb/archive/2008/10/23/1317176.html
点赞  2009-3-2 10:37
哈哈,解决了这个问题了,但是还有个中断被占用的问题,现在看来已经是小问题了。
下一步是键盘驱动以及音频驱动修改了。


中断是驱动的核心内容,终于过关。前几天被打击了,重新获取信心。开心。
点赞  2009-3-2 13:57
引用: 引用 14 楼 gooogleman 的回复:

在这里要隆重介绍论坛牛人sunrain_hjb,它的寄存器读写工具在一分钟以内让我找到问题。
这是它的博客。

http://www.cnblogs.com/we-hjb/archive/2008/10/23/1317176.html


好东东  !
欲善其事,先利其器!
点赞  2009-3-5 10:52
现在我的串口驱动又不行了。不知道怎么回事。
点赞  2009-4-13 13:44
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复