番外篇 - 如果同时有两个 GPIO 配成中断会发生什么?

STM32 中断架构的两个共享机制

第一层共享:EXTI 线按引脚号共用

每个引脚号对应一条固定的 EXTI 线:

  • 所有端口的 0 号脚(PA0/PB0/PC0…)共用 EXTI0
  • 所有端口的 1 号脚共用 EXTI1,以此类推到 15

同一条线同时只能接一个引脚: 所以你不能同时把 PA0 和 PB0 都设成中断(都抢 EXTI0),CubeMX 会报冲突。两个中断引脚要选不同的引脚号

第二层共享:多条 EXTI 线共用一个 NVIC 中断向量(服务函数)

这里有一个很好的图, 希望能帮助你理解Pasted image 20260622035736

如果你配置了两个 GPIO_EXIT

情况一:两个引脚分属不同向量(比如 PA0 用 EXTI0、PA10 用 EXTI15_10)它们有各自独立的中断服务函数,可以单独设置不同的抢占优先级,互不干扰。CubeMX 会在 NVIC 里使能两个中断。

情况二:两个引脚落在同一个分组(比如 PA5 和 PA6,都属于 EXTI9_5)它们共用同一个服务函数 EXTI9_5_IRQHandler,优先级也只能设一个(因为只有一个 NVIC 向量)。这时进了中断你必须自己判断是哪个引脚触发的。

但其实无论哪种情况,HAL 都把它们最终汇集到同一个回调 HAL_GPIO_EXTI_Callback,靠参数 GPIO_Pin 区分(这里如果你没有看实验篇的话可能有点不好理解, 看完实验篇之后再回头来看就行)