可以为数字 I/O 端口上的特定引脚启用中断,对吗?ISR 如何确定哪个引脚导致了中断?
因为向量表只有一个用于 Port1 ISR 的插槽。因此,无论 Port1 上的哪个输入引脚需要注意,都会调用相同的 ISR 函数,除非我错了……
可以为数字 I/O 端口上的特定引脚启用中断,对吗?ISR 如何确定哪个引脚导致了中断?
因为向量表只有一个用于 Port1 ISR 的插槽。因此,无论 Port1 上的哪个输入引脚需要注意,都会调用相同的 ISR 函数,除非我错了……
正如其他人在评论中所建议的那样,这可能取决于 MCU,但对于 ARM(MSP432 背后的核心),通常答案是它不知道,它会寻找它。ARM 有一个vectored interrupt system
,这意味着每个源都有自己的中断向量,因此 CPU 可以轻松找出哪个源触发了中断。到目前为止,一切都很好。
但是碰巧一个设备可以触发多个中断,就像GPIO
你说的那样,在这种情况下,CPU知道哪个端口触发了中断,所以会触发它,ISR
但是有ISR
责任轮询设备寄存器以找出确切的中断源,有许多此类外设具有多个中断、定时器、DMA 等等。
这就是为什么通常外围设备有一个中断使能位,可以触发中断,但它们也有位掩码,可以控制在内部触发该中断
的确切内容,还请查看此链接以获取实际示例,特别是在他们的ISR
与上述完全相同
在典型的 MCU 中,有数百甚至数千个潜在的中断源。根据应用程序的不同,只有一些是重要的,而真正对时间至关重要的就更少了。
对于 GPIO 端口,您通常只启用对生成中断感兴趣的引脚。如果您只能安排端口的一个引脚来生成中断,那么工作就完成了,您的该端口的处理程序可以完成工作,安全地知道只有在正确的引脚处于活动状态时才会调用它。
当您关心单个外围设备中的原因并且没有单独矢量处理程序的奢侈时,您需要退回到“非矢量”方法,并在确定最终处理程序函数需要之前检查状态寄存器叫做。
有趣的是,您无法确定是哪个引脚导致了中断——您只能看到哪些引脚在您轮询状态寄存器后仍然处于活动状态。如果您关心两个脉冲之间的相位,您可能无法在单个 GPIO 中实现这种区分,除非有专门的硬件支持。即使是多个异常向量也无济于事,除非您可以确定第一个异常总是在第二个引脚设置之前发生。