中断的电平触发和边沿触发有什么区别?
更新时间:2026-09-21。问题驱动短答页。中断基础见 中断与 DMA 入门,中断聚合见 事件路由/中断聚合器,按键输入见 消抖,轮询对比见 中断 vs 轮询。
一句话回答
电平触发(level-sensitive):只要中断请求线维持有效电平(高或低),就一直在请求;处理器响应后必须由外设把请求电平撤销(读数据清标志、写 1 清零、外设自动撤),否则退出中断又立刻重入。它的优点是请求“一直挂着”,在中断未使能或正在处理时不会丢,且多个开漏/线与器件可以共享一根中断线(如老式 PCI)。边沿触发(edge-triggered):只在信号出现上升沿或下降沿那一刻锁存一次请求,适合“事件/脉冲”型中断,外事件发生时产生一个脉冲即可、不必维持电平;但若脉冲比采样周期短、或发生在中断未使能/屏蔽窗口内,就可能错过,所以中断控制器通常用中断挂起(pending)寄存器把边沿事件锁存住,直到被清除。选择上:状态型、可共享、要求绝不丢的请求用电平;瞬时事件脉冲用电平不便保持时用边沿,并依赖 pending 锁存与消抖。
对比
| 维度 | 电平触发 | 边沿触发 |
|---|---|---|
| 请求条件 | 线维持有效电平 | 出现一个跳变沿 |
| 撤销方式 | 外设必须清请求源 | 脉冲过后即无,靠 pending 锁存 |
| 共享中断线 | 天然支持(线与/开漏) | 一般不共享 |
| 丢请求 | 不丢(电平在) | 脉冲太短/屏蔽期可能丢 |
| 典型 | PCI、可屏蔽状态中断 | GPIO 按键、事件脉冲、MSI(消息) |
| 清除 | 处理后撤电平/清标志 | 写 pending 清零 |
选择与处理要点
- 电平触发:ISR 里要真正清除根因(读接收寄存器、写 1 清中断源),否则反复进;共享线时 ISR 逐个检查谁在请求。
- 边沿触发:依赖中断控制器的 pending 锁存器;配置正确的极性(上升/下降)和触发方式;按键要消抖,避免一次按下多个沿,见 消抖。
- 多个外设事件集中时用中断聚合器统一管理挂起/屏蔽,见 中断聚合器。
- 现代 PCIe 多用基于内存写的 MSI/MSI-X 消息中断,本质是“事件”而非共享物理线。
常见坑
- 电平中断没清根因,ISR 退出立即重入形成“中断风暴”。
- 边沿中断脉冲太窄或与使能时序竞争,事件丢失。
- 按键不消抖,边沿触发一次按下进多次 ISR。
- 共享电平线时某个驱动漏清自己的请求,拖死整条线。
总结
电平触发以“请求线保持有效”为条件、不会丢且支持多器件线与共享,但 ISR 必须清除根因撤掉电平否则反复触发;边沿触发只在跳变瞬间请求、适合事件脉冲且不必维持,但短脉冲或屏蔽窗口会丢,需要中断挂起寄存器锁存并正确清 pending。状态型/共享/不容丢失选电平,瞬时事件选边沿并配合极性配置、消抖和 pending 管理。