当前位置:文档之家› ARM中断系统_百度文库.

ARM中断系统_百度文库.

ARM中断系统_百度文库.
ARM中断系统_百度文库.

该文章介绍了 ARM 处理器的中断系统,以周立功公司的 LPC2000为例。希望对大家有用!

1.1中断源

LPC2000系列的向量中断控制器(VIC支持32个中断请求输入,也即是支持32个中断源,见表5.1。这32个中断按顺序称为 VIC 通道0,VIC 通道1, …, VIC 通道31。

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

表5.1外设功能的中断源

1.2三种中断类型

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

中,slot0具有最高优先级, 而 slot15则为最低优先级。非向量 IRQ 具有最低优先级。

1.3如何初始化某个中断源为三类中断中的一类

通过 VICIntSelect 中断选择寄存器将32个中断请求分配为 FIQ 或 IRQ (包括向量 IRQ 与非向量 IRQ ;通过VICVectCntlx(x=0,1,…,15来选择32个中断请求中的某个为向量 IRQ 并设定此中断请求为 IRQ slotx(x对应于 VICVectCntlx 中的 x 。若

某个中断源被设定为 IRQ,但却未通过 VICVectCntlx 使能,则该中断源将被默认为非向量 IRQ。

1.4中断处理过程中断处理过程如下所示:

初始化:设置中断源为3种中断源之一,设置中断地址, 使能中断,然后正常运行用户程序; 当有 IRQ 中断产生时, VIC 将会根据中断源设置 VICVectAddr

寄存器为相应中断服务程序的地址, 切换处理器工作模式为 IRQ 模式, 并跳转到 IRQ 中断入口0x00000018处; 异常中断向量表中0x00000018处使用“ LDR PC, [PC, #-0xFF0]” ,使得程序跳转到(0x00000018+8-0x00000FF0=0xFFFFF030存储器处保存的地址。 0xFFFFF030是 VICVectAddr 寄存器地址。也即是说:通过该指令, 程序跳转到 VICVectAddr 寄存器所指向的中断服务程序的地址; 中断服务程序执行相应的中断处理,清除中断。建议用__irq关键字定义中断服务程序; 中断服务完成后, 即可返回原中断点。返回时要同时切换处理器工作模式。注意:退出中断前, 一定要对 VICVectAddr 寄存器写0, 通知 VIC 中断结束; 建议用__irq关键字定义中断服务程序, 这样的话, 该函数将自动切换处理器工作模式, 但该函数不能返回参数或者数值。

1.5IRQ 中断

IRQ 中断有向量 IRQ 和非向量 IRQ 中断两种类型, 当 IRQ 中断产生时:若是向量 IRQ 中断,由于之前 VIC 已经将最高优先级请求的 IRQ 服务程序地址VICVectAddrx(x=0,1,…,15装入 VICVectAddr,故程序跳入该中断服务程序继续执行。若是非向量 IRQ 中断, VIC 提供默认服务程序地址 VICDefVectAddr, IRQ 中断入口程序可通过读取 VIC 的向量地址寄存器 VICVectAddr 来取得该地址, 然后跳转到相应服务程序继续执行。该默认服务程序由所有非向量 IRQ 公用, 默认服务程序可读取 IRQ 状态寄存器以确定哪个 IRQ 被激活。

1.6关于外部中断

外部中断的设置除了与上述各种寄存器有关外,还与 EXTINT、EXTWAKE、EXTMODE 和 EXTPOLAR 等寄存器相关。

1.7举例

1. 初始化外部中断3(EINT3为非向量中断,并设置为电平触发模式,然后等待外部中断。

PINSEL1=3<<8;//设置管脚连接, P0.20设置为 EINT3

EXTMODE =0x00; //设置 EINT3中断为电平触发模式

/*打开 EINT3中断(使用非向量 IRQ */

VICIntSelect =0x00000000; //设置所有中断分配为 IRQ 中断

VICDefVectAddr =(intIRQ_Eint3;//设置中断服务程序地址

EXTINT =1<<3;//清除 EINT3中断标志

VICIntEnable =1<<17;//使能 EINT3中断,EINT3在 Bit17上

2. EINT3的中断服务子程序

void __irqIRQ_Eint3(void{

/*

用户添加

*/

/*等待外部中断信号恢复为高电平(若信号保持为低电平, 中断标志会一直置位*/

while((EXTINT&1<<3!=0 {

EXTINT =1<<3;//清除 EINT3中断标志, 1<<3等价于 0x08 }

VICVectAddr =0; //向量中断结束 }

相关主题
文本预览
相关文档 最新文档