在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中断的具体处理流程。