好久不来,关于GPIO中端口的诡异问题。

ywmen 2013-05-14 08:19:09
最近产品里的一个驱动出现中断线程不工作现象,表现为如下:
GPIO口配置为低电平触发模式,当低电平到来,关联的中断事件就会触发,中断线程等待这个事件后应该会执行相应的代码。
现在问题是:工作一段时间后,外部电路测试为低电平,但是中断线程卡在WaitForSingleObject()里,也就是没有中断事件过来。更奇怪的是当出现问题之后,使用自己写的应用程序读取此GPIO口的管教状态及里面的ISR寄存器,线程又重新恢复工作了。而且读出来的寄存器值和管脚电平都是正确的。
按理说读取IO口寄存器的值不会改变里面的内容,还有是不是读取的时候,芯片内部单元进行了什么操作?
请各位大神发表一下高见。
谢了。
...全文
217 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ywmen 2013-05-18
  • 打赏
  • 举报
回复
引用 7 楼 huayehanshan 的回复:
提供一点思路:你通过读取GPIO寄存器能够使程序再次正常运行。虽然说读取操作不改变寄存器状态,但是读取操作与写操作一样,都会使用总线,表明你的总线在有些时候会被钳死,导致中断无法正常触发,通过读取的操作能够解除这种钳死状态。所以建议你把地址总线、数据总线都在示波器上监视一下,看看中断死掉的情况下总线是什么情况,读取后,总线又是什么情况。这有助于你发现问题。
谢谢提供思路。 这个问题比较难出现,但是确实发现了。因此解决周期比较长。
ywmen 2013-05-18
  • 打赏
  • 举报
回复
引用 6 楼 lf_kyo 的回复:
中断处理完后的某些寄存器处理没有做好。 是否某些寄存器单位状态需要手动置位?比如中断标志什么的。 cpu是什么的?
CPU 为FSL的imx51. DDKGpioClearIntrPin这个接口就是处理完中断后清除中断标志位的。 整个平台使用的中断处理方式都一样,只是这个有异常,怀疑是不是GPIO内部有问题。
叶落寒山 2013-05-16
  • 打赏
  • 举报
回复
提供一点思路:你通过读取GPIO寄存器能够使程序再次正常运行。虽然说读取操作不改变寄存器状态,但是读取操作与写操作一样,都会使用总线,表明你的总线在有些时候会被钳死,导致中断无法正常触发,通过读取的操作能够解除这种钳死状态。所以建议你把地址总线、数据总线都在示波器上监视一下,看看中断死掉的情况下总线是什么情况,读取后,总线又是什么情况。这有助于你发现问题。
lf_kyo 2013-05-16
  • 打赏
  • 举报
回复
中断处理完后的某些寄存器处理没有做好。 是否某些寄存器单位状态需要手动置位?比如中断标志什么的。 cpu是什么的?
cclutpk 2013-05-15
  • 打赏
  • 举报
回复
楼主意思是大部分时间中断触发正常,但是有时候触发不了,操作一下寄存器又可以了?
ywmen 2013-05-15
  • 打赏
  • 举报
回复
引用 4 楼 cclutpk 的回复:
楼主意思是大部分时间中断触发正常,但是有时候触发不了,操作一下寄存器又可以了?
是的。
xqhrs232 2013-05-14
  • 打赏
  • 举报
回复
事件跟中断是怎样进行绑定的?绑定没?
ywmen 2013-05-14
  • 打赏
  • 举报
回复
贴上中断线程处理代码: while(TRUE) { Wait_Intr = WaitForSingleObject(g_hReadEvent, INFINITE); if(WAIT_OBJECT_0 == Wait_Intr) { ... ... ... ... DDKGpioClearIntrPin(DDK_GPIO_PORT4, 5); InterruptDone(g_dwReadSysIntr); } } return 1;
ywmen 2013-05-14
  • 打赏
  • 举报
回复
这个非常急,有烦各位大牛发表一下高见探讨一下。学习学习。

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