你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

咨询大佬关于中断的问题!Disable中断之后再Enable无法正常运行

[复制链接]
利物浦之魂 提问时间:2023-2-22 13:42 / 未解决

Disable中断之后再Enable无法正常运行,这是中断函数:

void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)

{ if(GPIO_Pin==GPIO_PIN_3) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);

HAL_NVIC_DisableIRQ(EXTI2_3_IRQn); EXIT_Sign=1; }

}

这是while循环

while (1) { / USER CODE END WHILE / if(EXIT_Sign==1) { HAL_Delay(2000); MX_GPIO_Init();

HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); EXIT_Sign=0; }

/ USER CODE BEGIN 3 / }

这样是可以实现功能的,但是只要注释掉if里面的

MX_GPIO_Init();

或者

HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);

这两个注释掉一个就无法实现功能。我的问题是:MX_GPIO_Init();函数里面有使能中断语句了HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);

为啥在if里面还得再重复一遍这个使能函数呢。不知道我有没有说明白,请各位大佬们帮忙解答一下。

收藏 评论5 发布时间:2023-2-22 13:42

举报

5个回答
xmshao 回答时间:2023-2-22 15:13:21
从你给出的代码来看,似乎也没啥问题。如果使用cubeMx配置的话,MX_GPIO_Init()里的确有使能相关中断的函数。


要不把你的主循环的代码稍微改成这样看看:


if(EXIT_Sign==1)
{
HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);



HAL_Delay(xxxx);


//MX_GPIO_Init();
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
EXIT_Sign=0;


}



我刚才找了STM32开发板就你的问题快速验证了 下,没有什么异常。实现的就是每按键一次,计数变量Count_Keypressed加1.


void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)  {
        HAL_NVIC_DisableIRQ(EXTI0_IRQn);


        KeyPressed=0xff; //按键检测标志


        Count_Keypressed++;//统计按键次数


}







  while (1)  {




    /* USER CODE BEGIN 3 */


       if (KeyPressed)
      {
        HAL_Delay(500);
        
        KeyPressed=0x0;
        
        HAL_NVIC_EnableIRQ(EXTI0_IRQn);
       }


   }



不过,一般来讲,这个中断的使能没有啥必要开来关去的。
废鱼 回答时间:2023-2-23 08:41:13

正常来说MX_GPIO_Init重新开启了外部中断配置,后续不需要操作。没有看到具体的代码,无法判断配置的过程。可以仿真模式下,执行玩MX_GPIO_Init后,看一下中断的配置状态。

利物浦之魂 回答时间:2023-2-23 09:20:42
废鱼 发表于 2023-2-23 08:41
[md]正常来说MX_GPIO_Init重新开启了外部中断配置,后续不需要操作。没有看到具体的代码,无法判断配置的过 ...

你好 现在问题是,我不在main程序里面调用HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);在MX_GPIO_Init(void)里面HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);调用一次不起作用,得再重复一遍相同的代码。我不明白为什么相同的代码写两遍就好了
/* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI2_3_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);
  HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);

重复一遍,就能起作用了吗?
废鱼 回答时间:2023-2-23 11:24:28

利物浦之魂 发表于 2023-2-23 09:20
你好 现在问题是,我不在main程序里面调用HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);在MX_GPIO_Init(void)里面HA ...

一次就行了。这个就需要看你配置的触发方式,还有外部中断在配置时的状态。这个是关联的。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版