特权同学

LPC2103之中断向量控制器

0
阅读(2658)

中断向量控制器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