×
单片机 > 单片机程序设计 > 详情

ARM笔记:外部按键中断程序

发布时间:2020-06-19 发布时间:
|

.extern    main
.text
.global    _start
_start:
    
    b    Reset


HandleUndef:
    b    HandleUndef


HandleSWI:    
    b    HandleSWI


HandlePrefetchAbort:
    b    HandlePrefetchAbort


HandleDataAbort:
    b    HandleDataAbort


HandleNotUsed:
    b    HandleNotUsed


    b    HandleIRQ


HandleFIQ:    
    b    HandleFIQ

Reset:
    ldr    sp,=4096        
    bl    disable_watch_dog    
    
    msr    cpsr_c,#0xd2        
    ldr    sp,=3072        
    
    msr    cpsr_c,#0xd3        
    ldr    sp,=4096        
                    
    bl    init_led        
    bl    init_irq        
    msr    cpsr_c,#0x5f        
    
    ldr    lr,=halt_loop        
    ldr    pc,=main        
halt_loop:
    b    halt_loop

HandleIRQ:    
    sub    lr,lr,#4        
    stmdb    sp!,{r0-r12,lr}        
    
    ldr    lr,=int_return        
    ldr    pc,=EINT_Handle        

int_return:
    ldmia    sp!,{r0-r12,pc}^    



#include "s3c2440.h"


#define GPF4_OUT    (1<#define    GPF5_OUT    (1<#define GPF6_OUT    (1<
#define GPF4_MSK    (3<#define GPF5_MSK    (3<#define GPF6_MSK    (3<

#define GPF0_EINT    (0x2<#define GPF2_EINT    (0x2<#define GPG3_EINT    (0x2<#define GPG11_EINT    (0X2<
#define GPF0_MSK    (3<#define GPF2_MSK    (3<#define GPG3_MSK    (3<#define GPG11_MSK    (3<

void disable_watch_dog(void)
{
    WATCH_DOG=0;    //置0,关闭WATCH
}


void init_led(void)
{
    GPFCON&=~(GPF4_MSK|GPF5_MSK|GPF6_MSK);
    GPFCON|=GPF4_OUT|GPF5_OUT|GPF6_OUT;
}



void init_irq(void)
{
    //GPIO设置为中断引脚
    GPFCON&=~(GPF0_MSK|GPF2_MSK);
    GPFCON|=GPF0_EINT|GPF2_EINT;
   
    GPGCON&=~(GPG3_MSK|GPG11_MSK);
    GPGCON|=GPG3_EINT|GPG11_EINT;
    //EINT8~23要使能
    //使能EINT11,EINTMASK11置0 
    EINTMASK&=(~(1<<11))&(~(1<<19));
   
    PRIORITY=(PRIORITY&((~0x01)|(0x3<<7))|0x0<<7);
   
    //EINT0 、EINT2、EINT8_23使能
    INTMSK&=(~(1<<0))&(~(1<<2))&(~(1<<5));
}


#include "s3c2440.h"

void EINT_Handle(void)
{
    unsigned long oft=INTOFFSET;
    unsigned long val;
   
    switch(oft)
    {
        //S2被按下
        case 0:
        {
            GPFDAT|=(0x7<<4);
            GPFDAT&=~(1<<4);
            break;
        }
        //S3被按下
        case 2:
        {
            GPFDAT|=(0x7<<4);
            GPFDAT&=~(1<<5);
            break;
        }
        //S4被按下
        case 5:
        {
            GPFDAT|=(0x7<<4);    //所有LED为0

            //寄存器为5即位【5】为1时,EINT8~EINT23中至少有一个中断发生呢个,需进读取EINTPEND寄存器判断
            val=EINTPEND;
            if(val&(1<<19))
            {
                GPFDAT|=(0x7<<4);
                GPFDAT&=~(1<<6);   
            }
            if(val&(1<<11))
            {
                GPFDAT|=(0X7<<4);
                GPFDAT&=~((1<<4)|(1<<5)|(1<<6));
            }
            break;
        }
        default:
            break;
    }

    //清除中断
    if(oft==5)
        EINTPEND=(1<<11)|(1<<19);
    SRCPND=1<    INTPND=1<}

int main()
{
    while(1);
    return 0;
}

关键字:ARM笔记  外部按键  中断程序 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式