中断申请成功了。
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下来自带串口驱动已经可行,就是这个外部串口驱动不行,实在找不到什么原因。
说来惭愧,以前看代码看的多,做的少,现在实践起来连这个小问题都解决不了,请大家帮忙一下。实在没有法子才来问这个弱智问题的。
有可能是EINT10的边沿触发方式和其它的EINT 的 是一起控制的。
当你在初始化的时候把它搞成上边沿触发,
可能在其它的某一个地方又被改成下跳沿了,而且,另一个的优先级可能很搞,然后就不执行你的EINT10了 ,比如说RESET \POWER BUttonn的!
------------猜想!
引用: 引用 1 楼 xqhrs232 的回复:
最好把中断的流程整清楚
我觉得我的步骤没有错,因为我就是这么做,自带的三个串口都已经正常了。我觉得极有可能是被其他驱动的初始化干扰了。
我下次把其他的驱动禁用,再来试试。
下面的位操作太多了。不小心会改变其他设置。
反而简单的外部中断不会产生中断。
了解的帮一下忙,哈哈,谢谢。先买票去深圳逛两天先了。
引用: 引用 2 楼 YZZ2086 的回复:
有可能是EINT10的边沿触发方式和其它的EINT 的 是一起控制的。
当你在初始化的时候把它搞成上边沿触发,
可能在其它的某一个地方又被改成下跳沿了,而且,另一个的优先级可能很搞,然后就不执行你的EINT10了 ,比如说RESET \POWER BUttonn的!
------------猜想!
我觉得这个可能性比较大。哈哈,最好写个EVC程序,读出所有寄存器的值,看看是否是和设置的一样,这样就知道被什么干扰了。
周一就这么干。我上次弄GPIO模拟IIC也出现这种问题,在4.2BSP完全可行的,奶奶的,搬到5.0BSP就不行了。就是被别的地方干扰了。
使用个应用程序来读寄存器的值是非常合理的办法。
哦,来不及了,先去深圳了。
兄弟,最好再检查一下程序的配置,我以前也遇到过,其它中断都没有问题,但就是EINT0,1,2不行,时间过得太久了,具体我不记得是哪的问题了,但确定要检查清楚,如果还搞不定我再帮你去查一下我之前是怎么做的
引用: 引用 7 楼 xyj0663 的回复:
兄弟,最好再检查一下程序的配置,我以前也遇到过,其它中断都没有问题,但就是EINT0,1,2不行,时间过得太久了,具体我不记得是哪的问题了,但确定要检查清楚,如果还搞不定我再帮你去查一下我之前是怎么做的
哈哈,谢谢你,这是我到深圳后看到的最开心的回复了。thanks
在深圳还是想着这个郁闷的问题,大家没有过这种经验吗?
引用: 引用 11 楼 xiaopi224 的回复:
跟串口有关?写个其他的IST试试
IST 是在串口MDD层的,微软写好了,不用写的。
我明天开始使用应用程序逐一读出寄存器的值,这样估计就有机会了。
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口可能被复用了。在什么地方又给设成输出或者输入功能是很有可能的!
问题解决。这次是个经典的教训。打印信息这个方法不可靠。使用应用程序读出寄存器才是王道。
——果然是在别的地方被覆盖了,是键盘驱动。
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
哈哈,解决了这个问题了,但是还有个中断被占用的问题,现在看来已经是小问题了。
下一步是键盘驱动以及音频驱动修改了。
中断是驱动的核心内容,终于过关。前几天被打击了,重新获取信心。开心。