我知道我们将GPIO转换为irq,但想了解这样做有什么好处? 如果我们需要中断为什么我们不能只在第一时间有中断线并直接用作中断?
答案 0 :(得分:3)
如果您正在为一个特定的系统设计一个定制的ASIC,那么您确实可以做到这一点 - 只能实现您所需要的。
然而,大多数处理器/ SoC都是作为商品生产的,因此更多的灵活性使它们可以集成到更广泛的系统中(从而销售更多)。鉴于现代硅工艺,芯片尺寸往往受到物理封装的限制,因此引脚数量绝对优势。因此,根据用户的需要,允许引脚加倍作为I / O或中断源,在给定空间中提供更多功能,或在更小空间内提供相同功能,具体取决于您查看它的方式。
答案 1 :(得分:2)
这不是关于"转换"任何东西 - 在典型的处理器或微控制器上,许多外围设备连接到中断控制器; GPIO只是其中一种外设。它绝不是普遍真实的;不同的设备具有不同的功能,但在任何情况下,您只需配置 GPIO引脚以产生中断 - 这是GPIO的正常功能而不是转换"。
在ARM Cortex之前,ARM没有定义中断控制器,核心本身只有两个中断源(IRQ和FIQ)。需要供应商定义的中断控制器来复用多个外设上的单个IRQ。 ARM Cortex定义了一个中断控制器和一个更灵活的中断架构;可以从GPIO实现零延迟中断,因此访问专用中断没有真正的优势吗?这样做可能意味着增加了外部信号调理电路,该电路通常包含在芯片上的GPIO中。
答案 2 :(得分:2)
使用GPIO作为IRQ有什么好处?
如果我收到您的问题,您会问为什么甚至打扰使用GPIO?其他答案表明有人可能甚至不想要中断的 IRQ 功能。典型的GPIO控制器可以将I / O配置为输入或输出。
许多GPIO焊盘具有开漏的灵活性。使用开漏配置,您可以使用双向“总线”,并且可以发送和接收数据。在这里,您需要从输入更改为输出。如果你点击I2C通信,你可以想象这一点。如果I2C仅用于在引导时初始化某些其他接口,则此类用法可能正常。
即使界面不是双向的,您也可能希望在每个边缘捕获。各种外设使用零交叉和一个定时器来解码信号。例如,laser bar code reader,magnetic stripe reader或位冲击的UART可能会查看过零点之间的时间。时间加倍宽度吗?线路是高还是低;然后移动前一个值并添加两位。在这些情况下,您必须查看信号以查看线路是高还是低。即使极性不重要也可能发生这种情况,因为短噪声脉冲会引起混淆。
因此,即使只有输入作为中断的情况,信号的当前电平通常也非常有用。如果此GPIO中断恰好连接到以太网控制器而高电平有效意味着数据准备就绪,那么您不需要具有“I / O”功能。但是,这种情况使用GPIO中断功能作为胶合逻辑。通常,此信令将集成到dedicated module中。您只需要中断的情况通常是一些自定义硬件来检测信号(外壳打开,电源断开等),这不是行业标准。
ARM SOC供应商不知道OEM可能使用哪种情况。 SOC供应商提供了很大的灵活性,因为与封装上的引线键合/引脚相比,芯片上的晶体管便宜。这意味着您只使用中断功能,可以获得规模经济(以及更便宜的部分),因为其他人可能正在使用这些功能,ARM SOC供应商可以在更多人之间分发NRE cost。
在一个完美的世界里,可能没有必要这样做。不久前,当晶体管更昂贵时,有些线路只表现为中断(有些M68k CPU有这个)。从历史上看,ARM只有一个中断线,只有一个公共例程(Cortex-M不同)。因此必须通过读取另一个寄存器来确定中断源。由于硬件需要捕获ARM上的线路状态,因此几乎可以自由添加“输入控制器”部分。
此外,由于这个原因,所有ARM Linux GPIO驱动程序都有一个宏,可以从GPIO引脚转换为中断号,因为它们通常是一对一映射的。 GPIO控制器通常只有一个'GIC'中断。有一个'GPIO'中断控制器,它以GIC为根形成一个中断控制器树。通常,GPIO irq编号为Max GIC IRQ + port *32 + pin
;所以GPIO irq数字只是附加在'GIC'irq数字上。