打印

再谈STM32 GPIO仅有边沿触发而没有电平触发中断的硬伤

[复制链接]
3205|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
reille|  楼主 | 2013-5-20 22:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在stm32板子上调试eCos DM9000网卡驱动,遇到一个很棘手的问题:在PC端ping STM32板时,发现ping一段时间后就ping不通了。查了一段时间后发现,ping不通时,DM9000的中断引脚电平是低电平(低电平触发中断),但是eCos却不再接收数据包了,也就是说eCos中没有接受到中断。

初始,我怀疑是不是我的中断安装有问题,但当我这时清除DM9000的中断状态寄存器(ISR)后,eCos又能接收到数据包了。后面,网上搜索STM32 GPIO中断资料的时候发现,原来是STM32的GPIO不支持电平触发中断,仅仅支持边沿触发。

所以,这就不难理解现ping一段时间后就ping不通了的原因:
DM9000驱动接收数据包时,首先会关闭中断,然后接收数据,接收完并处理数据后,才打开中断。如果在DM9000驱动接收完数据后,且在打开中断之前,DM9000又接收到的数据包,DM9000的中断引脚电平就会保持为有效的低电平直接到清除DM9000的中断状态寄存器,但这时没有打开中断啊,所以之后再也接受不到中断了(因为DM9000的中断引脚再也没有边沿跳变了,除非清除状态寄存器)。

不知道大家是如何处理这个问题的?

我现在的处理是:
当DM9000驱动接收数据,打开中断之后,再读下DM9000的中断状态寄存器,如果发现有接受到新数据包,则直接清除中断状态寄存器。这种处理不是很好:如果后面不来数据了怎么办?那这个数据包就会一直读不到,除非后面又来了新的数据包或者自己发送数据包(我设置了发送数据包也会产生中中断)

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎加入eCos群:144940146 欢迎访问我的个人博客: http://velep.com 喜欢eCos,就像当初喜欢linux一样,如果你也有兴趣访问:http://52ecos.net

17

主题

584

帖子

3

粉丝