特权同学

LPC2103之中断向量控制器

0
阅读(2617)

中断向量控制器Vectored Interrupt Controller (VIC) 控 制32个中断请求输入,并且可编程的将这些中断分成三类:FIQ, vectored IRQ, and non-vectored IRQ 。

快速中断请求Fast Interrupt reQuest (FIQ)有最高的 优先级。如果有一个以上的请求被分配到FIQ,VIC将 它们的请求相或以产生FIQ信号给ARM处 理器。当只有一个中断请求分配给FIQ时,将会产生一个最短的可能的FIQ延 时(即达到最快的中断请求时间),因为FIQ服务程序单单处理这个中断。但是如果多个中断分配给FIQ,FIQ服 务程序必需读VIC寄存器以识别是哪个中断产生了FIQ请 求。

Vectored IRQs处于中等优先级,但32个中 断请求中只有16个可以分配到这个类中。32个中断请求中的任何一个都可以分配到16个vectored IRQ slots中的任意一个。这些槽(slots)中的slot 0具有最高优先级而slot 15为最低优先级。

Non-vectored IRQs 处于最低优先级。

VIC将所有的Vectored IRQs和Vectored IRQs请求相或后产生的IRQ信 号传递给ARM处理器。IRQ服 务程序通过读VIC的相关寄存器并开始跳转。如果vectored IRQs产生请求,VIC将提供具有最高优先级的IRQs服 务程序的地址,否则它会提供所有non-vectored IRQs共用的默认程序地址。默认程序可以读出另一个VIC寄 存器看看是哪个IRQs激活了。

/* Vectored Interrupt Controller (VIC) */

/*向量中断控制器(VIC)的特殊寄存器*/

#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000))

// IRQ状态寄存器,该寄存器可以读出使能并且分配给IRQ的中断请求

#define VICFIQStatus (*((volatile unsigned long *) 0xFFFFF004))

// FIQ状态寄存器,该寄存器可以读出使能并且分配给FIQ的中断请求

#define VICRawIntr (*((volatile unsigned long *) 0xFFFFF008))

//原始 中断状态寄存器,不论使能和分类,该寄存器都可读出所有32个中断请求/软件中 断的情况

#define VICIntSelect (*((volatile unsigned long *) 0xFFFFF00C))

//中断 选择寄存器,将32个中断分类为IRQ或者FIQ

#define VICIntEnable (*((volatile unsigned long *) 0xFFFFF010))

//中断 使能寄存器

#define VICIntEnClr (*((volatile unsigned long *) 0xFFFFF014))

//中断 清除寄存器,写1清除相应中断请求

#define VICSoftInt (*((volatile unsigned long *) 0xFFFFF018))

//软件 中断寄存器,该寄存器内容与32个来自各种外设功能的中断请求相或

#define VICSoftIntClear (*((volatile unsigned long *) 0xFFFFF01C))

//软件 中断清除寄存器,相应位写1清除软件中断寄存器中的一位或多位

#define VICProtection (*((volatile unsigned long *) 0xFFFFF020))

//保护 使能寄存器,该寄存器允许允许在特权模式下限制访问VIC寄存器

#define VICVectAddr (*((volatile unsigned long *) 0xFFFFF030))

//向量 地址寄存器,IRQ中断发生时,IRQ服 务程序跳转到该寄存器读出的值

#define VICDefVectAddr (*((volatile unsigned long *) 0xFFFFF034))

//默认 向量地址寄存器,该寄存器保存non-vectored IRQs的中断服务程序(ISR)地 址

#define VICVectAddr0 (*((volatile unsigned long *) 0xFFFFF100))

//向量 地址0寄存器,0-15分别保存16个vectored IRQ slots的中断服务程序(ISR)地址

#define VICVectAddr1 (*((volatile unsigned long *) 0xFFFFF104))

//向量 地址1寄存器

#define VICVectAddr2 (*((volatile unsigned long *) 0xFFFFF108))

//向量 地址2寄存器

#define VICVectAddr3 (*((volatile unsigned long *) 0xFFFFF10C))

