凡亿教育-大康
凡事用心,一起进步
打开APP
公司名片
凡亿课堂 | 面试指南
当前位置: 首页 面试指南
STM32外部中断EXTI怎么配置?中断优先级怎么设?按键消抖怎么处理?嵌入式面试
浏览量:305
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中断优先级按键消抖抢占优先级


声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。仅供学习交流使用,不构成商业目的。版权归原作者所有,如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时删除。 侵权投诉

相关文章

行为面试:项目中发现原理图、BOM和PCB版本不一致,你怎么推动工程变更闭环?

2026-10-23 14:08:47

STM32 CAN怎么配置?波特率、位时序、过滤器、收发流程怎么处理?

2026-10-11 15:24:43

大厂/创业公司/外包公司面试有什么区别?工程师如何针对性准备

2026-08-04 15:53:27

单片机项目经验怎么讲才不显得太基础?工程师面试表达技巧

2026-08-06 17:05:51

FPGA跨时钟域信号怎么处理?面试别只回答“打两拍”

2026-07-29 13:56:32