有人假设您拥有所有寄存器的地址,是否有人知道如何将中断源与处理程序相关联而不导入库? 任何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我知道如何“指向”我用于处理程序的任何函数。但是我还是不明白:
我如何将中断源与函数关联(假设我知道所有寄存器的地址,而无需导入库)?
答案 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寄存器以找出哪个(您已在其中启用的功能)实际引起了中断(这取决于您的用例-也许您只需要启用一个,则无需进一步检查。