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)
   cortex_a9中断处理流程
   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;