TQ2440裸奔程序3-中断控制LED灯

    技术2022-11-22  11

    第二章 中断    ARM体系的CPU有7种工作模式,可以通过软件来进行模式切换,或者发生各类中断、异常进行相应模式。CPU可以识别两种类型中断,正常中断(IRQ)和快速响应中断(FIQ)状态寄存器的PSR中F和R位决定是中断的启闭。为了使能中断,必须将PSR中F或R位清零,并且中断屏蔽寄存器相应位也要清零。ARM中断分为子中断源和一般中断源,子中断源多了两个寄存器SUBRCPN(标识子中断源是否发生)INTSUBMSK(屏蔽子中断源)ARM中断发生过程:如为子中断源,则SUBSRCPND寄存器相应位置1,然后根据子中断源屏蔽寄存器(INTSUBMSK)的设置来判断该中断是否被屏蔽,如未屏蔽,则在SRCPND寄存器相应位置1。如为非子中断则直接在SRCPND寄存器相应位置1。   如果INTMOD寄存器中该中断被设置为FIQ快速中断(相应位置1),即该中断立即执行。如不是,则判断INTMSK寄存器中该中断是否被屏蔽,如未屏蔽,则进入中断优先仲裁器进行中断优先设置(PRIORITY寄存器)   经过中断优先仲裁后,最高优先级的中断在INTPND寄存器中相应位置1(同一时间,此寄存器只有一位置1),INTOFFSET寄存器值用来表示INTPND寄存器置1位(即INTPND寄存器中位[x]为1时,INTOFFSET寄存器值为x,可以用它确定是什么中断。

    中断过程:

     

    中断设置从上图我们可以看出,要启用一个中断,我们主要设置以下寄存器:1、        INTMOD设置是否为快速中断(一个系统中只能有一个快速中断,默认没有快速中断,如不使用,可以不用设置)2、        INTMSK设置该中断是否被屏蔽3、        PRIORITY设置该中断的优先级如为子中断源,还需设置4、INTSUBMSK设置子中断源是否被屏蔽如果外接中断,还需设置以下寄存器:5、        GPXCON设置相应引脚为中断输入6、        EINTMASK设置外部中断输入使能7、        EXTINT0-EXTINT2设置外部引脚输入中断电平信号类型其中,为外部中断输入时,EINTPEND寄存器用于保存是否有中断发生。EINTMASK 、EINTPEND寄存器[3-0]位保留取值为0中断信号清除清除中断时在EINTPEND、 INTPND、SUBSRCPND及SRCPND寄存器该位写入1令此位为0,写入0效果。其清除过程为EINTPEND、SUBSRCPND、SRCPND 、INTPND,否则,将导致无限次中断。中断向量及处理程序当IRQ中断发生时,CPU自动切换到中断模式,并将返回地址、CPSR寄存器保存到中断模式下的对应寄存器中,并跳转到Ox00000018处执行,在该地址处一般安排一条跳转指令B  XXX(32M范围)或ldr pc,xxx(4G范围)指令,需要注意的事,在此处不能用BL指令,这是因为该指令将引起LR寄存器的变化,导致中断结束后不能跳回原程序。在中断程序中,一般先计算返回地址和保存相关寄存器.中断向量:           b Start        nop        nop        nop        nop        nop        b IRQ_Handle        ;中断处理程序        nopStart        ldr        r0,=WTCON       ;watch dog disable        ldr        r1,=0x0        str        r1,[r0]中断处理程序IRQ_Handle        sub lr,lr,#4           ;计算返回地址        stmfd sp!,{r0-r12,lr}                bl   xxx                   ;调用中断处理程序                 ldmfd sp!,{r0-r12,pc}^ ;恢复程序环境,并返回CPSR寄存器的值1、        中断检测程序硬件说明:K1(EINT1)接GPF1 K2(EINT4)接GPF4 K3(EINT2)接GPF2K4(EINT0)接GPF0                   GPFCON每两位控制一个端口,其中00为输入端,01为输出端,取值11保留,10为中断输入    软件说明:GPF0-GPF2、GPF4设置为中断输入端0b1000101010=0x22a主要程序说明:1、设置中断相关寄存器           ldr r0,=GPFCON     ;设置GPF0-GPF2/GPF4为中断输入        ldr r1,=0x22a        str r1,[r0]                ldr r0,=GPFUP               ldr r1,=0xff        str r1,[r0]                ldr r0,=EINTMASK   ;使GPF0-GPF2/GPF4为中断输入有效        ldr r1,=0xffffffef         str r1,[r0]                ldr r0,=EXTINT0     ;设置中断电平信号类型        ldr r1,=0x2022        str r1,[r0]                ldr r0,=PRIORITY   ;确定优先级        ldr r1,=0x7e        str r1,[r0]                ldr r0,=INTMSK     ;开启中断        ldr r1,=0xffffffe8        str r1,[r0]此时中断尚未开启,我们需用指令msr cpsr_c,#0x5f 清除CPSR寄存器I位,开启中断,使中断使能2、        清除中断   ldr r0,=EINTPEND    cmp r1,#4    streq r3,[r0]        ldr r0,=SRCPND    str r3,[r0]    ldr r0,=INTPND    str r3,[r0]因为EINTPEND寄存器[0-3]保留为0,故当EINT4发生时,才需要清除EINTPEND寄存器。注意寄存器清除顺序不能错。

    最新回复(0)