分析一下GIC SPI工作原理
spi(公用外设中断)产生后,ICD(中断分配器)将interrupt ID和interrupt 优先级 存到相应的寄存器,根据interrupt 优先级 由高到低的送到cpu interface,CPU从ICCIAR寄存器中读取CPUID(在ICCICR_CPU寄存器中设置CPU使能、ICCPMR_CPU寄存器中设置CPU interface 优先级)和interrupt ID(通过在GPIO接口中查得中断源,随即查得interrupt ID再在ICDISER_CPU中设置使能,在ICDIPR_CPU中设置interrupt 优先级),读取一次后ICCIAR寄存器中断状态由pending变为active,说明CPU正在响应该中断,响应结束后,CPU读取ICCEOR_CPU寄存器中断状态由active变为inactive,说明响应结束。
下面介绍下ICC和ICD中用到的寄存器:
ICCICR 设置使能CPU接口(选择CPU)
ICCPMR_CPU 设置CPU接口的优先级
ICCBPR_CPU 设置组优先级和子优先级的位数(0-7)(组优先级为抢占的优先级(和不同中断去比较),子优先级(和CPU接口优先级去比较(注意子优先级有几位就和CPU优先级的低几位去比较)))
ICCIAR_CPU CPU开始响应中断(CPU读取GIC,中断状态由pending->active),该寄存器只能读一次(ICCHPIR可以读无数次)
ICCEOIR_CPU CPU响应结束 ,中断状态由active->inactive
ICDDCR 使能分配器
ICDISER 使能相应的中断源
ICDIPR_CPU 设置中断优先级
注意:重启开发板,进入reset模式,会把cpsr 中断位关闭了 要写上_asm__volatile_("cpsie i\n")