嵌入式 > 嵌入式开发 > 详情

LPC2000系列的向量中断控制器(VIC)

发布时间:2021-01-11 发布时间:
|
LPC2000系列向量中断控制器VIC)支持32个中断请求输入,也即是支持32个中断源。这32个中断按顺序称为VIC通道0,VIC通道1,…,VIC通道31(实际上只使用了18个其他的预留)

每一个VIC通道都支持软件中断与硬件中断,即每个中断均可由软件或硬件中断产生,软件中断与对应通道上的硬件中断是逻辑“或”的关系。软件中断可通过置位VICSoftInt寄存器相应位来产生,也可通过置位VICSoftIntClear寄存器相应位来清除。

LPC2000具有3类中断:FIQ、向量IRQ和非向量IRQ。LPC2000系列可通过对VICIntSelect和VICVectCntlx(x=0,1,…,15)这两类寄存器的设置,将以上的32个中断源设置为FIQ和IRQ中断的任何一种(向量IRQ和非向量IRQ和在一起)。其中,快速中断请求FIQ具有最高优先级。建议只分配一个中断请求给FIQ以减少中断处理程序的延迟。当然,VIC支持多个FIQ中断。

向量IRQ具有中等优先级。该级别最多可分配32个请求中的16个。32个请求中的任何一个都可以分配到16个向量IRQslot中的任意一个。其中,slot0具有最高优先级,而slot15则为最低优先级。

非向量IRQ具有最低优先级。一般也只分配一个中断源。

VIC中断设置步骤:

在主程序中:

1、设置VICIntSelect

通过VICIntSelect中断选择寄存器将32个中断请求分配为FIQ或IRQ(包括向量IRQ与非向量IRQ)

相应位为1是FIQ,为0是IRQ。

例如:VICIntSelect = 0x00000000,设置所有中断都是IRQ

2、设置VICVectCntlx(仅对于IRQ,FIQ不需要此设置)

通过VICVectCntlx(x=0,1,…,15)来选择32个中断请求中的某个为向量IRQ并设定此中断请求为IRQ slotx(x对应于VICVectCntlx中的x)。若某个中断源被设定为IRQ,但却未通过VICVectCntlx使能,则该中断源将被默认为非向量IRQ。

例如:VICVectCntl0 = 0x20 | 15,设置EINT1为向量中断,使用Slot0。其中0x20是因为VICVectCntlx寄存器第六位是使能,15是通过查周立功那本书P208页的表得到的EINT1的VIC通道号。

3、设置VICVectAddrx(仅对于IRQ,FIQ不需要此设置)

当有IRQ中断产生时,VIC将会根据中断源设置VICVectAddr寄存器为相应中断服务程序的地址,切换处理器工作模式为IRQ模式,并跳转到IRQ中断入口0x00000018处;

异常中断向量表中0x00000018处使用“LDR PC, [PC, #-0xFF0]”,使得程序跳转到(0x00000018+8-0x00000FF0=0xFFFFF030)存储器处保存的地址。0xFFFFF030是VICVectAddr寄存器地址。也即是说:通过该指令,程序跳转到VICVectAddr寄存器所指向的中断服务程序的地址。

例如:VICVectAddr0 = (uint32)EINT1_Exception,设置EINT1中断地址。EINT1一般是中断服务程序函数名即服务中断服务程序的首地址,前面要用(uint32)强制类型转换。

4、设置VICDefVectAddr(当都设置为向量IRQ时可以没有这个)

若是非向量IRQ中断,VIC提供默认服务程序地址VICDefVectAddr,IRQ中断入口程序可通过读取VIC的向量地址寄存器VICVectAddr来取得该地址,然后跳转到相应服务程序继续执行。该默认服务程序由所有非向量IRQ公用,默认服务程序可读取IRQ状态寄存器以确定哪个IRQ被激活。

例如:VICDefVectAddr = (uint32)Default_Entry,设置非向量中断地址。如果在管理向量中断的VICVectCntl0~15和VICVectAddr0~15中没有设置某一个中断EINTx则此EINTx中断发生时,要进入非向量中断处理程序Default_Entry。

5、设置VICIntEnable使能

例如:VICIntEnable = 0x00018000,使能EINT1和EINT2。因为EINT1和EINT2的VIC通道号分别为15和16,所以15和16两位置一将EINT1和EINT2使能。

在中断服务程序中:

1、中断处理程序。用户自己编写的实现某种功能的中断程序

2、清除相应的中断标志,以响应下一次中断,并切换处理器工作模式。建议用__irq关键字定义中断服务程序,这样的话,该函数将自动切换处理器工作模式,但该函数不能返回参数或者数值。

3、退出中断前,一定要对VICVectAddr寄存器写0,通知VIC中断结束

具体FIQ、向量IRQ和非向量IRQ的具体设置步骤不完全相同

1、快速中断FIQ

⑴在主程序中:

1、在VICIntSelect中将中断分配为FIQ中断;

2、在VICIntEnable中使能外设中断。

⑵中断服务程序中:

1、中断处理程序;

2、清除相应的中断标志,以响应下一次中断。

2、向量IRQ

⑴主程序

1、在VICIntSelect中将中断分配为IRQ中断;

2、在VICVectCntlx中分配中断通道(优先级);

3、在VICVectAddrx中设置中断服务程序的地址;

4、通过VICIntEnable使能外设中断。

⑵中断服务程序

1、中断处理;

2、清除相应的中断标志,以响应下一次中断;

3、对VICVectAddr寄存器执行写操作(通常为0x00),结束向量中断。

3、非向量IRQ

⑴主程序

1、在VICDefVectAddr中设置中断服务程序的地址;

2、通过VICIntEnable使能外设中断。

⑵中断服务程序

1、中断处理;

2、清除相应的中断标志,以响应下一次中断;

3、对VICVectAddr寄存器执行写操作(通常为0x00),结束向量中断。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
定时器CTC模式的测试