使用《硬件参考手册》和配置寄存器来设置中断

时间:2019-03-03 23:33:09

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

有人假设您拥有所有寄存器的地址,是否有人知道如何将中断源与处理程序相关联而不导入库? 任何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我知道如何“指向”我用于处理程序的任何函数。但是我还是不明白:

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

2 个答案:

答案 0 :(得分:1)

由于BCM2837似乎并未使用符合bcm2837.dtsi的标准ARM GIC,因此不确定任何ARM处理器的示例是否会有所帮助。

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

答案 1 :(得分:0)

即使在硬件中,这里也有多个间接级别。

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

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

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

在您的中断处理程序中,您将需要返回GPIO寄存器以找出哪个(您已在其中启用的功能)实际引起了中断(这取决于您的用例-也许您只需要启用一个,则无需进一步检查。

相关问题