茶叶flash网站,安卓软件下载平台,展览网站制作,墨子学院网站建设vip课程一、中断执行的流程
soc中断的执行流程
1、中断源发生中断请求
2、CPU检查该中断是否被屏蔽#xff0c;以及总中断是否被屏蔽
3、考察中断优先级
4、保护现场
5、执行中断服务函数
6、恢复现场
二、中断初始化
1、设置中断模式#xff08;INTMOD#xff09;寄存器(…一、中断执行的流程
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;
}