cortex_a9中断处理流程
收藏一篇A9中断处理的博文, Cortex A9 按键中断(SPI)流程
原文如下,侵删!
1)外设一级 — GPIO控制器
0-- 将GPX1_1引脚的上拉和下拉禁止
GPX1PUD[3:2]= 0b00;
1-- 将GPX1_1引脚功能设置为中断功能 WAKEUP_INT1[1] — EXT_INT41[1]
GPX1CON[7:4] = 0xf
2-- EXT_INT41CON 配置触发电平
当前配置成下降沿触发:
EXT_INT41CON[6:4] = 0x2
3-- EXT_INT41_FLTCON0 配置中断引脚滤波
默认就是打开的,不需要配置
4–EXT_INT41_MASK 中断使能寄存器
使能INT41[1]
EXT_INT41_MASK[1] = 0b0
5–EXT_INT41_PEND 中断状态寄存器
当GPX1_1引脚接收到中断信号,中断发生,中断状态寄存器EXT_INT41_PEND 相应位会自动置1
注意:中断处理完成的时候,需要清除相应状态位。置1清0.
EXT_INT41_PEND[1] =0b1
(2)中断控制器
0–找到外设中断名称和GIC中断控制器对应的名称
查看芯片手册(本例:Exynos_4412 – 9.2表)
WAKEUP_INT1[1] — EXT_INT41[1] — INT[9] — SPI[25]/ID[57]
1–使能cpu0的spi25/id57
ICDISER.ICDISER1 |= (0x1 << 25); //57/32 =1…25 取整数(那个寄存器) 和余数(哪位)
2–全局使能cpu0中断处理
CPU0.ICCICR |= 0x1;
3–优先级屏蔽寄存器,设置cpu0能处理所有的中断。
CPU0.ICCPMR = 0xFF;
4–GIC使能
ICDDCR =1;
5–设置SPI[25]/ID[57]由那个cpu处理,当前设置为cpu0的irq中断
ICDIPTR.ICDIPTR14 |= 0x01<<8; //SPI25 interrupts are sent to processor 0 //57/4 = 14…1 14号寄存器的[15:8]
(3)ARM内核(cpu0)
1–四大步三小步 — 硬件
(1)拷贝 CPSR 到 SPSR_
(2)设置适当的 CPSR 位:
(2-1)–改变处理器状态进入 ARM 态
(2-2)–改变处理器模式进入相应的异常模式
(2-3)–设置中断禁止位禁止相应中断 (如果需要)
(3)保存返回地址到 LR_
(4)设置 PC 为相应的异常向量
2–中断服务程序 — start.S 汇编
3–中断处理程序 — do_irq函数 c语言(函数原型void name(void))
(1) 读取正在处理的中断ID寄存器(ICCIAR)
irq_num = (CPU0.ICCIAR & 0x1FF);
(2)根据irq_num,分支处理中断
(3)清除中断状态位
(3-1)i.外设级,EXT_INT41_PEND |= 0x1 << 1;
(3-2)ii.GIC级,ICDICPR.ICDICPR1 |= 0x1 << 25;
(3-3)iii.CPU0级 CPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x1FF)) | irq_num;