S5PV210外部中断

  • 210里面有很多种中断有内部中断有外部中断。
  • 什么是内部中断和外部中断?
  • SoC支持的中断类型中有一类叫外部中断。内部中断就是指的中断源来自SoC内部(一般是内部外设),譬如串口、定时器等部件产生的中断;外部中断是SoC外部的设备,通过外部中断对应的GPIO引脚产生的中断。(区别就是中断源一个在内部,一个在外部)。

关键性的寄存器:EXT_CON, EXT_PEND, EXT_MASK.
EXT_CON:配制外部中断的触发方式。(例如高低电平触发,上下沿触发等方式。)
EXT_PEND寄存器是中断挂起寄存器。当发生了中断后,硬件会自动将这个寄存器中该中断对应的位置1.我们处理完这个中断后就会置0
EXT_MASK寄存器就是各个外部中断的使能、禁止开关

电平触发特点:只要电平满足条件就会不停触发中断。(对于按键来说一般就是按着的那个过程。)
边沿触发特点:边沿触发不关心你原本的电平是搞还是低,只关心变化是从高到低还是从低到高的这个过程。(对于按键来说就是按下去的那一瞬间)

#define EXT_INT_0_CON 0XE0200E00
#define EXT_INT_2_CON 0XE0200E08
#define EXT_INT_0_PEND 0XE0200F40
#define EXT_INT_2_PEND 0XE0200F48
#define EXT_INT_0_MASK 0XE0200F00
#define EXT_INT_2_MASK  0XE0200F08


#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 keyy_init_interrupt(void)
{
	//1.外部中断对应的GPIO模式
	rGPH0CON |= 0xFF<<8;     //GPH0_2 GPH0_3设置为外部中断模式
	rGPH2CON |= 0xFFFF<<0    //GPH2_0123共4个引脚设置为外部中断模式    
	
	//2.中断触发模式设置
	rEXT_INIT_0_CON &= ~(0XFF<<8);   //bit8~bie15全部清零
	rEXT_INIT_0_CON |= ((2<<8)|(2<<12));   //EXT_INT2和EXT_INT3设置为下降沿触发

	rEXT_INIT_2_CON &= ~(0XFFFF<<0);   //bit0~bie15全部清零
	rEXT_INIT_2_CON |= ((2<<0)|(2<<4)|(2<<8)|(2<<12));   //EXT_INT20123设置为下降沿触发
	// 3.中断允许、清挂起
	rEXT_INT_0_MASK &= ~(3<<2);
	rEXT_INT_2_MASK &= ~(0X0F<<0);
	
	rEXT_INT_0_PEND |= (3<<2);
	rEXT_INT_2_PEND |= (0X0F<<0);
}

//EINT2通道对应的按键,就是GPH0_2引脚对应的按键。
void isr_eint2(void)
{
	//真正的isr应该做2件事情。
	//第一,中断处理代码,就是真正干活的代码
	printf("isr_eint2_leaft.\n");
	//第二,清除中断挂起
	rEXT_INT_0_PEND |= (1<<2);
}

欢迎关注我的公众号和我的知识星球。

S5PV210外部中断_第1张图片 S5PV210外部中断_第2张图片

你可能感兴趣的:(嵌入式,soc)