【问题标题】:How would an ISR know what pin cause the interrupt?ISR 如何知道哪个引脚导致中断?
【发布时间】:2018-12-05 04:05:00
【问题描述】:

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

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

【问题讨论】:

  • 非常取决于您使用的MCU。
  • 我正在使用 MSP432,请问您对此有什么了解或我如何找到答案?

标签: interrupt microprocessors isr msp432


【解决方案1】:

正如其他人在 cmets 中所建议的,这可能取决于 MCU,但对于 ARM(MSP432 背后的核心),通常答案是它不知道,它会寻找它。 ARM 有一个vectored interrupt system,这意味着每个源都有自己的中断向量,因此 CPU 可以轻松找出哪个源正在触发 thr 中断。到目前为止一切顺利。
但是碰巧一个设备可以触发多个中断,就像你说的GPIO,在这种情况下,CPU知道哪个端口触发了中断,所以触发它是ISR,但是轮询设备寄存器是ISR的责任要找出确切的中断源,有许多具有多个中断、定时器、DMA 的外设,仅举几例。
这就是为什么通常外设都有一个中断使能位,可以让它们触发中断,但它们也有位掩码,可以控制什么可以在内部触发该中断,
还可以查看link 的实际示例,特别是在他们的ISR 上,它的功能与上述完全相同

【讨论】:

  • @LucasSeran,欢迎您,如果对您有帮助,请考虑接受答案
【解决方案2】:

在典型的 MCU 中,有数百甚至数千个潜在中断源。根据应用的不同,只有一些是重要的,而真正对时间至关重要的就更少了。

对于 GPIO 端口,您通常只启用对生成中断感兴趣的引脚。如果您只能安排端口的一个引脚来生成中断,那么工作就完成了,您的 port 处理程序可以完成工作,安全地知道只有在正确的引脚时才会调用它处于活动状态。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    相关资源
    最近更新 更多