首页/外设速查/EXTI
⚡

EXTI 外部中断

基础外设
引脚边沿触发中断,让 CPU 及时响应外部事件而无需轮询,是实时系统的关键机制。
🧩 核心原理
📈 时序 / 工作过程图
GPIO 按键输入时序与消抖机械按键有抖动,需消抖后再作为有效电平KEY按下(抖动)稳定低电平释放(抖动)稳定高电平消抖方案:① 硬件RC滤波 ② 软件延时10-20ms再确认 ③ 定时器轮询+状态机输入模式:上拉(默认高)/下拉(默认低)/浮空 · 输出模式:推挽(强驱动)/开漏(需上拉)复用功能:GPIO 配置为 UART/SPI/I2C 等外设引脚(AF 映射)
⚙️ 配置 / 使用要点
  1. 配置 GPIO 为输入并选择 EXTI 模式
  2. 选择触发边沿(HAL: GPIO_MODE_IT_RISING 等)
  3. 使能 NVIC:HAL_NVIC_SetPriority + HAL_NVIC_EnableIRQ
  4. 实现回调:HAL_GPIO_EXTI_Callback(GPIO_Pin)
🛠️ 项目示例
外部中断检测按键/传感器报警
// PE4 下降沿触发外部中断
gi.Pin = GPIO_PIN_4;
gi.Mode = GPIO_MODE_IT_FALLING;      // 下降沿触发
gi.Pull = GPIO_PULLUP;               // 默认高,按下拉低
HAL_GPIO_Init(GPIOE, &gi);

HAL_NVIC_SetPriority(EXTI4_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(EXTI4_IRQn);

volatile uint8_t alarm_flag = 0;

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
  if(GPIO_Pin == GPIO_PIN_4){
    alarm_flag = 1;        // ISR 只置标志,不做事
  }
}
// 主循环:
if(alarm_flag){ alarm_flag = 0; /* 处理报警逻辑 */ }
❓ 面试高频
中断服务函数里能做什么、不能做什么?
能:读寄存器、置标志、清中断标志。不能:长延时、printf、复杂运算——会阻塞其他中断导致响应超时
中断嵌套怎么实现?
NVIC 抢占优先级:高抢占优先级可打断低优先级中断;同抢占下按子优先级排队
共享变量在中断与主循环之间怎么保护?
加 volatile 修饰;多字节变量用临界区(关中断)保护,或使用原子操作
为什么不能直接在中断里做任务?
实时性会被破坏:其他中断被长时间阻塞、栈开销大、重入风险
✅ 自查清单 (点击勾选,本地保存)
0/0
能画中断响应流程图
知道ISR三原则(短/清标志/置标志)
会配置NVIC优先级
知道volatile在中断中的意义
会做中断标志+主循环处理模式