第四章 VIC(Vectored Interrupt Controller)
中断源
LPC2138微控制器使用ARM7 TDMI-S核和ARM PrimeCell VIC,支持32个中断请求输入。
32个中断请求输入分为三类:
优先级别FIQ > Vectored IRQ > Non-Vectored IRQ。32个中断输入请求中,任意(最多16个)可以配置为任意Vectored IRQ,其中Vectored IRQ 0~15优先级从高到低。
1)FIQ
VICIntSelect寄存器中对应位置1时,对应中断源被分类为FIQ,反之为为IRQ。
当多个FIQ被触发时,VIC ORs(或运算) 这些中断请求,直接发送给ARM核,FIQ ISR随后读取VICFIQStatus寄存器,判断FIQ中断源。
如果只有一个FIQ被触发,则ARM核直接执行FIQ ISR。
2)最多16个Vectored IRQ
每个Vectored IRQ有一个独享的VICVectCntl寄存器(配置中断源)和VICVectAddr寄存器(配置中断向量)。
3)Non-Vectored IRQ
所有Non-Vectored IRQ共享一个VICDefVectAddr寄存器,当中断被触发时,VICVectAddr寄存器自动加载VICDefVectAddr寄存器值,CPU跳转到该中断向量,然后通过读取VICIRQStatus寄存器判断具体的中断源。
中断和中断向量
中断包括硬件中断IRQ和FIQ,软件中断SWI。
中断向量是指中断服务函数(ISR)在内存中的地址。
中断被触发之后,CPU会暂停当前正在执行的任务,进行中断上下文切换,跳转到对应的中断向量执行ISR。其处理过程如下图:
1)用户程序正常执行
2)中断被触发
3)VIC将中断对应的中断向量加载到VICVectAddr寄存器
4)CPU跳转到异常向量表中IRQ或者FIQ处
5)执行指令跳转到VICVectAddr寄存器指向的地址(即ISR所在地址)
6)ISR执行完毕,继续执行用户程序
从上面可以看出,CPU只用区分是FIQ还是IRQ,而不负责判断具体是哪种中断源,具体判断是哪种中断源以及对应的中断向量由VIC代劳。
中断源
寄存器描述
VICSoftInt和VICSoftIntClear寄存器主要是调试用,软件主动触发对应的中断,实际上物理上没有中断事件产生
VICRawIntr寄存器记录原始中断状态
VICIntEnable和VICIntEnClear寄存器用来使能和去使能中断
VICIntSelect寄存器用来配置对应中断源为FIQ或者IRQ
VICIRQStatus和VICFIQStatus寄存器用来记录中断状态
VICVectCntl0~15和VICVectAddr0~15寄存器用来配置16个Vectored IRQ
VICDefVectAddr寄存器用来保存Non-Vectored IRQ的中断向量
VICVectAddr寄存器只读,ARM核从该寄存器读取中断向量
VICProtection寄存器用来设置中断访问权限
外部中断
32个中断源中,包括EIN0~3四个外部中断源,由以下寄存器配置