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

发布时间:2024-01-02
向量中断控制器概述
arm7tdmi内核具有两个中断输入,分别为irq中断和fiq中断。但是芯片内部有许多中断源, 最多可以有32个中断输入请求。向量中断控制器的作用就是允许哪些中断源可以产生中断、可以产生哪类中断、产生中断后执行哪段服务程序。
中断源列表
允许中断源产生中断
芯片内部许多部件都可以作为中断源,但并不是每个中断源都需要在中断情况下进行操作,也可以通过其它方法来处理各种状态。
比如通过串口发送一段数据,可以选择在一批发送结束后产生中断,然后在中断服务程序中发送下一批数据。也可以通过查询发送标志位来决定什么时候发送下一批数据。
允许中断源产生中断由寄存器vicintenable和vicintenclr控制,前者使能中断,后者禁止中断。
中断使能寄存器(vicintenable):
寄存器中每一位控制着一个中断源,各中断源的位置与中断源列表所示相同。向某位写入1时,允许对应的中断源产生中断。
中断使能清零寄存器(vicintenclr):
与中断使能寄存器的功能相反,向某位写入1时,禁止对应的中断源产生中断。
选择产生中断的类型
arm7tdmi内核具有fiq和irq两个中断输入,所有中断源产生的中断都可以选择产生其中一种中断。这通过中断选择寄存器完成。
中断选择寄存器(vicintselect):
寄存器中每一位控制着一个中断源,各中断源的位置与中断源列表所示相同。向某位写入1时,对应中断源产生的中断为fiq中断,否则为irq中断。
中断类型
中断输入请求可以在vic中被设置为以下三类:
fiq中断:具有最高优先级;
向量irq中断:具有中等优先级;
非向量irq中断:具有最低优先级;
向量irq中断
vic最多支持16个向量irq中断,这些中断被分为16个优先级,并且为每个优先级指定一个服务程序入口地址。在发生向量irq中断后,相应优先级的服务程序入口地址被装入向量地址寄存器vicvectaddr中,通过一条arm指令即可跳转到相应的服务程序入口处,所以向量irq中断具有较快的中断响应。
非向量irq中断
任何中断源都可以设置为非向量irq中断。它与向量irq中断的区别在于前者不能为每个非向量irq中断源设置服务程序地址,而是所有的非向量irq中断都共用一个相同的服务程序入口地址。
当有多个中断源被设置为非向量irq中断时,需要在用户程序中识别中断源,并分别作出处理。所以非向量irq中断响应延时相对较长。
向量irq中断相关寄存器
vicvectcntl0~15和vicvectaddr0~15两类寄存器与向量irq中断设置有关,前者为中断源分配向量irq中断的优先级,后者为该中断优先级设置服务程序入口地址。寄存器名称最后的数字同时也代表该寄存器控制的向量irq中断的优先级,数值越小优先级越高。
注意:如果将同一个中断源分配给多个使能的向量irq中断,那么该中断源发生中断时,会使用最高优先级(最低编号)的寄存器设置。
向量irq中断相关寄存器
向量控制寄存器(vicvectcntl0~15):
vicvectcntlx[4:0]:分配给此优先级向量irq中断的中断源序号;
vicvectcntlx[5]:该位为1,使能当前优先级的向量irq中断。否则为禁止。
向量地址寄存器(vicvectaddr0~15):
该寄存器中存放对应优先级向量irq中断服务程序的入口地址。
非向量irq中断相关寄存器
向量地址寄存器(vicdefvectaddr):
vicdefvectaddr寄存器存放非向量中断服务程序的入口地址,当发生非向量中断时该寄存器中保存的地址存入vicvectaddr寄存器。
产生中断后的服务程序地址
在发生向量irq中断后,vic能将对应中断的服务程序地址存入vicvectaddr寄存器中。如果为非向量中断,将把vicdefvectaddr寄存器的值存入该寄存器。在异常向量表的irq异常入口处放置一条指令,将vicvectaddr寄存器的内容装入程序计数器(pc),就可以跳转到当前中断的服务函数。 这样的设计可以减小中断响应延时。
向量地址寄存器(vicvectaddr):
中断状态寄存器
如果使用了多个非向量irq中断或多个fiq中断,那么在发生中断后要在程序中查找中断源。通过irq状态寄存器和fiq状态寄存器可以了解到这些中断源的中断请求状态。
任何在vic中使能的中断都会把中断请求反映在“所有中断状态寄存器(vicrawintr)”中。
所有中断状态寄存器(vicrawintr):
fiq状态寄存器(vicfiqstatus):
irq状态寄存器(vicirqstatus):
软件中断寄存器
在一些特殊场合或者调试时,可能需要使用软件强制产生某个中断请求。
软件中断寄存器(vicsoftint):
软件中断清零寄存器(vicsoftintclear):
保护使能寄存器
在某些场合可能需要禁止在用户模式下访问vic寄存器,以提高软件的安全等级。
软件中断寄存器(vicsoftint):
irq中断的设计实例
设置外部中断0产生向量irq中断后执行中断服务程序“irq_eint0( )”。
图示irq中断的发生过程
使用vic的注意要点
如果在片内ram中调试程序,并使用了中断,那么必须将存储器映射控制设置为内部ram模式;
将多个中断源设置为fiq,将增加中断响应延时,所以建议fiq中断只有一个中断源;
ads1.2规定在定义中断服务函数时必须加入关键字“__irq”,保证函数返回时会切换处理器模式;
在退出中断服务程序时要清零相应外设的中断标志,以及vicvectaddr寄存器,为响应下次中断作好准备。
vic相关启动代码分析
上一个:RT0402BRD0739K2L,0402 39.2KΩ 0.1% 1/16W电阻
下一个:附近有没有电脑维修的店,附近联想电脑维修地址

普洱茶有哪些特点呢?
华为游戏卡怎样解决(华为手机游戏太卡怎么解决)
做资料用什么软件好,客户资料管理选什么软件好
君子兰缩短童龄期促开花管理
电脑一直响的原因(电脑会响是什么情况)
女人冬天适合喝什么茶养生
铲运机具体概念是什么?
监理对工程变更审查原则包括哪些?
出入口控制技术在弱电行业的应用与发展趋势
新电脑新固态硬盘如何分区教程,新的固态硬盘怎么分区