LPC2114/EASYARM2100 FIQ快速中断例程

来源:互联网 发布:java 创建自定义菜单 编辑:程序博客网 时间:2024/06/11 02:56

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......

原创粉丝点击