s5pv210中断编程笔记

10、外部中断
    1、什么是外部中断?寄存器手册,2.2.60   外部中断寄存器控制
    2、外部中断关键寄存器
        CON,PEND,MASK
        EXT_CON: 配置外部中断的触发方式
        EXT_PEND; 中断挂起寄存器,这个寄存器的每一位对应一个外部中断,PEND寄存器就是一个标志,如果发生中断但来不及处理,这个位就一直为1,直到处理完毕,才会手工共清除挂起位。
        分析下x210开发板对应外部中断的编号:
            EINT2 EINT3 EINT16 EINT17 EINT18 EINT19
        EXT_MASK :外部中断的使能和禁止开关
11、中断方式处理按键编程实战1
    1、中断方式处理按键编程
        1、外部中断对应的GPIO模式设置
        #define GPH0DAT 0xE020_0C04
        #define GPH0CON 0xE020_0C00
        
        #define GPH2DAT 0xE020_0C44
        #define GPH2CON 0xE020_0C40
        #define EXT_INT_0_CON 0xE020_0E00
        #define EXT_INT_2_CON 0xE020_0E08
        
        #define EXT_INT_0_PEND 0xE020_0F40
        #define EXT_INT_2_PEND 0xE020_0F48
        
        #define EXT_INT_0_MASK 0xE020_0F00
        #define EXT_INT_2_MASK 0xE020_0F08
        
        #define rGPH0DAT (*(volatile unsigned int *)GPH0DAT)
        #define rGPH0CON (*(volatile unsigned int *)GPH0CON)
        #define rGPH2DAT (*(volatile unsigned int *)GPH2DAT)
        #define rGPH2CON (*(volatile unsigned int *)GPH2CON)
        #define rEXT_INT_0_CON (*(volatile unsigned int *)EXT_INT_0_CON)
        #define rEXT_INT_2_CON (*(volatile unsigned int *)EXT_INT_2_CON)
        #define rEXT_INT_0_PEND (*(volatile unsigned int *)EXT_INT_0_PEND)
        #define rEXT_INT_2_PEND (*(volatile unsigned int *)EXT_INT_2_PEND)
        #define rEXT_INT_0_MASK (*(volatile unsigned int *)EXT_INT_0_MASK)
        #define rEXT_INT_2_MASK (*(volatile unsigned int *)EXT_INT_2_MASK)
        
        void key_init_interrupt(void)
        {
            rGPH0CON |= 0xFF<<8;
            rGPH2CON |= 0xFFFF<<0;
            
            //2、中断触发模式设置,下降沿触发
            rEXT_INT_0_CON &= ~(0xFF<<8);
            rEXT_INT_0_CON |= ((2<<8)|(2<<12));
            
            //3、中断允许,清挂起
            rEXT_INT_0_MASK &= ~(3<<2);
            rEXT_INT_2_MASK &= ~(0x0f<<0);
            
            //4、清挂起,清楚是写1,不是写0
            rEXT_INT_0_PEND |= (3<<2);
            rEXT_INT_2_PEND |= (0x0F<<0);
        }
        
        // EINT2 通道对应的按键,就是GPH0_2引脚对应的按键
        void isr_eint2(void)
        {
            // 1、中断处理代码
            printf("isr_eint2_left.\n");
            
            // 2、清除中断挂起
            
            rEXT_INT_0_PEND |= (1<<2);
        
        }
        
            void isr_eint3(void)
        {
            // 1、中断处理代码
            printf("isr_eint3_left.\n");
            
            // 2、清除中断挂起
            
            rEXT_INT_0_PEND |= (1<<3);
        
        }
        
            void isr_eint16171819(void)
        {
            // 1、中断处理代码
            // 因为EINT16-31是共享中断,所以要在这里区分是哪一个中断
            printf("isr_eint2_left.\n");
            if ( rEXT_INT_2_PEND & (1<<0))
            {
                print("eint16.\n");
            }
            if ( rEXT_INT_2_PEND & (1<<1))
            {
                print("eint17.\n");
            }
            if ( rEXT_INT_2_PEND & (1<<2))
            {
                print("eint18.\n");
            }
            if ( rEXT_INT_2_PEND & (1<<3))
            {
                print("eint19.\n");
            }
            // 2、清除中断挂起
            
            rEXT_INT_2_PEND |= (0x0f<<0);
        
        }
        
        #define  KEY_EINT2 NUM_EINT2
        #define  KEY_EINT3 NUM_EINT3
        #define  KEY_EINT16_19 NUM_EINT16_31
        
        int main(void)
        {
        
            key_init_interrupt();
            system_init_exception();
            
            intc_setvectaddr(KEY_EINT2, isr_eint2);
            intc_setvectaddr(KEY_EINT3, isr_eint3);
            intc_setvectaddr(KEY_EINT16_19, isr_eint16171819);
            //使能中断
            intc_enable(KEY_EINT2);
            intc_enable(KEY_EINT3);
            intc_enable(KEY_EINT16_19);

        }

你可能感兴趣的:(s5pv210中断编程笔记)