FIQ快速中断只有一个中断服务程序,如果设置了多个中断作为FIQ快速中断,那么,需要在中断服务程序里面
读取VICFIQStatus寄存器来判断是哪个中断请求被激活了。
要使用FIQ快速中断,还要让ARM开启FIQ的支持,即在EasyARM2100的工程模板里面startup.s文件中设置系统模式
堆栈的地方开启FIQ支持,把原来的MSR CPSR_c, #0xdf改为MSR CPSR_c, #0x1f就可以了。
EasyARM2100的工程模板里面有个target.c文件,在这个文件的FIQ_Exception函数里写你要的中断服务代码就可以了
每一个终端服务程序的末尾都要记得清除刚才的中断标志,否则,不能相应下一个中断
测试例程:
1.修改startup.s
2.在FIQ_Excepiton函数里编写中断服务函数
下面的例子设置T0为FIQ,0.5s定时,让LED1灯闪烁。如果你看到灯闪烁了,说明FIQ应用成功。
完整的main.c文件:
#include "config.h"
#define LED1CON (0x01<<22)
#define LED1_ON() IO0CLR=LED1CON
#define LED1_OFF() IO0SET=LED1CON
void TOInit(void)
{
T0TC=0;
T0PR=0;
T0MCR=0x03;
T0MR0=Fpclk/3;
T0IR=0x01;
T0TCR = 0x03;
T0TCR = 0x01;
}
int main (void)
{// add user source code
VICIntSelect=(0X01<<4);
VICIntEnable =(0X01<<4);
LED1_OFF();
TOInit();
while(1);
return 0;
}
/***************************************************/
中断处理函数:
#define LED1CON (0x01<<22)
#define LED1_ON() IO0CLR=LED1CON
#define LED1_OFF() IO0SET=LED1CON
void FIQ_Exception(void)
{
if((IO0PIN&LED1CON)==0)
{
LED1_OFF();
}
else
{
LED1_ON();
}
T0IR=0x01;//这一句非常重要,我一开始就忘了写这一句,结果就是,灯亮了就一直亮不会灭。但是单步调试的时候发现是可以灭的。于是才想到可能是中断标志没有清除!
}
好了,run......