ISR如何知道哪个引脚引起中断?

时间:2018-12-05 04:05:00

标签: interrupt microprocessors isr msp432

可以为数字I / O端口上的特定引脚启用中断,对吗? ISR如何确定哪个引脚引起了中断?

因为向量表只有一个插槽用于Port1 ISR。因此,无论是否需要注意Port1上的哪个输入引脚,都将调用相同的ISR函数,除非我错了...

2 个答案:

答案 0 :(得分:1)

正如其他人在评论中建议的那样,这可能取决于MCU,但是对于ARM(MSP432背后的核心),通常答案是它不知道,它会寻找它。 ARM有一个vectored interrupt system,这意味着每个源都有其自己的中断向量,因此CPU可以轻松找出哪个源正在触发中断。到目前为止一切都很好。
但是然后碰巧,设备可以触发多个中断,如您所说的GPIO,在这种情况下,CPU知道哪个端口触发了中断,因此会触发ISR,但是它是{{1} }负责轮询设备寄存器以找出确切的中断源,其中的许多外设都带有多个中断,计时器,DMA,仅举几例。
这就是为什么通常的外设都有一个中断使能位,使它们能够触发中断的原因,但是它们也具有位掩码,用于控制究竟可以在内部触发该中断的内容,
另外,请查看此link的实际示例,尤其是其ISR的功能与上述功能完全相同

答案 1 :(得分:0)

在典型的MCU中,有成百上千个,甚至有成千上万个潜在的中断源。根据应用程序的不同,只有一些会很重要,而真正在时间上至关重要的会更少。

对于GPIO端口,通常只启用对产生中断感兴趣的引脚。如果您仅可以安排端口的一个引脚来生成中断,则此工作已完成,您的 port 的处理程序可以完成该工作,并确信只有在正确的引脚时才会调用该端口处于活动状态。

当您关注单个外围设备中的原因,并且没有单独使用矢量处理程序时,您需要依靠“非矢量”处理方法,并在确定哪个最终处理程序之前检查状态寄存器函数需要被调用。

有趣的是,您无法弄清是哪个引脚引起了中断-您只能看到轮询状态寄存器后,哪些引脚仍然处于激活状态。如果您关心两个脉冲之间的相位,则除非有专门的硬件支持,否则您可能无法在单个GPIO中实现这种区分。甚至多个异常向量也无济于事,除非您可以确定总是在第二个引脚置位之前发生第一个异常。