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);
}