STM32CubeMx配置HAL库EXTI
本节以按键外部中断为例
GPIO配置
| Pin |
State |
Mode |
GPIO Pull-up/Pull-down |
User Label |
| PA0 |
GPIO_EXTI0 |
上升沿触发 |
Pull-down |
WK_UP_EXTI |
| PC5 |
GPIO_EXTI5 |
下降沿触发 |
Pull-up |
KEY0_EXTI |

NVIC配置
设置优先级组NVIC_PRIORITYGROUP_2
设置中断EXTI line0 interrupt和EXTI line[9:5] interrupt
启动中断Enabel

GENERATE CODE
gpio.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| void MX_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE();
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
GPIO_InitStruct.Pin = WK_UP_EXTI_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(WK_UP_EXTI_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = KEY0_EXTI_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(KEY0_EXTI_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LED0_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(LED0_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = KEY1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LED1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn);
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 2, 2); HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
}
|
stm32f1xx_hal_msp.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| void HAL_MspInit(void) {
__HAL_RCC_AFIO_CLK_ENABLE(); __HAL_RCC_PWR_CLK_ENABLE();
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
__HAL_AFIO_REMAP_SWJ_NOJTAG();
}
|
stm32f1xx_it.c文件中,有两个中断服务函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| void EXTI0_IRQHandler(void) {
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
void EXTI9_5_IRQHandler(void) {
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
}
|
编写中断回调函数
找到中断服务函数,按住ctrl+鼠标左键点击HAL_GPIO_EXTI_IRQHandler,找到函数定义

HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)即为中断回调函数
在stm32f1xx_it.c文件中编写
1 2 3 4 5 6 7 8 9 10 11 12
| void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { HAL_Delay(10); switch(GPIO_Pin){ case GPIO_PIN_0: HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); break; case KEY0_EXTI_Pin: HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); break; } }
|
或者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin==WK_UP_EXTI_Pin) { HAL_Delay(10); if(HAL_GPIO_ReadPin(WK_UP_EXTI_GPIO_Port, WK_UP_EXTI_Pin) == 1) { HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); } __HAL_GPIO_EXTI_CLEAR_IT(WK_UP_EXTI_Pin); } else if(GPIO_Pin==KEY0_EXTI_Pin) { HAL_Delay(10); if(HAL_GPIO_ReadPin(KEY0_EXTI_GPIO_Port, KEY0_EXTI_Pin) == 0) { HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); } __HAL_GPIO_EXTI_CLEAR_IT(KEY0_EXTI_Pin); } }
|