打印
[STM32F1]

STM32f103触发外部中断后再检测断开异常

[复制链接]
416|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laocuo1142|  楼主 | 2022-10-13 09:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现象如下,使用stm32f103c8t6PA11端口检测下降沿信号,外部中断采用的是下降沿触发,信号脉宽大于100us,现在现象是每次脉冲信号过来都会触发外部中断,然后我在中断里面延时20us后再次判定IO口状态时,检测到信号端口值为1,偶尔出现为0的情况,目前很费解,明明下降沿中断已经进来了,但是读取端口的状态确和预想的不一样,下面是初始化和检测部分的代码
IO端口初始化程序

外部中断初始化和检测程序


里面的MAGNETRON_WORK_ERR_IN变量是宏定义的
#define MAGNETRON_WORK_ERR_IN   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)

使用特权

评论回复
沙发
jcky001| | 2022-10-19 15:08 | 只看该作者

检查一下,还有没有其他的外部中断,恰好也用到了端口11呢?因为外部中断入口是几组IO口公用的。 或者在IO初始化时不小心打错了。

使用特权

评论回复
板凳
cr315| | 2022-10-19 15:09 | 只看该作者
中断里面不能加延时,加了中断运行就不正常。

使用特权

评论回复
地板
elephant00| | 2022-10-19 15:13 | 只看该作者
还有没有其他中断,也许被其他中断导致处理导致延时。另外外部信号是否有扰动,确实读到了高电平。

使用特权

评论回复
5
两只袜子| | 2022-10-19 15:59 | 只看该作者
中断到来时需要保护堆栈等一系列操作,需要耗费一段时间,再加上20uS延时,估计已经接近脉冲上升沿了,把延时20uS去掉试看看。

使用特权

评论回复
6
热爱童话世界| | 2022-10-24 00:34 | 只看该作者
你用的20us的延时是用定时器做的还是单片机跑空指令实现的?

使用特权

评论回复
7
銀河| | 2022-10-24 01:06 | 只看该作者
听你的描述就给我的感觉好像你的20us不是很准

使用特权

评论回复
8
岁月反驳| | 2022-10-24 01:38 | 只看该作者
你可以不用加这个20us的延时吧,是不是就能摆脱这个问题呢?

使用特权

评论回复
9
占得人间第一春| | 2022-10-24 02:10 | 只看该作者
有可能是你加了20us延时之后,再去读中断,可能没反应过来吧

使用特权

评论回复
10
可爱的白兔先生| | 2022-10-24 02:41 | 只看该作者
你要是采用定时器实现us级别的计时,是不是能好一些

使用特权

评论回复
11
漫过岁月| | 2022-10-24 05:03 | 只看该作者
你的IO端口初始化估计是没问题的,不然应该收不到中断信号的

使用特权

评论回复
12
风吻过你的不羁| | 2022-10-24 05:35 | 只看该作者
你收到外部触发中断之后,是不是需要清除一下中断标记啊

使用特权

评论回复
13
地下縱情搖擺| | 2022-10-24 06:07 | 只看该作者
其实我觉得不需要再加个小延时实现对信号的判断吧

使用特权

评论回复
14
极客晨星| | 2022-10-24 06:39 | 只看该作者
感觉外部触发会很稳定的,没必要加20us的延时,来实现类似于去抖操作

使用特权

评论回复
15
一枝香| | 2022-10-24 07:11 | 只看该作者
偶尔出现的话,你能确定信号脉宽每次都大于100us么?

使用特权

评论回复
16
SantaBunny| | 2022-12-7 18:21 | 只看该作者
你可以采用定时器来实现us级别的计时会不会能更好一些

使用特权

评论回复
17
Stahan| | 2022-12-8 19:10 | 只看该作者
是不是中断的时候又被别的中断给打断了吧

使用特权

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

本版积分规则

1041

主题

4319

帖子

10

粉丝