关于LPC3250中的FIQ

在LPC3250中,关于FIQ好像没有直接函数调用,其实不然。

具体的流程请看例程:

1在main.c中

 GPI07INT_Init();函数设置FIQ中断

void GPI07INT_Init (void)
{
    micFiqSet(31,0);
    sic2FiqSet(GPI07_INT, 0);                                           /* GPI_07的中断触发类型为下降沿 */

micFiqSet和sic2FiqSet调用vicControl.h中的swi

2在vicControl.h中

__inline unsigned int micFiqSet (unsigned int uiChannel, unsigned int uiType)
{
    return swiHandle(0x104, uiChannel, uiType, 0);
}

 

__inline unsigned int sic2FiqSet (unsigned int uiChannel, unsigned int uiType)
{
    return swiHandle(0x110, uiChannel, uiType, 0);
}

采用的是inline函数。也就是通过软件中断设置FIQ中断寄存器的设置。那么也就可以启动FIQ中断了。

3在startup.s中

在0x0000001C处的指令LDR      PC, FIQ_Addr

也就是发生FIQ时,程序会跳转到FIQ_Addr处执行。

IMPORT  FIQ_Handler

.

.

.

FIQ_Addr            DCD     FIQ_Handler

那么也就是会跳转到FIQ_Handler地址处去执行

4在vicControl.s中

FIQ_Handler
        STMFD   SP!, {R0-R3, LR}       
        LDR     R0, =FIQ_Exception                                        ; FIQ中断处理
        ADD     LR, PC, #1
        BX      R0
    CODE16
        BX      PC
        NOP
    CODE32
        LDMFD   SP!, {R0-R3, LR}
        SUBS    PC,  LR,  #4

注意:在这里也就是会调用FIQ_Exception 中断处理函数!!!

于是FIQ中断处理函数被调用

5在target.c中

void FIQ_Exception (void)
{
    P3_OUTP_CLR |= BEEP;
    Delay (0x1FFFFF);
    P3_OUTP_SET |= BEEP;
   
    SIC2_RSR    |= (1 << GPI07_INT);                                    /* 清除边沿中断的中断状态       */
    MIC_RSR     |= (1 << 31);                                           /* 清除边沿中断的中断状态       */
}

这里是真正的FIQ中断处理函数。

 

 

 

以上就是LPC3250中FIQ中断的具体处理流程。

 

 

你可能感兴趣的:(c,exception,import,delay)