【问题标题】:Setting up Interrupts using Hardware Reference Manual and Configuring Registers使用硬件参考手册和配置寄存器设置中断
【发布时间】:2019-07-25 06:31:15
【问题描述】:

有没有人知道如何在不导入库的情况下将中断源与处理程序关联起来,假设您拥有所有寄存器的地址? 任何 ARM 处理器的示例都会有所帮助,但就我而言,我使用的是 Pi3 的 BCM2837。 我对this post about the datasheet 的解释是BCM2835 manual 是等价的。

在第 90 页,我看到了启用上升沿检测的地址,因此我将这段代码放入我的程序中:

//-v- I think this allows me to enable detection on GPIO pins 0-31
#define RisingInterruptEnable (*(int *) 0x7E2004C)
//-^- e.g. "RisingInterruptEnable = 0x1" enables GPIO 0 rising detect

从手册的第 112-117 页,我找到了启用 InterruptReQuests [0x7E00B214] 的寄存器,但老实说我不明白如何使用它。我看到了如何启用 gpio_int[0],但是在搜索 pdf 后我找不到 gpio_int 的含义。

来自this post about function pointers 我知道如何“指向”我用于处理程序的任何函数。但是我还是不明白:

我如何将中断源与函数相关联[无需导入库,假设我知道所有寄存器的地址]?

【问题讨论】:

  • 听起来你还没有完全准备好被打断,按照自己的方式来处理它们......从轮询开始。将中断瞄准一个函数指针是很遥远的事情。你会想用一些 asm 包装函数...
  • 您是否通过轮询中断和清除中断等工作?如果这是 pi3,它的难度是 pi-zero 的 10 倍。 Broadcom 中断控制器非常简单,pi3 有多种可能的模式,每种模式都有不同的解决方案。

标签: arm registry raspberry-pi3 interrupt interrupt-handling


【解决方案1】:

不确定任何 ARM 处理器的示例是否会有所帮助,因为根据 bcm2837.dtsi,BCM2837 似乎没有使用标准 ARM GIC。

然后我建议查看 David Welch here 提供的优秀 raspberry-pi 特定示例: 您将找到处理中断和直接访问寄存器的示例 - 我假设您正在编写一些裸机代码。

【讨论】:

    【解决方案2】:

    这里有几个级别的间接,即使只是在硬件中。

    从 GPIO 引脚开始,可以将其配置为在 GPIO 外设内生成中断(如您所见)。然而,这一切只是驱动该外设的输出(并在其他 GPIO 寄存器之一中识别触发器)。这个片上信号是gpio_int[0]

    根据数据表,来自 GPIO_0 的这个信号连接到 A53 集群的 IRQ[49](这是一个非常具体的实现方面)。

    要启用 IRQ[49],您需要使用中断控制器中的寄存器,用于启用和处理程序(因为指向正确中断处理程序的方向是在硬件中处理的)。

    在您的中断处理程序中,您需要返回 GPIO 寄存器来确定哪个(您在那里启用的)实际导致了中断(这将取决于您的用例 - 也许您只需要启用一个,您将不需要进一步检查)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      相关资源
      最近更新 更多