如何清除BCM2835中断清除寄存器?

时间:2016-09-06 01:38:13

标签: c raspberry-pi uart interrupt-handling broadcom

我正在研究如何为Raspberry Pi制作操作系统,在Raspberry Pi的OSDev准系统教程中,以下代码用于清除任何待处理的中断。

// Clear pending interrupts.
mmio_write(UART0_ICR, 0x7FF);

函数mmio_write如下。

static inline void mmio_write(uint32_t reg, uint32_t data){
    *(volatile uint32_t *)reg = data;
}

为什么这个值很重要,它如何清除中断?

1 个答案:

答案 0 :(得分:2)

这一行:

// Clear pending interrupts.
mmio_write(UART0_ICR, 0x7FF);

将0x7FF的值写入地址UART0_ICR的寄存器。 最有可能的是,UART0_ICR是一个在代码中定义的值,在代码中,它指的是BCM2835内相应寄存器的地址,可能与此类似:

#define UART0_ICR (UART0_BASE + 0x44)
  

为什么这个值很重要,它如何清除中断?

要理解这一点,您需要阅读设备的数据表,在您的情况下是BCM2835(快速搜索给我这个link)。查看UART寄存器部分,您可以看到UART_ICR寄存器的描述,即Interupt Clear Register。

从该寄存器的位表描述中可以看出:它是一个32位寄存器,不使用31-11位,而0到10位(11位)用作清除各种中断的标志。将0x7FF写入该寄存器实际上是设置所有这些标志,因此它将清除所有挂起的UART中断。