LPC2138微控制器之VIC

第四章 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四个外部中断源,由以下寄存器配置

原文地址:https://www.cnblogs.com/justin-y-lin/p/12324928.html