久芯网

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

avatar 利物浦之魂 提问时间: 2023-07-07 20:07:15 / 未解决

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里面还得再重复一遍这个使能函数呢。不知道我有没有说明白,请各位大佬们帮忙解答一下。

4个回答
  • avatar xmshao
    回答时间: 2023-07-07 20:24:16

    从你给出的代码来看,似乎也没啥问题。如果使用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); } } 不过,一般来讲,这个中断的使能没有啥必要开来关去的。

  • avatar 废鱼
    回答时间: 2023-07-07 20:47:20

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

  • avatar 利物浦之魂
    回答时间: 2023-07-07 21:06:55
    废鱼 发表于 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); 重复一遍,就能起作用了吗?

  • avatar 废鱼
    回答时间: 2023-07-07 21:34:12
    利物浦之魂 发表于 2023-2-23 09:20
    你好 现在问题是,我不在main程序里面调用HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);在MX_GPIO_Init(void)里面HA ...

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

会员中心 微信客服
客服
回到顶部