由上图所示:
EXT_INT41_PEND清相应的中断源ICDICPR中断结束后,清相应中断标志位,此标志位由硬件置位ICCEOIR中断执行结束,清cpu内相应的中断号,由硬件填充3. 寄存器汇总
前面分析了按键连接的是GPX1_1,现在我们来看下对应的寄存器应该如何配置
【1】、GPIO控制器GPX1PUD
将GPX1_1引脚的上拉和下拉禁止
GPX1PUD[3:2]= 0b00;
GPX1CON
GPX1CON
将GPX1_1引脚功能设置为中断功能
GPX1CON[7:4] = 0xf
EXT_INT41CON
EXT_INT41CON
配置成成下降沿触发:
EXT_INT41CON[6:4] = 0x2
EXT_INT41_MASK
EXT_INT41_MASK
中断使能寄存器
EXT_INT41_MASK[1] = 0b0
EXT_INT41_PEND 中断状态寄存器
EXT_INT41_PEND
当GPX1_1引脚接收到中断信号,中断发生,中断状态寄存器EXT_INT41_PEND 相应位会自动置1注意:中断处理完成的时候,需要清除相应状态位。置1清0.
EXT_INT41_PEND[1] =0b1
【2】GIC
根据外设中断名称EINT9来查看该中断对应的GIC中维护的HW id。【所有的中断源在芯片厂商设计的时候都分配了唯一的一个ID,GIC通过该ID来驱动中断源】
查看芯片手册(datasheet -- 9.2表)
GIC中断源表
通过【9.2中断源表】找到和外设中断标示对应的中断控制器中断标识(GPIO有32个可被唤醒寄存器)其对应「EINT[9],中断ID为57」,这是非常重要的,在后面的寄存器设置中起很大作用;
1) ICDISER使能相应中断到分配器
ICDISER
ICDISER用于使能相应中断到分配器,一个bit控制一个中断源,一个ICDISER可以控制32个中断源,这里INT[9] 对应的中断ID为57,所以在ICDSER1中进行设置,57/32 =1余25,所以这里在ICDISER1第25位置一。
ICDISER.ICDISER1 |= (0x1 << 25); //57/32 =1...25 取整数(那个寄存器) 和余数(哪位)
ICDIPTR选择CPU接口
ICDIPTR
ICDIPTR
选择cpu
ICDIPTR寄存器每8个bit 控制一个中断源,其中CPU0可以处理160个中断源,所以需要40个寄存器。要选择cpu0第一个bit必须是1。
设置SPI[25]/ID[57]由cpu0处理,57/4=16余1 所以选择寄存器ICDIPTR14的第2个字节[15:8]。
//SPI 25 interrupts are sent to processor 0
//57/4 = 14..1 14号寄存器的[15:8]
ICDIPTR.ICDIPTR14 |= 0x01<<8;
ICDDCR使能分配器
还寄存器用于使能分配器。
ICDDCR =1;
ICCPMR优先级屏蔽寄存器,设置cpu0能处理所有的中断。比如中断屏蔽优先级为255,该值表示优先级最低,所有的中断都能响应。
ICCPMRCPU0.ICCPMR = 0xFF;//设置cpu0 中断屏蔽优先级为255 最低,所有中断都能响应)
ICCICR 全局使能cpu0中断处理
ICCICR
EXYNOS 4412一共有4个cpu,用4个寄存器分别来控制4个cpu,每个寄存器的bit[0]用于全局控制对应的cpu。我们选择cpu0处理中断,将bit[0]置1即可。
CPU0.ICCICR |= 0x1;
使能中断到CPU。
ICCIAR
ICCIAR
当中断发生之后,中断的HW id值会由硬件写入到寄存器ICCIAR[9:0]中;对于SGIs来说,多处理器环境下,CPU的interface值写入到[12:10]中。
读取HW id:
int irq_num;
irq_num = CPU0.ICCIAR&0x3ff; //获取中断号