stm32外部IO口中断的学习和问题(hal库)

不知道怎么了,最近实验哪个功能都有问题?
先前怀疑hal的定时器TIM初始化产生更新中断的问题
现在IO口的外部中断又出状况....

我就记录一下整个调试过程,如果哪里出了问题,有大神看出来的,请留言指正下,不胜感激!

要做的实验是:
PF7产生一个下降沿脉冲,连接到PA2端口(外部中断口),在这个外部中断callback函数里面关闭外部中断,
然后继续产生一个下降沿脉冲给PA2(按道理上此时已经关闭了外部中断,这第二次的脉冲是无效的,不会对外部中断寄存器产生影响),延时几秒钟,使能外部中断,观察中断函数callback是否会进入

现象是: 第二次脉冲给完之后,延时完成,瞬间打开中断立即就进入了中断callback函数,
我的判断是,第二次本应该无效的脉冲确确实实起了作用!
这是不对的......

14.jpg

配置如图
PF7用于输出一个脉冲,PF6用于指示LED
PA2作为外部中断端口
下降沿触发,带弱上拉

已邀请:

admin

赞同来自: ‭xxx

首先打开程序后,新建了一个callback.c的文件,添加到工程,


#include "stm32f4xx_hal.h"

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
if(GPIO_Pin == GPIO_PIN_2)
{

HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_6);

}
}

目的是:当将PF7和外部中断PA2连接起来的时候,由于中断的发生点亮PF6端口的led灯
然后我在main.c文件的while里面添加了:


HAL_Delay(1000);
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_7);


上面的目的是使PF7产生一个1S反转电平

以上,程序运行后,不连接PF7和PA2的时候,PF6口的led是不闪烁的
连接后,LED以2S一次的时间进行闪烁!
由于是下降沿触发中断,所以是2s

以上,调试和理论一样,正确

admin

赞同来自:

紧接着,测试关外部中断函数,能否关断
于是callback.c里面改成


void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
if(GPIO_Pin == GPIO_PIN_2)
{
HAL_NVIC_DisableIRQ(EXTI2_IRQn);
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_6);

}
}

测试,进入到callback一次后再也进不来了.
和理想情况一致

admin

赞同来自:

这次要在适当的时候再次开启外部中断

在while里面修改为:


if(circle_off==0)
{
HAL_Delay(1000);
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_7);
}
if(circle_off==1)
{
HAL_NVIC_EnableIRQ(EXTI2_IRQn);
}

目的是: 刚上电的时候PF7产生一个下降沿给PA2,产生一个外部中断,


void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
if(GPIO_Pin == GPIO_PIN_2)
{
HAL_NVIC_DisableIRQ(EXTI2_IRQn);
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_6);
circle_off ++;
}
}

外部中断里面定义了一个标志,说明进入中断的次数
之后,while中不在产生PF7的下降沿脉冲,同时开启外部中断,
实验结果:
中断只进入一次,在开启中断的时候是不会产生一个影响中断的东西的......
和我们的理想状态一致

admin

赞同来自:

这次,我们在第二次开启外部中断之后,再次让PF7产生一个下降沿,看看会不会产生中断,产生几个中断
于是,while中再次修改:


if(circle_off==0)
{
HAL_Delay(1000);
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_7);
}
if(circle_off==1)
{
HAL_NVIC_EnableIRQ(EXTI2_IRQn);
circle_off ++;
}
if(circle_off==2)
{
HAL_Delay(1000);
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_7);
}

这样当再次开启中断的时候数字变2,导致PF7开始产生下降沿,触发中断,中断callback不变
导致再次关闭外部中断,数字变3,也关闭了PF7的脉冲
实验结果:和描述一致

admin

赞同来自:

下面是关键测试:

这次必须在第二次开启中断之前,先完成两次脉冲给PA2口,
理想情况是虽然有下降沿过来,但是此时是中断不使能情况,
等我稍后开启中断的时候,不应该进入中断才对,事实如此吗?

程序改为:


if(circle_off==0)
{
HAL_Delay(1000);
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_7);
}
if(circle_off==1)
{
HAL_Delay(1000);
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_7);
HAL_Delay(1000);
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_7);
HAL_Delay(1000);
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_7);
circle_off ++;
}
if(circle_off==2)
{
HAL_NVIC_EnableIRQ(EXTI2_IRQn);
circle_off ++;
}

其他的不变

开机后,产生一个下降沿,产生中断,中断里关中断,然后再次产生两个下降沿,之后开启中断.

按照流程来看,最终效果是只进入一次中断,
但是测结果是进入了两次中断.

和上面的相比,得出结论
虽然利用


HAL_NVIC_DisableIRQ(EXTI2_IRQn);

关闭了中断,但是IO口还是会受到脉冲的影响
产生了中断标志,导致一开启中断立即进入中断callback

大神,问题出在哪里>?怎么解决

要回复问题请先登录注册