laocuo1142 发表于 2022-10-13 09:09

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

现象如下,使用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

还有没有其他中断,也许被其他中断导致处理导致延时。另外外部信号是否有扰动,确实读到了高电平。

两只袜子 发表于 2022-10-19 15:59


中断到来时需要保护堆栈等一系列操作,需要耗费一段时间,再加上20uS延时,估计已经接近脉冲上升沿了,把延时20uS去掉试看看。

热爱童话世界 发表于 2022-10-24 00:34

你用的20us的延时是用定时器做的还是单片机跑空指令实现的?

銀河 发表于 2022-10-24 01:06

听你的描述就给我的感觉好像你的20us不是很准

岁月反驳 发表于 2022-10-24 01:38

你可以不用加这个20us的延时吧,是不是就能摆脱这个问题呢?

占得人间第一春 发表于 2022-10-24 02:10

有可能是你加了20us延时之后,再去读中断,可能没反应过来吧

可爱的白兔先生 发表于 2022-10-24 02:41

你要是采用定时器实现us级别的计时,是不是能好一些

漫过岁月 发表于 2022-10-24 05:03

你的IO端口初始化估计是没问题的,不然应该收不到中断信号的

风吻过你的不羁 发表于 2022-10-24 05:35

你收到外部触发中断之后,是不是需要清除一下中断标记啊

地下縱情搖擺 发表于 2022-10-24 06:07

其实我觉得不需要再加个小延时实现对信号的判断吧

极客晨星 发表于 2022-10-24 06:39

感觉外部触发会很稳定的,没必要加20us的延时,来实现类似于去抖操作

一枝香 发表于 2022-10-24 07:11

偶尔出现的话,你能确定信号脉宽每次都大于100us么?

SantaBunny 发表于 2022-12-7 18:21

你可以采用定时器来实现us级别的计时会不会能更好一些

Stahan 发表于 2022-12-8 19:10

是不是中断的时候又被别的中断给打断了吧
页: [1]
查看完整版本: STM32f103触发外部中断后再检测断开异常