S3C2440中断
一、中断执行的流程
soc中断的执行流程
1、中断源发生中断请求
2、CPU检查该中断是否被屏蔽,以及总中断是否被屏蔽
3、考察中断优先级
4、保护现场
5、执行中断服务函数
6、恢复现场
二、中断初始化
1、设置中断模式(INTMOD)寄存器(设置中断处于那种状态)
此寄存器由32位组成,其每一位都都涉及一个中断源。如果某个指定为被设置为1,则在FIQ(快中断)模式 中处理相应中断。否则则在IRQ模式中处理。
2、设置中断屏蔽(INTMSK)寄存器(打开中断源)
此寄存器由32位组成,其每一位都都涉及一个中断源。如果某个指定为被设置为1,则CPU不会去服务来自 相应中断源(请注意即使在这种情况中,SRCPND寄存器的相应位也设置为1)的中断请求。如果屏蔽位为0,则 可以服务中断请求。
3、设置对应的中断源的触发方式以及工作方式
GPG等寄存器,使其工作在中断模式下
EXTINTn(外部中断控制寄存器n)设置中断触发方式
8个外部中断可以由多种信号触发方式所请求。EXTINT寄存器为外部中断配制信号触发方式为电平触发或边 沿触发,同时还配制信号触发极性。
4、将内部的具体的中断屏蔽位进行置位EINTMASK(外部中断屏蔽寄存器)
0 = 使能中断 1 = 禁止中断
三、中断执行
1、执行中断服务程序完之后恢复
EINTPEND(外部中断挂起寄存器),记录了有没有该中断源发生中断,所以一旦中断进行响应,我们需要立刻将其置1清零此位(具体哪一位中断进行响应)
中断挂起(INTPND)寄存器 中断挂起寄存器中32位的每一位都表明了是否相应未屏蔽并且正在等待中断服务的中断请求具有最高的优先 级。当INTPND寄存器在优先级逻辑后被定位了,只有1位可以设置为1并且产生中断请求IRQ给CPU。IRQ的 中断服务程序中可以读取此寄存器来决定服务32个中断源的哪个源。
SRCPND寄存器由32位组成,其每一位都涉及一个中断源。如果中断源产生了中断则相应的位被设置为1并 且等待中断服务。因此此寄存器指示出是哪个中断源正在等待请求服务。注意SRCPND寄存器的每一位都是由中 断源自动置位,其不顾INTMASK寄存器中的屏蔽位。另外SRCPND寄存器不受中断控制器的优先级逻辑的影响。 在指定中断源的中断服务程序中,必须通过清除SRCPND寄存器的相应位来正确的获得来自相同源的中断请 求。如果从ISR中返回并且未清除相应位,则中断控制器的操作就好像其它中断请求已经从同一个源进入了。换句 话说,如果SRCPND寄存器的指定位被设置为1,其通常被认作一个有效中断请求正在等待服务。 清除相应位的时间依赖于用户的需要。如果希望收到来自相同冤源的其它有效请求,则应该首先清除相应位, 并且接着使能中断。 可以通过写入一个数据到此寄存器来清除SRCPND寄存器的指定位。其只清除那些数据中被设置为1的相应 位置的SRCPND位。那些数据中被设置为0的相应位置的位保持不变。
注意
要先进行清SRCPND,否则会一直进行中断响应
中断偏移(INTOFFSET)寄存器 中断偏移寄存器中的值表明了是哪个IRQ模式的中断请求在INTPND寄存器中。此位可以通过清楚SRCPND 和INTPND自动清除。(通过查改位置可以判断是那个中断进行响应)
四、例子
//初始化
void init_key(void)
{unsigned int t;INTMOD &= ~(1 << 5); INTMSK &= ~(1 << 5);t = GPGCON;t &= ~((3 << 0)|(3 << 3) | (3 << 5));t |= (2 << 0) | (2 << 6) | (2 << 10);GPGCON = t;t = EXTINT1;t &= ~((0x0F << 0)| (0x0F << 8) | (0x0F << 16));t |= (1 << 3) | (1 << 11) | (1 << 13);t |= (2 << 0) | (2 << 12) | (2 << 20);EXTINT1 = t;EINTMASK &= ~((1 << 8)| (1 << 11) | (1 << 13));}
//函数的执行
void irq_handler(void)
{if(INTOFFSET == 5){if((EINTPEND & (1 << 8)) != 0){led_on(4);}else if((EINTPEND & (1 << 11)) != 0){beep_on();}else if((EINTPEND & (1 << 13)) != 0){beep_off();}EINTPEND = EINTPEND;}SRCPND = SRCPND ;INTPND = INTPND;
}