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)
1 中断控制器
cpu本身是没办法区分中断来自哪个外设,无法应对同时产生的中断等等许多问题。
中断控制器作用
- 多个中断同时产生时可对这些中断挂起排队,然后按照优先级依次发送给CPU处理
- 可以为每一个中断分配一个优先级
- 一个中断正在处理时若又产生其它中断,可将新的中断挂起,待CPU空闲时再发送
- 可以为每一个中断选择一个CPU处理
- 可以为每一个中断选择一个中断类型(FIQ或IRQ)
- CPU接收到中断信号后并不能区分是哪个外设产生的,此时CPU可查询中断控制器来获取当前的中断信号是由哪个硬件产生的,然后再进行对应的处理
- 可以打开或禁止每一个中断 … …
2 Exynos4412下的中断控制器
中断控制器内容较多,只进行简单分析,实际开发很少去配置中断控制器,因为crotex-A系列处理,一般开发的时候会安装大型操作系统,操作系统内部会把中断控制器相关代码会实现好。包括中断控制器寄存器的配置等,我们只需要使用中断函数即可。
2.1 概述
2.2 特征
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
3 中断控制器寄存器详解
3.1 ICDDCR(Interrupt Controller Distributor Control Register)
0 = GIC忽略所有外设中断信号,不将挂起中断转发给CPU接口。
1 = GIC监视外设中断信号,并将挂起中断转发给CPU接口。
3.2 ICDISER_CPU(Interrupt Controller Distributor Set-Enable Register for 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 外设层次设置
中断控制寄存器
使能中断
这个寄存器一般不需要我们写,中断发送即会置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;
}
中断处理下一篇
原文地址:https://blog.csdn.net/m0_60718520/article/details/134722894
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_28876.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!