LPC2131 中断处理

关于中断处理

LPC2131 使用的ARM PrimeCell向量中断控制器将所有的中断分为三种:
FIRQ IRQ向量中断 IRQ非向量中断,最多可支持32个中断输入。而我们使用的EasyARM2131开发板提供了21个中断源。

FIRQ有最高的优先级

IRQ向量中断次之

IRQ非向量中断优先级最低

其中IRQ向量中断:最多可定义16个,支持优先级策略,优先级设置通过将中断源编号置入VICVectCntX寄存器来完成,X数字越低,优先级越高,对应的中断服务程序地址置于相应的VICVectAddrX中。在IRQ中断产生时,根据优先级,应得到处理的高优先级中断的服务程序地址将被拷贝到VICVectAddr中。

IRQ非向量中断:不支持优先级,其服务程序地址被置于默认向量地址寄存器 VICDefVectAddr 中,在有中断请求时会拷贝到VICVectAddr中,具体是哪个中断源发出的请求,需要在服务程序中,通过查询VICIRQStatus判断哪个中断源编号被置位来确定,这样服务程序会稍显臃肿。

以上说明非FIRQ中断,最终应进入的服务程序的地址会被写入VICVectAddr中。一旦产生IRQ中断,微控制器会切换到IRQ模式,并跳转到向量表0x00000018处执行,如代码列表(1)处所示,因为ARM7TDMI是3级流水线,因而PC的值应为0x00000020, 减去0xff0为0xfffff030恰好是VICVectAddr的地址。这样用这条指令便可进入中断处理程序

对于FIQ,因为一般其对响应速度要求较高,所以一般只定义一个。与IRQ非向量中断类似,如果多于一个,则应在服务程序中读取VICFIQStatus来确定中断源,FIQ的中断服务程序定义在FIQ_Handler中。一旦产生FIQ中断,处理器会切换到FIQ迷失并跳转带0x0000001C地址执行程序,最终将跳到FIQ_Handler标号处,处理FIQ中断

startup . s 文件
; 此代码位于  0x00000000  处 , 也就是说这段代码是上电后执行的第一段代码 ( 在首句就会跳转 )
Reset



        LDR     PC
,  ResetAddr                    
        LDR     PC
,  UndefinedAddr                
        LDR     PC
,  SWI_Addr                    
        LDR     PC
,  PrefetchAddr                
        LDR     PC
,  DataAbortAddr
        DCD     
0xb9205f80
        LDR     PC
,  [PC ,   # - 0xff0 ]             ; ----- ( 1 )
        LDR     PC
,  FIQ_Addr

ResetAddr               DCD     ResetInit
UndefinedAddr       DCD     Undefined
SWI_Addr                DCD     SoftwareInterrupt
PrefetchAddr           DCD     PrefetchAbort
DataAbortAddr        DCD     DataAbort
Nouse                      DCD     
0
IRQ_Addr                 DCD     
0
FIQ_Addr                  DCD     FIQ_Handler            
; ----- ( 2 )


在中断处理服务结束后,如果是非FIQ中断应将VICVectAddr置0. 如果是外部中断源引起的中断,EINT0-3,则应将相应的EXTINT位写入1,以允许下一个中断的处理,详见深入浅出LPC2131 Page74.

基本的操作流程课件Page111

VICIntEnable 使能中断源
VICIntSelect 选择中断源

你可能感兴趣的:(LPC2131 中断处理)