目录
1 中断控制器
编辑
2 Exynos4412下的中断控制器
2.1 概述
2.2 特征
编辑
2.3 中断状态
2.4 中断类型
2.5 中断控制器GIC中断表
3 中断控制器寄存器详解
3.1 ICDDCR(Interrupt Controller Distributor Control Register)
3.2 ICDISER_CPU(Interrupt Controller Distributor Set-Enable Register for CPU)
3.3 ICDIPTR_CPU(Interrupt Controller Distributor Interrupt Processor Targets Register for CPU)
3.4 ICCICR_CPUn(Interrupt Controller CPU Interface Control Register for CPU n)
3.5 补充:中断控制器优先级设置寄存器
4 GPIO中断编程
4.1 外设层次设置
4.2 中断控制器层次设置
4.3 程序代码
1 中断控制器
cpu本身是没办法区分中断来自哪个外设,无法应对同时产生的中断等等许多问题。
三星公司设计了中断控制器来解决问题
中断控制器作用
- 多个中断同时产生时可对这些中断挂起排队,然后按照优先级依次发送给CPU处理
- 可以为每一个中断分配一个优先级
- 一个中断正在处理时若又产生其它中断,可将新的中断挂起,待CPU空闲时再发送
- 可以为每一个中断选择一个CPU处理
- 可以为每一个中断选择一个中断类型(FIQ或IRQ)
- CPU接收到中断信号后并不能区分是哪个外设产生的,此时CPU可查询中断控制器来获取当前的中断信号是由哪个硬件产生的,然后再进行对应的处理
- 可以打开或禁止每一个中断 ... ...
2 Exynos4412下的中断控制器
中断控制器内容较多,只进行简单分析,实际开发很少去配置中断控制器,因为crotex-A系列处理,一般开发的时候会安装大型操作系统,操作系统内部会把中断控制器相关代码会实现好。包括中断控制器寄存器的配置等,我们只需要使用中断函数即可。
2.1 概述
2.2 特征
- 支持三种中断类型:
- 软件生成中断(SGI)(与之前SWI软中断指令不是一回事,注意区分)
- 私有外围中断(PPI)(只能发送给某一个特定的CPU)
- 共享外围中断(SPI)(这类中断可以发送给任意一个CPU,使用最多)
- 可编程中断,使您能够设置:
- 中断的安全状态。(安全状态可以触发FIQ和IRQ,非安全中断只能触发IRQ)
- 中断的优先级级别。
- 中断的启用或禁用。
-
接收中断的处理器。
2.3 中断状态
2.4 中断类型
2.5 中断控制器GIC中断表
划分了0~159个中断号,其中
0~15 SGI 代表了软中断,
16~31 PPI只能发送给一个特定的CPU
32~159 SPI 共享中断
串口 ID 84~87
WDT ID 75
外部中断,如ID57 代表EINT[9],实验中使用较多
3 中断控制器寄存器详解
寄存器内容从9.5开始介绍
3.1 ICDDCR(Interrupt Controller Distributor Control Register)
中断控制器分发器控制寄存器(总开关)
全局使能用于监视外设中断信号并将挂起中断转发给CPU接口。
0 = GIC忽略所有外设中断信号,不将挂起中断转发给CPU接口。
1 = GIC监视外设中断信号,并将挂起中断转发给CPU接口。
3.2 ICDISER_CPU(Interrupt Controller Distributor Set-Enable Register for CPU)
CPU的中断控制器分发器设置使能寄存器(小开关)
这个寄存器用于设置每个CPU对应的中断使能位。通过设置该寄存器的特定位,可以启用或禁用特定中断信号的传递给相应的CPU核心。具体的寄存器位定义和功能取决于使用的中断控制器的架构和规范。
[31:0] 只有32位,我们总共需要管理160位,所有使用了多个寄存器地址。每个中断ID对应寄存器参考下表:
3.3 ICDIPTR_CPU(Interrupt Controller Distributor Interrupt Processor Targets Register for CPU)
即用于CPU的中断控制器分发器中断处理器目标寄存器。(选择CPU)
例如,值为0x3(00000011)表示待处理的中断将被发送到处理器0和1。对于三星CPU来说高4位无效。
中断信号需要1280位去管理,160*8bit = 1280bit,一个寄存器只能管理32bit,需要40个寄存器。
对应关系:
例:管理6号中断,由CPU2来出来
那么寄存器如下图设置。
3.4 ICCICR_CPUn(Interrupt Controller CPU Interface Control Register for CPU n)
控制指定CPU核心的中断控制器CPU接口的行为,包括使能和禁用中断处理、配置FIQ和IRQ中断的优先级等功能。(中断控制器到CPU之间的开关)
3.5 补充:中断控制器优先级设置寄存器
4 GPIO中断编程
要求:KEY3按下时产生中断,来点亮LED
4.1 外设层次设置
让外部的硬件控制器产生一个中断信号发送给中断控制器
GPIO下降沿产生中断,对应核心板GPX1_1
GPX与中断寄存器对应关系
中断控制寄存器
使能中断
这个寄存器一般不需要我们写,中断发送即会置1 ,用于判断中断发生
4.2 中断控制器层次设置
让中断控制器接收外设产生的中断信号并对其进行管理然后再转发给CPU处理
ICDDCR置1,打开全局中断,使其能接收外设产生的中断信号并转发到CPU接口
ICDISER_CPU,25位置1,使能57号中断,使中断控制器接收到57号中断后能将其转发到CPU接口
ICDIPTR14,000000001,选择CPU0来处理57号中断
ICCICR,使能中断控制器和CPU0之间的接口,使中断控制器转发的中断信号能够到达CPU0
4.3 程序代码
#include "exynos_4412.h"int main()
{/*外设层次 - 让外部的硬件控制器产生一个中断信号发送给中断控制器*//*将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;GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28);while(1){ /*点亮LED2*/GPX2.DAT = GPX2.DAT | (1 << 7); /*延时*/Delay(1000000);/*熄灭LED2*/GPX2.DAT = GPX2.DAT & (~(1 << 7));/*延时*/Delay(1000000);} return 0;
}
中断处理下一篇