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里面还得再重复一遍这个使能函数呢。不知道我有没有说明白,请各位大佬们帮忙解答一下。 |
从你给出的代码来看,似乎也没啥问题。如果使用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); } } 不过,一般来讲,这个中断的使能没有啥必要开来关去的。
正常来说MX_GPIO_Init重新开启了外部中断配置,后续不需要操作。没有看到具体的代码,无法判断配置的过程。可以仿真模式下,执行玩MX_GPIO_Init后,看一下中断的配置状态。
[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); 重复一遍,就能起作用了吗?
你好 现在问题是,我不在main程序里面调用HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);在MX_GPIO_Init(void)里面HA ...
一次就行了。这个就需要看你配置的触发方式,还有外部中断在配置时的状态。这个是关联的。