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

问题描述 投票:0回答:2

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

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

arm registry raspberry-pi3 interrupt interrupt-handling
2个回答
1
投票

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

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


0
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.