//向量 地址3寄存器

#define VICVectAddr4 (*((volatile unsigned long *) 0xFFFFF110))

//向量 地址4寄存器

#define VICVectAddr5 (*((volatile unsigned long *) 0xFFFFF114))

//向量 地址5寄存器

#define VICVectAddr6 (*((volatile unsigned long *) 0xFFFFF118))

//向量 地址6寄存器

#define VICVectAddr7 (*((volatile unsigned long *) 0xFFFFF11C))

//向量 地址7寄存器

#define VICVectAddr8 (*((volatile unsigned long *) 0xFFFFF120))

//向量 地址8寄存器

#define VICVectAddr9 (*((volatile unsigned long *) 0xFFFFF124))

//向量 地址9寄存器

#define VICVectAddr10 (*((volatile unsigned long *) 0xFFFFF128))

//向量 地址10寄存器

#define VICVectAddr11 (*((volatile unsigned long *) 0xFFFFF12C))

//向量 地址11寄存器

#define VICVectAddr12 (*((volatile unsigned long *) 0xFFFFF130))

//向量 地址12寄存器

#define VICVectAddr13 (*((volatile unsigned long *) 0xFFFFF134))

//向量 地址13寄存器

#define VICVectAddr14 (*((volatile unsigned long *) 0xFFFFF138))

//向量 地址14寄存器

#define VICVectAddr15 (*((volatile unsigned long *) 0xFFFFF13C))

//向量 地址15寄存器

#define VICVectCntl0 (*((volatile unsigned long *) 0xFFFFF200))

//向量 控制0寄存器,向量控制寄存器0-15分别控制16个16 vectored IRQ slots

#define VICVectCntl1 (*((volatile unsigned long *) 0xFFFFF204))

//向量 控制1寄存器

#define VICVectCntl2 (*((volatile unsigned long *) 0xFFFFF208))

//向量 控制2寄存器

#define VICVectCntl3 (*((volatile unsigned long *) 0xFFFFF20C))

//向量 控制3寄存器

#define VICVectCntl4 (*((volatile unsigned long *) 0xFFFFF210))

//向量 控制4寄存器

#define VICVectCntl5 (*((volatile unsigned long *) 0xFFFFF214))

//向量 控制5寄存器

#define VICVectCntl6 (*((volatile unsigned long *) 0xFFFFF218))

//向量 控制6寄存器

#define VICVectCntl7 (*((volatile unsigned long *) 0xFFFFF21C))

//向量 控制7寄存器

#define VICVectCntl8 (*((volatile unsigned long *) 0xFFFFF220))

//向量 控制8寄存器

#define VICVectCntl9 (*((volatile unsigned long *) 0xFFFFF224))

//向量 控制9寄存器

#define VICVectCntl10 (*((volatile unsigned long *) 0xFFFFF228))

//向量 控制10寄存器

#define VICVectCntl11 (*((volatile unsigned long *) 0xFFFFF22C))

//向量 控制11寄存器

#define VICVectCntl12 (*((volatile unsigned long *) 0xFFFFF230))

//向量 控制12寄存器

#define VICVectCntl13 (*((volatile unsigned long *) 0xFFFFF234))

//向量 控制13寄存器

#define VICVectCntl14 (*((volatile unsigned long *) 0xFFFFF238))

//向量 控制14寄存器

#define VICVectCntl15 (*((volatile unsigned long *) 0xFFFFF23C))

//向量 控制15寄存器


Vector Control registers 0-15 (VICVectCntl0-15 - 0xFFFF F200-23C)

信号

描述

复位值

4:0

Int_request/

Sw_int_assig

该数值对应的中断分配到该vectored IRQ slot中

0

5

IRQslot_en

置1表示该vectored IRQ slot使能

0

31:6

保留

NA

Protection Enable register (VICProtection - 0xFFFF F020)

信号

描述

复位值

0

VIC_access

0——用户模式和特权模式下均可访问VIC寄存器

1——只有在特权模式下才可访问VIC寄存器

0

31:1

保留

NA

Baidu
map