×
单片机 > 单片机程序设计 > 详情

基于S3C6410的ARM11学习(十六) 外部中断

发布时间:2022-08-18 发布时间:
|

中断的过程如下:


中断源检测中断信号产生,然后将中断信号发送给中断控制器,中断控制器判断该中断是否被屏蔽,从而决定该中断信号是否要发送给CPU。中断信号发送给CPU后,CPU对中断进行处理,也就是调用中断函数。


上述过程,基本上是嵌入式的通过中断处理过程,只是不同的嵌入式在这三部分配置有区别而已。


S3C6410共有64个中断源。


上图是S3C6410的中断控制器,这里就关心红色框部分。这两个是中断控制器,分别管理各自的32个中断。


这里,就截取了一部分的图。总共有64个中断,每个中断有自己的标号,以及自己的所属组,也是属于哪个中断控制器控制。标号是指在对应的中断控制器寄存器的哪一位或者是哪一个寄存器对应自己。如INT_EINT0,这个是外部中断0,属于VIC0,标号是0。说明VIC0的寄存器的第0位或者是第0个寄存器对应外部中断0这个中断。






本章,是关心外部中断的部分。S3C6410共有127个外部中断,其I0引脚及分组如下:


S3C6410将外部中断分成了10组。每一组有相应的管脚。对于外部中断组0,可以使用GPN0-GPN15这16个管脚。


除了分组,还对组分配了中断号:



属于外部中断组0的27个中断占用了VIC里的4个中断号,分别是外部中断0-3,外部中断4-11,外部中断12-19,外部中断20-27。外部中断组1-9只占用了1个中断号。


为了节约中断,不可能为每个外部管脚都分配一个中断号,所以就会把某几个外部中断给合并成一个中断号。例如,对于外部中断0-3,就合并成了一个中断号,INT_EINT0。当这4个中断有任意一个产生中断时,INT_EINT0会挂起,CPU就会知道产生了外部中断0-3中断,然后去执行中断处理,在中断服务程序中,为了知道具体是哪一个中断,还需要去查询寄存器以知道是哪一个中断产生。


S3C6410中断处理有向量模式和非向量方式。因为要与之前的ARM系列兼容,所以保存了非向量方式。非向量方式,就是当中断产生时,都跳转到中断异常去,然后这个中断异常中,编写程序,判断是哪一个中断产生,然后去执行对应的中断处理程序。但是在非向量模式中,提前设定每个中断对应的入口地址,这样当中断产生的时候,就不用跳转到中断异常去了,直接跳转到对应的中断程序去了。这样中断处理的效率就提高了。


在我的设计中,使用的就是中断向量方式。推荐用中断向量方式。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式