STM32外部中断EXTI怎么配置?中断优先级怎么设?按键消抖怎么处理?嵌入式面试

浏览量:391
时间: 2026-09-24 09:22:57
一句话答案

EXTI 配置:GPIO 设为输入/复用、SYSCFG 选端口、EXTI 设触发沿(上升/下降/双边)、NVIC 使能中断并设优先级、写中断服务函数;优先级分抢占优先级和子优先级,数值越小越高;按键消抖用延时或定时器,不要在中断里 long delay。

本文概述

外部中断是单片机常用功能,面试常考:EXTI 配置、NVIC 优先级、中断服务函数、消抖。回答要给配置步骤。

核心要点

  • EXTI 配置步骤:GPIO输入→SYSCFG选端口→EXTI触发沿→NVIC使能→中断服务函数

  • 每个 EXTI 线对应一个引脚号(EXTI0=PA0/PB0...),同号引脚不能同时中断

  • NVIC 优先级:抢占优先级(可打断)+ 子优先级(同抢占时排队),数值越小越高

  • 中断服务函数要快,只置标志,主循环处理

  • 按键消抖:硬件 RC 滤波或软件延时/定时器,不要在中断里 delay

STM32 开发板和按键触发外部中断,示波器显示中断响应波形

面试官:STM32 配置 PA0 下降沿触发外部中断,步骤是什么?中断优先级怎么设?

面试官考察点

EXTI 基础题。面试官看你是否配过中断。重点听:SYSCFG、EXTI、NVIC、服务函数。

回答思路

给配置步骤和代码片段。

参考回答

配置步骤(HAL 库)。

  1. GPIO 初始化:PA0 设为下拉输入(GPIO_MODE_IT_FALLING);

  2. SYSCFG 选端口:HAL_GPIO_Init 自动配置 SYSCFG_EXTICR,把 EXTI0 连到 PA;

  3. EXTI 触发沿:GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING(下降沿);

  4. NVIC 使能:HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);HAL_NVIC_EnableIRQ;

  5. 中断服务函数: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,不能用普通中断。

面试官可能追问

追问 1:EXTI5~9 为什么共享中断向量?
Cortex-M 内核中断向量数量有限,5~9 合并一个,10~15 合并一个。服务函数里要判断是哪个引脚。
追问 2:抢占优先级和子优先级区别?
抢占优先级高的可以打断正在执行的低抢占中断;子优先级只在同时触发时决定先后,不能打断。
追问 3:中断里为什么不能用 HAL_Delay?
HAL_Delay 依赖 SysTick 中断,如果 SysTick 抢占优先级比当前中断低,就不会触发,死等。
追问 4:volatile 为什么需要?
告诉编译器变量可能被中断修改,不要优化掉。主循环读 flag 必须 volatile。
追问 5:双边沿触发怎么用?
GPIO_MODE_IT_RISING_FALLING,按下和松开都触发。可以用来测按键时长或脉冲宽度。

常见失分表达

✗ 中断里做耗时操作 — 阻塞其他中断,系统响应慢。
✗ 共享变量不加 volatile — 编译器优化导致主循环读不到新值。
✗ 按键不消抖 — 一次按下触发多次中断。

准备动作

1
配一次 EXTI 中断
2
写一个按键消抖(EXTI+定时器)
3
准备一个中断优先级不对导致系统卡死的案例

核心关键词

STM32EXTI外部中断NVIC中断优先级按键消抖抢占优先级


声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。仅供学习交流使用,不构成商业目的。版权归原作者所有,如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时删除。侵权投诉
相关推荐HOT
PCB阻抗控制怎么设计?单端50Ω、差分100Ω、线宽线距、叠层怎么选?

一句话答案PCB阻抗控制要先定叠层和介质厚度,再用阻抗计算器反推线宽;单端50Ω常用外层4~6mil、内层3~5mil,差分100Ω常用线宽4~5mil、线距5... 详情>>

2026-10-11 15:24:14
三极管开关电路怎么设计?饱和和截止怎么判断?基极电阻怎么算?硬件面试

一句话答案三极管作开关:基极电流足够大时饱和(Vce≈0.2V,Ic 由负载决定),基极无电流时截止(Ic≈0);饱和条件 Ib ≥ Ic(sat)/β,实际取... 详情>>

2026-09-24 09:22:42
射频PCB为什么要用高频板材?射频工程师面试板材选型对比

分类:射频电路经验级别:中级难度:★★★☆☆题型:选型+参数理解本文概述:射频PCB选用高频板材的核心原因有两个:一是低介质损耗因子,在高频下信号衰减更小;二是... 详情>>

2026-08-14 10:33:03
电子工程师简历怎么写?项目经历、技能、STAR法则怎么用?面试技巧

一句话答案电子工程师简历 1 页(应届)~2 页(资深),结构:个人信息→求职意向→专业技能→项目经历→工作经历→教育背景;项目经历用 STAR 法则(情境-任... 详情>>

2026-10-10 23:11:21
电源完整性PI怎么仿真?PDN阻抗、去耦电容、目标阻抗怎么设计?PCB仿真面试

一句话答案电源完整性(PI)保证电源电压在负载变化时稳定,核心是 PDN(电源分配网络)阻抗低于目标阻抗;目标阻抗 Ztarget = (Vdd×ripple%... 详情>>

2026-10-10 23:11:06
开班信息