文章目录
- 中断控制器
- 4412下的中断控制器
- 本次实验用到的寄存器
- 编程
中断控制器
如果外设直接发送中断给CPU会存在下列问题:
- 当CPU在处理一个中断时会屏蔽其它中断
- 由于CPU是多核的,中断请求会随机发送给任意CPU,会造成混乱
- 中断不清楚是属于FRQ还是IRQ
- …
因此,三星的4412引入了中断控制器
4412下的中断控制器
在芯片手册第9章中断表中查到GPX1_1代表的中断9属于ID为57的中断号,后续设置57号中断寄存器
本次实验用到的寄存器
第一个寄存器
第二个寄存器
第三个寄存器:8位用来设置分配给哪个CPU处理,一共160个中断,每个中断需要8位,一共需要1280位。每个寄存器32位,共需要这样的寄存器40个。
由于4412只有4个CPU,因此设置低4位即可设置分配给哪个CPU
根据地址图可知:57号中断对应的是0x838寄存器的8-15位,由于4412上电后默认使用的是CPU0,因此设置第8位1来分配给CPU0接收中断信号。
对应的寄存器是ICDIPTR14_CPU0
第四个寄存器
编程
/*外设层次 - 让外部的硬件控制器产生一个中断信号发送给中断控制器*//*将GPX1_1设置成中断功能*/GPX1.CON = GPX1.CON | (0xF << 4);/*设置GPX1_1的中断触发方式为下降沿触发*/EXT_INT41_CON = EXT_INT41_CON & (~(0x7 << 4)) | (0x2 << 4);/*使能GPX1_1的中断功能*/EXT_INT41_MASK = EXT_INT41_MASK & (~(1 << 1));/*中断控制器层次 - 让中断控制器接收外设产生的中断信号并对其进行管理然后再转发给CPU处理*//*全局使能中断控制器使其能接收外设产生的中断信号并转发到CPU接口*/ICDDCR = ICDDCR | 1;/*在中断控制器中使能57号中断,使中断控制器接收到57号中断后能将其转发到CPU接口*/ICDISER.ICDISER1 = ICDISER.ICDISER1 | (1 << 25);/*选择由CPU0来处理57号中断*/ICDIPTR.ICDIPTR14 = ICDIPTR.ICDIPTR14 & (~(0xFF << 8)) | (0X01 << 8);/*使能中断控制器和CPU0之间的接口,使中断控制器转发的中断信号能够到达CPU0*/CPU0.ICCICR = CPU0.ICCICR | 1;