一.cubeMX外部中斷配置
??
1.系統內核
2.中斷管理
3.選擇搶占優先級和響應優先級,共有5個等級,在這里就使用庫函數編寫代碼時最常用的2位搶占優先級2位響應優先級。
4.勾選使能選項,后面的兩個零,第一個代表搶占優先級的等級,第二個代表子優先級的等級。
二.配置外部中斷對應引腳?
1.系統內核
2.GPIO相關配置
3.GPIO的模式,由于引腳配置為中斷模式,故在當前的GPIO模式下,會顯示出6種外部觸發模式,分別為:外部中斷上升沿觸發,外部中斷下降沿觸發,外部中斷上升沿下降沿觸發,外部上升沿觸發時間,外部下降沿觸發事件,外部上升沿下降沿觸發事件。
4.由于選擇了上升沿觸發,為了使上升沿觸發更加穩定,故將引腳下拉。
三.生成代碼
//stm32f1xx_hal_msp.c里面有 void HAL_MspInit(void),配置中斷優先級分組void HAL_MspInit(void)
{/* USER CODE BEGIN MspInit 0 *//* USER CODE END MspInit 0 */__HAL_RCC_AFIO_CLK_ENABLE();__HAL_RCC_PWR_CLK_ENABLE();HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);/* System interrupt init*//** NOJTAG: JTAG-DP Disabled and SW-DP Enabled*/__HAL_AFIO_REMAP_SWJ_NOJTAG();/* USER CODE BEGIN MspInit 1 *//* USER CODE END MspInit 1 */
}
//GPIO.c里面有配置好的引腳和中斷使能GPIO_InitStruct.Pin = KEY0_Pin|KEY1_Pin;GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);GPIO_InitStruct.Pin = KEY_UP_Pin;GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;GPIO_InitStruct.Pull = GPIO_PULLDOWN;HAL_GPIO_Init(KEY_UP_GPIO_Port, &GPIO_InitStruct);/* EXTI interrupt init*/HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);HAL_NVIC_EnableIRQ(EXTI0_IRQn);HAL_NVIC_SetPriority(EXTI3_IRQn, 1, 0);HAL_NVIC_EnableIRQ(EXTI3_IRQn);HAL_NVIC_SetPriority(EXTI4_IRQn, 2, 0);HAL_NVIC_EnableIRQ(EXTI4_IRQn);
//stm32f1xx_it.c里面有中斷服務函數的代碼(可以配置各部分的中斷服務函數)void EXTI0_IRQHandler(void)
{/* USER CODE BEGIN EXTI0_IRQn 0 *//* USER CODE END EXTI0_IRQn 0 */HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);/* USER CODE BEGIN EXTI0_IRQn 1 */__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);/* USER CODE END EXTI0_IRQn 1 */
}/*** @brief This function handles EXTI line3 interrupt.*/
void EXTI3_IRQHandler(void)
{/* USER CODE BEGIN EXTI3_IRQn 0 *//* USER CODE END EXTI3_IRQn 0 */HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);/* USER CODE BEGIN EXTI3_IRQn 1 */__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);/* USER CODE END EXTI3_IRQn 1 */
}/*** @brief This function handles EXTI line4 interrupt.*/
void EXTI4_IRQHandler(void)
{/* USER CODE BEGIN EXTI4_IRQn 0 *//* USER CODE END EXTI4_IRQn 0 */HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);/* USER CODE BEGIN EXTI4_IRQn 1 */__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);/* USER CODE END EXTI4_IRQn 1 */
}
四.自己編寫
stm32f1xx_hal.c里面設置了中斷優先級分組
void exti_init(void)
{GPIO_InitTypeDef gpio_init_struct;__HAL_RCC_GPIOE_CLK_ENABLE();gpio_init_struct.Pin = GPIO_PIN_4;gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;//設置成中斷觸發gpio_init_struct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOE, &gpio_init_struct);HAL_NVIC_SetPriority(EXTI4_IRQn, 2, 0);HAL_NVIC_EnableIRQ(EXTI4_IRQn);
}void EXTI4_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{delay_ms(20);if(GPIO_Pin == GPIO_PIN_4){if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)==0){HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);}}
}