(4.2)uboot详解——外部中断(GPIO)
由ARM 处理器的芯片原理图,可以看出除了一些特殊的外接功能引脚外,GPIO引脚占了绝大部分。GPIO是General Purpose Input Output (通用输入/输出),外设都是连接到这些引脚上面的,所以可以简单的说,我们想让一个处理器实现什么样的功能,直接依赖于对GPIO寄存器的操作。关于GPIO的操作,有机会在介绍,这里主要分析外部中断。
从datasheet里可以看到,一部分GPIO引脚可以设置成不同的功能,比如输入功能,输出功能和中断功能等,如下图,GPFx引脚可以设置成不同的工作模式,比如要将GPF3设置成中断模式,只需要将GPFCON的[7:6]设置为b10:
对于s3c2440处理器一共支持24个外部中断源,如下图,EINT0~23都是外部中断,EINT4~7和EINT8~23是复合中断,其他的都是单一中断
下面还是用s3c2440的中断处理总概图来分析:
上图中,内部中断部分我们已经分析过了,现在主要分析红色框内部的部分——外部中断处理过程
在处理外部中断请求前,需要确认一些前提条件:
1.外设的中断线有没有连接到cpu的GPIO中断引脚,比如我们要实现一个按键中断,那么要先确认该按键是否有连接到cpu的EINT0~EINT3中的一个引脚上, 现在我们假设该按键连接在EINT2引脚上
2.查看芯片原理图,可以知道EINT2引脚其实就是GPF2 GPIO管脚,那么只要配置GPFCON的对应位为中断模式就可以了,比如要将GPF2引脚设置成中断引脚,则需要将GPFCON的第[5:4]两位设置成10就可以了
3.设置引脚工作模式后,需要设置该引脚的触发方式,比如有上升沿触发,下降沿触发,高电平触发和低电平触发,比如这里设置为下降沿触发,只需要将EXTINT0寄存器的[10:8]位设置为000就可以了
4.查看datasheet可以知道,EINT0~7是没有控制滤波时钟和滤波宽度的,但是EINT8~23是可以设置控制滤波时钟和滤波宽度的,当然可以通过选择打开或者关闭这个功能
当开启了滤波功能时候,就可以过滤一些不规则波形(毛刺)的影响了,可以让外设的中断信号更准确的被识别,比如按键连接在能够滤波的外部中断引脚,就可以通过滤波来防抖了,而不用在软件里面设置,下图是对某个中断滤波时钟和滤波宽度的设置,
5. 到这一步,准备工作就差不多了,我们回到第一张图红色框框住的部分,经过外部中断产生器以后,如果是单一中断源,则直接设置SRCPND寄存器的相应中断位为1,然后继续后面的过程(这个过程在前面一篇文章中讲过);
如果是复合中断源,将经过EINTPND(子外部中断暂存寄存器)和EINMASK(屏蔽子外部中断寄存器)的判断后,决定是否将该中断信号送到SRCPND,如果EINMASK没有屏蔽该信号,则直接设置SRCPND寄存器的相应中断位为1,然后继续后面的过程(这个过程在前面一篇文章中讲过)。
6. 信号到达SRCPND寄存器以后,就继续后面的步骤了。
这篇文章介绍的内容相对简单,下面就列举一个中断屏蔽的例子。
这里先明确一个认识,中断的关闭和中断的屏蔽概念是不一样的,中断的关闭是指将CPSR中的 I F位设置为1,中断的屏蔽是将屏蔽寄存器里面的中断屏蔽位置1, 所以往往在一些网络文章里(比如讲解uboot start.S文件的时候),将中断屏蔽操作说成中断关闭操作是不准确的。
mov r0, #0xffffffff ldr r1, =INTMSK str r1, [r0] @屏蔽所有中断 ldr r1,0x3ff ldr r0,=INTSUBMSK str r1, [r0] @屏蔽内部子中断
因为外部中断在板子刚上电的时候,GPIO管脚的默认状态是输出状态,所以没有设置GPIO管脚为中断模式的时候是没有外部中断的,这里不需要屏蔽。
总结:这篇文章介绍了外部中断的是一些配置,虽然内容比较简单,但是我们在编程上还是操作外部中断会比较多,外接模块的中断请求都需要外部中断来处理,所以掌握好外部中断是很重要的。
下一篇文章讲介绍异常向量相关的内容。