EXTI 配置:GPIO 设为输入/复用、SYSCFG 选端口、EXTI 设触发沿(上升/下降/双边)、NVIC 使能中断并设优先级、写中断服务函数;优先级分抢占优先级和子优先级,数值越小越高;按键消抖用延时或定时器,不要在中断里 long delay。
本文概述
外部中断是单片机常用功能,面试常考:EXTI 配置、NVIC 优先级、中断服务函数、消抖。回答要给配置步骤。
核心要点
EXTI 配置步骤:GPIO输入→SYSCFG选端口→EXTI触发沿→NVIC使能→中断服务函数
每个 EXTI 线对应一个引脚号(EXTI0=PA0/PB0...),同号引脚不能同时中断
NVIC 优先级:抢占优先级(可打断)+ 子优先级(同抢占时排队),数值越小越高
中断服务函数要快,只置标志,主循环处理
按键消抖:硬件 RC 滤波或软件延时/定时器,不要在中断里 delay

面试官考察点
EXTI 基础题。面试官看你是否配过中断。重点听:SYSCFG、EXTI、NVIC、服务函数。
回答思路
给配置步骤和代码片段。
参考回答
配置步骤(HAL 库)。
GPIO 初始化:PA0 设为下拉输入(GPIO_MODE_IT_FALLING);
SYSCFG 选端口:HAL_GPIO_Init 自动配置 SYSCFG_EXTICR,把 EXTI0 连到 PA;
EXTI 触发沿:GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING(下降沿);
NVIC 使能:HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);HAL_NVIC_EnableIRQ;
中断服务函数:EXTI0_IRQHandler → HAL_GPIO_EXTI_IRQHandler → HAL_GPIO_EXTI_Callback。
/* 1. GPIO 配置 */
GPIO_InitTypeDef gi = {0};
gi.Pin = GPIO_PIN_0;
gi.Mode = GPIO_MODE_IT_FALLING;
gi.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &gi);
/* 2. NVIC */
HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
/* 3. 回调 */
void HAL_GPIO_EXTI_Callback(uint16_t pin){
if(pin==GPIO_PIN_0) key_flag = 1;
}
NVIC 优先级。
| 优先级类型 | 作用 | 数值 |
|---|---|---|
| 抢占优先级 | 高的可以打断低的中断 | 越小越高 |
| 子优先级 | 同抢占优先级时,先响应高的 | 越小越高 |
优先级分组(HAL_NVIC_SetPriorityGrouping)决定抢占和子优先级各占几位:
GROUP_4:4 位抢占,0 位子(最常用,只有抢占);
GROUP_3:3 位抢占,1 位子;
GROUP_2:2+2。
中断服务函数原则。
中断里只做紧急的事(置标志、读数据),不做耗时操作;
不要在中断里 printf、delay、malloc;
共享变量用 volatile,主循环和中断都访问时注意临界区;
中断嵌套:高抢占优先级可以打断低的。
按键消抖。
硬件消抖:按键并 0.1μF 电容,或用 RC 滤波;
软件消抖:中断触发后启动 10ms 定时器,定时器里再读按键状态;
不要在中断服务函数里 HAL_Delay(依赖 SysTick,可能死锁);
用 EXTI + 定时器是标准做法。
注意。
EXTI0~4 各有独立中断向量,EXTI5~9 共享 EXTI9_5_IRQn,EXTI10~15 共享 EXTI15_10_IRQn;
同号引脚(PA0 和 PB0)不能同时用外部中断;
中断标志要在服务函数里清除(HAL 库自动清);
唤醒中断(STOP 模式)要用 EXTI,不能用普通中断。












