通过HAL库配置好外部中断后,会生成如下代码:
static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 *//* GPIO Ports Clock Enable */__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/*Configure GPIO pin : PA3 */GPIO_InitStruct.Pin = GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* EXTI interrupt init*/HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);HAL_NVIC_EnableIRQ(EXTI3_IRQn);/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}
设置中断引脚
GPIO_InitStruct.Pin = GPIO_PIN_3;
设置触发方式
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
设置有无上下拉电阻
GPIO_InitStruct.Pull = GPIO_NOPULL;
初始化
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
设置中断优先级
HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
中断使能
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
****因此我们要关闭中断只需要在想要关闭的地方写上
HAL_NVIC_DisableIRQ(EXTI3_IRQn);
即可****
关闭中断只是不去执行中断处理函数
中断处理函数在stm32f1xx_hal_gpio.c(不同型号文件名也不用,可以通过查找中断回调函数HAL_GPIO_EXTI_Callback,点击find all,双击查找到的结果就可以跳转到该文件)
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{/* EXTI line interrupt detected */if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u){__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);HAL_GPIO_EXTI_Callback(GPIO_Pin);}
}
****生成的中断处理函数中会主动清除中断标志位(__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);)
因此我们在打开中断前需要手动添加
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
进行中断标志位清零操作****