中断控制器:S5pv210处理器支持93个中断源,分成4组来管理
VIC3、VIC2、VIC1、VIC0(EXINT(0),EXINT(1))
===============================================
VIC0 VECT ADDR0 :第一组的第一个中断处理函数地址
VIC0VECTADDR0 = (unsigned int)exint0_func;
//VIC0VECTADDR0 = func(每个中断源都有一个,完成中断处理程序的注册)
===============================================
VICADDRESS:包含当前ISR中处于有效状态的地址,复位值为0x00000000。
//必须在有中断处于有效状态时,读取 VICADDRESS 寄存器,返回ISR的服务地址并设置当前中断为被服务状态。此寄存器每组中断源只有一个,一共4个,在正在处理中断时,中断控制器去读取中断源对应的中断处理程序地址,并将其存入 VICADDRESS 中。必须在中断服务程序的最后,将该寄存器清零。
写VICADDRESS寄存器必须在中断服务结束后,对该寄存器进行写任何值的操作将会清除当前的中断。
irq_func_tfunc;
func =(irq_func_t)VIC0ADDRESS;/* 中断向量地址寄存器 */
===============================================
//中断源配置
EXINT0MASK =0xFFFFFFFF;//1.关闭中断
EXINT0PEND =0xFFFFFFFF;//2.清除中断标志
GPH0CFG |= 0xF;//3.配置GPH0_0管脚为外部中断0,即XEINT0
GPH0PUD &=~0x3;//4.禁止该管脚的上下拉电阻
EXINT0CON =(EXINT0CON & (~7)) | 0x2; //5.中断触发方式为下降沿触发
EXINT0FLT = 0;//6.禁止滤波
//中断控制器的配置
VIC0INTCLEAR |=1;//1.关中断
TZICINTSELECT =0;//2.TZICSELECT IRQ选择(32位寄存器,4个/*选择IRQ或者FIQ方式*/)
VIC0INTSELECT =0;//3.VICSELECT IRQ选择(32位寄存器,4个/*选择IRQ或者FIQ方式*/)
VIC0ADDRESS =0;/*4.VIC 0 ADDRESS:一组只有一个,中断发生时,用户从该寄存器中获取中断函数地址。中断服务程序的最后,要将该寄存器清零*/
VIC0VECTADDR0 =(unsigned int)exint0_func;/*5.VIC 0 VECT ADDR 0:每个中断源都有一个,完成中断处理程序的注册(存放中断源对应的中断处理函数的地址), 当中断来了,中断控制器读并将中断函数处理的地址提交给 VICADDRESS*/
EXINT0MASK&= ~1;//1.开中断源的中断
VIC0INTENABLE|= 1;//32位,开中断控制器使能中断
enable_irq();//3.开ARM核的中断响应位CPSR