STM32f103触发外部中断后再检测断开异常
现象如下,使用stm32f103c8t6PA11端口检测下降沿信号,外部中断采用的是下降沿触发,信号脉宽大于100us,现在现象是每次脉冲信号过来都会触发外部中断,然后我在中断里面延时20us后再次判定IO口状态时,检测到信号端口值为1,偶尔出现为0的情况,目前很费解,明明下降沿中断已经进来了,但是读取端口的状态确和预想的不一样,下面是初始化和检测部分的代码IO端口初始化程序
外部中断初始化和检测程序
里面的MAGNETRON_WORK_ERR_IN变量是宏定义的
#define MAGNETRON_WORK_ERR_IN GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)
检查一下,还有没有其他的外部中断,恰好也用到了端口11呢?因为外部中断入口是几组IO口公用的。 或者在IO初始化时不小心打错了。 中断里面不能加延时,加了中断运行就不正常。 还有没有其他中断,也许被其他中断导致处理导致延时。另外外部信号是否有扰动,确实读到了高电平。
中断到来时需要保护堆栈等一系列操作,需要耗费一段时间,再加上20uS延时,估计已经接近脉冲上升沿了,把延时20uS去掉试看看。
你用的20us的延时是用定时器做的还是单片机跑空指令实现的?
听你的描述就给我的感觉好像你的20us不是很准
你可以不用加这个20us的延时吧,是不是就能摆脱这个问题呢?
有可能是你加了20us延时之后,再去读中断,可能没反应过来吧
你要是采用定时器实现us级别的计时,是不是能好一些
你的IO端口初始化估计是没问题的,不然应该收不到中断信号的
你收到外部触发中断之后,是不是需要清除一下中断标记啊
其实我觉得不需要再加个小延时实现对信号的判断吧
感觉外部触发会很稳定的,没必要加20us的延时,来实现类似于去抖操作
偶尔出现的话,你能确定信号脉宽每次都大于100us么?
你可以采用定时器来实现us级别的计时会不会能更好一些 是不是中断的时候又被别的中断给打断了吧
页:
[1]