ARM 中断--IRQ and FIQ配置--外部配置

ARM 中断--IRQ and FIQ配置--外部配置

中断分为外部中断和定时器中断;

中断源都是有一个触发条件,条件满足就会产生中断。不同的中断源触发条件不一样

ARM中中断分为两种:FIQ(fast interrupt request)快速中断请求,IRQ(interrupt requrest)一般的中断请求

为什么FIQ比IRQ的中断响应更快?

在ARM体系中,FIQ的优先级比IRQ高,FIQ优先级为3,IRQ优先级为4,FIQ和IRQ是中断的两种不同类型,FIQ比IRQ有更多的分组寄存器,在中断响应的时候,就不要入栈出栈寄存器。

S5PV210系统中的中断分层:

外部中断/定时器 -> 中断控制器 -> 内核

VECTORED INTERRUPT CONTROLLER  向量控制中断器 VIC 

向量中断:每一个中断源都有自己的入口地址/地址寄存器

S5PV210 中断控制器的特点:

分为四种向量中断控制器、支持93种一般中断、有固定的优先级但是可以设置优先级、中断源可以设置为FIQ或者IRQ

1)设置外部中断先由管脚的属性开始设置,在GP管脚的属性设置中有EXT_INT【*】选项

例如: GPH2CON[2] 控制的0-3位全部置为1,1111=EXT_INT[16],第16号外部中断

2)设置外部中断的触发方式,根据EXT_INT[16]被哪一个寄存器所管,可以从手册查,EXT_INT_2_CON控制着外部中断16到23号,然后设置EXT_INT_2_CON就可以设置外部中断触发方式了(高电平、低电平、下降沿、上升沿、下降上升沿)。

3)设置外部中断屏蔽寄存器,EXT_INT_n_MASK,这个寄存器用来设置屏蔽或者不屏蔽外部中断的信号,16号外部中断由EXT_INT_2_MASK控制,设置该寄存器打开或者关闭,1关闭0打开,默认为关闭,此为保护措施

4)设置外部中断判断寄存器,用来判断外部中断是否已经发生,发生之后消除中断,查阅同上理,EXT_INT_2_PEND,可读可写寄存器,有中断产生寄存器自动置为1,那么在中断服务程序之后就要再次手动置1用来消除中断!

5)设置中断源选择寄存器,VICINTSELECT,选择中断源是FIQ还是IRQ,那么怎么知道我们控制的中断信号是属于VIC多少呢?可以查手册560页,位设置总共有32位,0为IRQ1为FIQ,每一位都代表着是一个中断源

6)设置VICIRQSTATUS,判断IRQ是否发生的寄存器,只读,0中断没有发生1中断已经发生

7)设置VICINTENABLE,中断使能寄存器,可读可写,1为使能中断,0为无效写入,因为初始化状态下所有中断都是关闭的

 

外部中断四个按键低电平触发控制四个LED

#include "int.h"

int flag=4;

void int_init( void);

void intc_setvectaddr(unsigned long intnum, void (*handler)(void));

void intc_clearvectaddr(void);

void intc_enable(unsigned long intnum);

void isr_key(void)

{

if((EXT_INT_3_PEND&0x1)==1)

    GPJ2DAT ^= (1<<0); //toggle

if(((EXT_INT_3_PEND>>1)&0x1)==1)

    GPJ2DAT ^= (1<<1); //toggle

if(((EXT_INT_3_PEND>>2)&0x1)==1)

    GPJ2DAT ^= (1<<2); //toggle

if(((EXT_INT_3_PEND>>3)&0x1)==1)

    GPJ2DAT ^= (1<<3); //toggle

    intc_clearvectaddr();

    EXT_INT_3_PEND |= 0XF<<0;

}

int main(void)

{

GPJ2CON &=~(0xffff);

GPJ2CON |= (0x1111);

int_init();

GPH3CON = (0XFFFF);

EXT_INT_3_CON &=~(0XFFF);//低电平触发

intc_setvectaddr(NUM_EINT16_31, isr_key);

EXT_INT_3_MASK &= ~(0xF<<0);//不屏蔽中断

intc_enable(NUM_EINT16_31);

while (1);

}

首先配置GPIOCON寄存器然后初始化然后设置外部触发模式为低电平触发,设置中断服务程序,不屏蔽中断(因为系统默认是屏蔽中断的)

initial state初始状态为1 那么就是屏蔽状态,如果要使用中断那么就要设定为0

之后就是初始化中断。

在中断服务函数当中可以根据PEND函数来判断是哪一个按键触发了中断,然后需要把四个VIC地址写零

之后再是把PEND写1置零。

值得注意的是系统判断中断有没有并不是看到底有没有触发,而是看 EXT_INT_n_PEND的位值判断,如果是 1 那么就是有中断没有就是没中断,如果在中断服务程序中屏蔽掉PEND函数的置1清中断的操作的话,那么就会一直进入到中断服务程序当中!

转载地址:http://www.eeworld.com.cn/mcu/2018/ic-news071640340.html 

### ARM V8 R52 架构中 FIQIRQ 的区别 在 ARM V8 R52 架构中,FIQ(快速中断请求)和 IRQ(普通中断请求)是两种不同的异常处理机制。以下是两者的主要区别及其应用场景: #### 1. **优先级** FIQ 的优先级高于 IRQ。这意味着如果系统同时接收到 FIQIRQ 请求,处理器会优先响应 FIQ[^1]。 #### 2. **硬件支持** ETAC 独立地支持 IRQFIQ 异常带入 EL1 和 EL2,这表明对于这两种类型的中断,存在四个独立的入口地址。这种设计使得 FIQIRQ 可以分别拥有自己的向量表项,从而减少冲突并提高效率[^2]。 #### 3. **寄存器保存** 为了加快 FIQ 响应速度,在进入 FIQ 处理程序时,CPU 自动切换到一组专用的高速缓存寄存器集合,而无需显式保存当前的工作状态。相比之下,IRQ 则通常需要手动保存和恢复通用目的寄存器的内容[^3]。 #### 4. **典型应用领域** - **FIQ**: 主要应用于时间敏感型任务或者需要极低延迟的应用场景下,比如实时控制系统中的数据采集部分。 - 实现方式上可以利用 Cortex-R 系列特有的功能来管理多个辅助上下文,并通过主上下文提供资源分配策略以保障服务质量[^4]。 - **IRQ**: 更适合于一般性的外部事件通知场合,例如键盘输入、磁盘I/O完成信号等非紧急事务处理。 ```c // 示例代码展示如何定义简单的中断服务例程 (ISR) void irq_handler(void){ // 执行相应的中断逻辑... } void fiq_handler(void){ // 快速执行高优先生命周期内的操作... } ``` #### 总结 综上所述,尽管二者都是用来打断正常流程以便及时应对突发状况的有效工具,但由于其实现细节的不同决定了各自适用范围有所侧重——即 FIQ 更倾向于那些对反应速度有着极高要求的任务;而 IRQ 则广泛适用于各类常规级别的干扰源处置工作当中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值